Im using ninjatrader 8 SampleOnOrderUpdate code and trying to add more than one Target and Stoploss.. Here is my code that doesnt work. Only one entry and exit gets traded. "MyEntry" is ok. But " MyEntry1" is not working. Would you be so kind and point me to the right direction. Thanks
namespace NinjaTrader.NinjaScript.Strategies
{
public class MULTIORDERS : Strategy
{
private Order entryOrder = null;
private Order entryOrder2 = null;
private Order stopOrder = null;
private Order stopOrder2 = null;
private Order targetOrder = null;
private Order targetOrder2 = null;
private int sumFilled = 0;
private RSI RSI1;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Sample Using OnOrderUpdate() and OnExecution() methods to submit protective orders";
Name = "MULTIORDERS";
Calculate = Calculate.OnBarClose;
EntriesPerDirection = 1;
EntryHandling = EntryHandling.AllEntries;
IsExitOnSessionCloseStrategy = true;
ExitOnSessionCloseSeconds = 30;
IsFillLimitOnTouch = false;
MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
OrderFillResolution = OrderFillResolution.Standard;
Slippage = 0;
StartBehavior = StartBehavior.WaitUntilFlat;
TimeInForce = TimeInForce.Gtc;
TraceOrders = false;
RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
StopTargetHandling = StopTargetHandling.ByStrategyPosition;
BarsRequiredToTrade = 20;
///
IsInstantiatedOnEachOptimizationIteration = true;
}
else if (State == State.Configure)
{
}
else if (State == State.DataLoaded)
{
RSI1 = RSI(Close, 14, 3);
}
else if (State == State.Realtime)
{
if (entryOrder != null)
entryOrder = GetRealtimeOrder(entryOrder);
if (entryOrder2 != null)
entryOrder2 = GetRealtimeOrder(entryOrder2);
if (stopOrder != null)
stopOrder = GetRealtimeOrder(stopOrder);
if (stopOrder2 != null)
stopOrder2 = GetRealtimeOrder(stopOrder2);
if (targetOrder != null)
targetOrder = GetRealtimeOrder(targetOrder);
if (targetOrder2 != null)
targetOrder2 = GetRealtimeOrder(targetOrder2);
}
}
protected override void OnBarUpdate()
{
if ((CrossAbove(RSI1.Default, RSI1.Avg, 1))
&&(entryOrder == null && Position.MarketPosition == MarketPosition.Flat && CurrentBar > BarsRequiredToTrade))
{
EnterLong(1, "MyEntry");
EnterLong(1, "MyEntry1");
}
}
protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error, string nativeError)
{
if (order.Name == "MyEntry")
{
entryOrder = order;
if (order.OrderState == OrderState.Cancelled && order.Filled == 0)
{
entryOrder = null;
sumFilled = 0;
}
}
if (order.Name == "MyEntry1")
{
entryOrder2 = order;
if (order.OrderState == OrderState.Cancelled && order.Filled == 0)
{
entryOrder2 = null;
sumFilled = 0;
}
}
}
protected override void OnExecutionUpdate(Execution execution, string executionId, double price, int quantity, MarketPosition marketPosition, string orderId, DateTime time)
{
if (entryOrder != null && entryOrder == execution.Order)
{
if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled || (execution.Order.OrderState == OrderState.Cancelled && execution.Order.Filled > 0))
{
sumFilled += execution.Quantity;
if (execution.Order.OrderState == OrderState.PartFilled)
{
stopOrder = ExitLongStopMarket(0, true, execution.Order.Filled, execution.Order.AverageFillPrice - 400 * TickSize, "MyStop", "MyEntry");
targetOrder = ExitLongLimit(0, true, execution.Order.Filled, execution.Order.AverageFillPrice + 800 * TickSize, "MyTarget", "MyEntry");
}
else if (execution.Order.OrderState == OrderState.Filled && sumFilled == execution.Order.Filled)
{
stopOrder = ExitLongStopMarket(0, true, execution.Order.Filled, execution.Order.AverageFillPrice - 400 * TickSize, "MyStop", "MyEntry");
targetOrder = ExitLongLimit(0, true, execution.Order.Filled, execution.Order.AverageFillPrice + 800 * TickSize, "MyTarget", "MyEntry");
}
if (execution.Order.OrderState != OrderState.PartFilled && sumFilled == execution.Order.Filled)
{
entryOrder = null;
sumFilled = 0;
}
}
}
if (entryOrder2 != null && entryOrder2 == execution.Order)
{
if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled || (execution.Order.OrderState == OrderState.Cancelled && execution.Order.Filled > 0))
{
sumFilled += execution.Quantity;
if (execution.Order.OrderState == OrderState.PartFilled)
{
stopOrder2 = ExitLongStopMarket(0, true, execution.Order.Filled, execution.Order.AverageFillPrice - 400 * TickSize, "MyStop1", "MyEntry1");
targetOrder2 = ExitLongLimit(0, true, execution.Order.Filled, execution.Order.AverageFillPrice + 800 * TickSize, "MyTarget1", "MyEntry1");
}
else if (execution.Order.OrderState == OrderState.Filled && sumFilled == execution.Order.Filled)
{
stopOrder2 = ExitLongStopMarket(0, true, execution.Order.Filled, execution.Order.AverageFillPrice - 400 * TickSize, "MyStop1", "MyEntry1");
targetOrder2 = ExitLongLimit(0, true, execution.Order.Filled, execution.Order.AverageFillPrice + 800 * TickSize, "MyTarget1", "MyEntry1");
}
if (execution.Order.OrderState != OrderState.PartFilled && sumFilled == execution.Order.Filled)
{
entryOrder2 = null;
sumFilled = 0;
}
}
}
if ((stopOrder != null && stopOrder == execution.Order) || (targetOrder != null && targetOrder == execution.Order))
{
if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled)
{
stopOrder = null;
targetOrder = null;
}
}
if ((stopOrder2 != null && stopOrder2 == execution.Order) || (targetOrder2 != null && targetOrder2 == execution.Order))
{
if (execution.Order.OrderState == OrderState.Filled || execution.Order.OrderState == OrderState.PartFilled)
{
stopOrder2 = null;
targetOrder2 = null;
}
}
}
}
}
Comment