I'm struggling with a problem in my strategy.
I have my strategy set to place a stoploss when my entry order is hit and filled. Problem is, as soon as the bar that hit my entry order closes, the stoploss order gets canceled. I can't figure out why.
Can anybody help me with my coding?
#region Using declarations using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Xml.Serialization; using NinjaTrader.Cbi; using NinjaTrader.Gui; using NinjaTrader.Gui.Chart; using NinjaTrader.Gui.SuperDom; using NinjaTrader.Data; using NinjaTrader.NinjaScript; using NinjaTrader.Core.FloatingPoint; using NinjaTrader.NinjaScript.Indicators; using NinjaTrader.NinjaScript.DrawingTools; #endregion namespace NinjaTrader.NinjaScript.Strategies { public class MyCustomStrategy : Strategy { private Order LongEntryOrder = null; private Order LongTarget1 = null; private Order StoppedOutLong = null; private Order ShortEntryOrder = null; private Order ShortTarget1 = null; private Order StoppedOutShort = null; private int QuantityInput = 1; private int LongTarget1Points = 78; private int MACDFast = 25; private int MACDSlow = 15; private int MACDSmooth = 3; private int KeltnerPeriod = 100; private double KeltnerOffset = 7; protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"TestTest"; Name = "MyCustomStrategy"; Calculate = Calculate.OnBarClose; EntriesPerDirection = 1; EntryHandling = EntryHandling.UniqueEntries; IsExitOnSessionCloseStrategy = false; ExitOnSessionCloseSeconds = 0; IsFillLimitOnTouch = false; MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix; OrderFillResolution = OrderFillResolution.Standard; Slippage = 0; StartBehavior = StartBehavior.AdoptAccountPosition; TimeInForce = TimeInForce.Gtc; TraceOrders = false; RealtimeErrorHandling = RealtimeErrorHandling.IgnoreAllErrors; StopTargetHandling = StopTargetHandling.PerEntryExecution; BarsRequiredToTrade = 0; ConnectionLossHandling = ConnectionLossHandling.KeepRunning; } else if (State == State.Configure) { } } protected override void OnExecutionUpdate(Cbi.Execution execution, string executionId, double price, int quantity, Cbi.MarketPosition marketPosition, string orderId, DateTime time) { if (LongEntryOrder != null && LongEntryOrder == execution.Order) { StoppedOutLong = ExitLongStopMarket(QuantityInput, KeltnerChannel(KeltnerOffset, KeltnerPeriod).Lower[0] - (4 * TickSize)); LongTarget1 = ExitLongLimit(QuantityInput / 2, Position.AveragePrice + (4 * LongTarget1Points * TickSize)); } if (ShortEntryOrder != null && ShortEntryOrder == execution.Order) { StoppedOutShort = ExitShortStopMarket(QuantityInput, KeltnerChannel(KeltnerOffset, KeltnerPeriod).Upper [0] + (4 * TickSize)); ShortTarget1 = ExitShortLimit(QuantityInput / 2, Position.AveragePrice - (4 * LongTarget1Points * TickSize)); } } protected override void OnBarUpdate() { if(Position.MarketPosition == MarketPosition.Flat && MACD(MACDFast, MACDSlow, MACDSmooth)[0] >= 0 && MACD(MACDFast, MACDSlow, MACDSmooth).Diff[0] >= 0) { LongEntryOrder = EnterLongLimit(QuantityInput, KeltnerChannel(KeltnerOffset, KeltnerPeriod).Midline[0] + (1 * TickSize)); } if (Position.MarketPosition == MarketPosition.Long && StoppedOutLong.LimitPrice < (KeltnerChannel(KeltnerOffset, KeltnerPeriod).Lower[0] - (4 * TickSize)) ) { StoppedOutLong = ExitLongStopMarket(QuantityInput, KeltnerChannel(KeltnerOffset, KeltnerPeriod).Lower[0] - (4 * TickSize)); } if (Position.MarketPosition == MarketPosition.Long && Position.Quantity == 2) { LongTarget1 = ExitLongLimit(QuantityInput / 2, Position.AveragePrice + (4 * LongTarget1Points * TickSize)); } if (Position.MarketPosition == MarketPosition.Long && MACD(MACDFast, MACDSlow, MACDSmooth).Diff[0] < 0) { StoppedOutLong = ExitLong(); } if(Position.MarketPosition == MarketPosition.Flat && MACD(MACDFast, MACDSlow, MACDSmooth)[0] < 0 && MACD(MACDFast, MACDSlow, MACDSmooth).Diff[0] < 0) { ShortEntryOrder = EnterShortLimit(QuantityInput, KeltnerChannel(KeltnerOffset, KeltnerPeriod).Midline[0] - (1 * TickSize)); } if (Position.MarketPosition == MarketPosition.Short && StoppedOutShort.LimitPrice > (KeltnerChannel(KeltnerOffset, KeltnerPeriod).Upper[0] + (4 * TickSize)) ) { StoppedOutShort = ExitShortStopMarket(QuantityInput, KeltnerChannel(KeltnerOffset, KeltnerPeriod).Upper[0] + (4 * TickSize)); } if (Position.MarketPosition == MarketPosition.Short && Position.Quantity == 2) { ShortTarget1 = ExitShortLimit(QuantityInput / 2, Position.AveragePrice - (4 * LongTarget1Points * TickSize)); } if (Position.MarketPosition == MarketPosition.Short && MACD(MACDFast, MACDSlow, MACDSmooth).Diff[0] > 0) { StoppedOutShort = ExitShort(); } } } }
Grtz, Dennis
Comment