Announcement

Collapse
No announcement yet.

Partner 728x90

Collapse

Multiple Position when using OnEachTick Strategy

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Multiple Position when using OnEachTick Strategy

    Hi,
    I am using a simple strategy and would like it to run on each tick
    the problem is that when there is a position enter signal and the position filled, the strategy continue sending position enter signal although i check :
    if (Position.MarketPosition != MarketPosition.Flat || _pendingPosition == true)

    Here is the simplified code, can you see any problems in the design/code ?
    Code:
    namespace NinjaTrader.NinjaScript.Strategies
    {
    public class Test : Strategy
    {
    private const string EnterShortName = "Open Short";
    private const string ProfitShort = "Profit Short";
    private const string StopShort = "Stop Short";
    
    private bool _pendingPosition;
    private bool _enterShort;
    private double _stopPrice;
    private double _profitPrice;
    
    
    protected override void OnBarUpdate()
    {
    _enterShort = false;
    
    if (Position.MarketPosition != MarketPosition.Flat || _pendingPosition == true)
    return;
    
    _enterShort = SomeCondition...
    
    if (_enterShort)
    {
    _stopPrice = Close[0] + (8 * TickSize);
    EnterShortLimit(1, Close[0] - TickSize, EnterShortName);
    }
    }
    
    protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error, string comment)
    {
    _pendingPosition = orderState == OrderState.Accepted || orderState == OrderState.Working || orderState == OrderState.Submitted;
    }
    
    protected override void OnExecutionUpdate(Execution execution, string executionId, double price, int quantity, MarketPosition marketPosition, string orderId, DateTime time)
    {
    if (execution.Order.OrderState == OrderState.Filled)
    {
    if (exec.Order.Name == EnterShortName)
    SetStopProfit(execution);
    }
    }
    
    private void SetStopProfit(Execution execution)
    {
    double entryPrice = execution.Order.AverageFillPrice;
    
    if (Position.MarketPosition == MarketPosition.Short)
    {
    _profitPrice = entryPrice - (TickSize * 6);
    
    ExitShortStopMarket(0, true, 1, _stopPrice, StopShort, EnterShortName);
    ExitShortLimit(0, true, 1, _profitPrice, ProfitShort, EnterShortName);
    }
    }
    
    }
    }
    Click image for larger version

Name:	Capture.JPG
Views:	159
Size:	100.8 KB
ID:	1163027
    Thanks

    #2
    Hello yaniv,

    The position takes time to change. When it does it will trigger OnPositionUpdate.

    You can use logic to control when orders are submitted. You could assign the order to a variable and only allow new orders when the variable is null.

    Below is a link to an example.


    You could also use a bool that is changed to true after the order is placed and then changed back to false when IsFirstTickOfBar is true.
    Chelsea B.NinjaTrader Customer Service

    Comment

    Latest Posts

    Collapse

    Topics Statistics Last Post
    Started by CarlTrading, 03-31-2026, 09:41 PM
    1 response
    43 views
    0 likes
    Last Post NinjaTrader_ChelseaB  
    Started by CarlTrading, 04-01-2026, 02:41 AM
    0 responses
    20 views
    0 likes
    Last Post CarlTrading  
    Started by CaptainJack, 03-31-2026, 11:44 PM
    0 responses
    30 views
    1 like
    Last Post CaptainJack  
    Started by CarlTrading, 03-30-2026, 11:51 AM
    0 responses
    48 views
    0 likes
    Last Post CarlTrading  
    Started by CarlTrading, 03-30-2026, 11:48 AM
    0 responses
    38 views
    0 likes
    Last Post CarlTrading  
    Working...
    X