namespace NinjaTrader.NinjaScript.Strategies { public class UA653GC60 : Strategy { private NinjaTrader.NinjaScript.Indicators.Features.MichaelsFunction MF; private bool StartTimeInv; private Series<int> MP; private int daysintrade; private Order LongOrder = null; private Order ShortOrder = null; private bool LongSignal, ShortSignal; protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Enter the description for your new custom Strategy here."; Name = "UA653GC60"; 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 = true; RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose; StopTargetHandling = StopTargetHandling.PerEntryExecution; BarsRequiredToTrade = 20; // Disable this property for performance gains in Strategy Analyzer optimizations // See the Help Guide for additional information IsInstantiatedOnEachOptimizationIteration = true; SessionStartTime = DateTime.Parse("19:00", System.Globalization.CultureInfo.InvariantCulture); SessionEndTime = DateTime.Parse("17:00", System.Globalization.CultureInfo.InvariantCulture); MyStartTime = DateTime.Parse("10:00", System.Globalization.CultureInfo.InvariantCulture); MyEndTime = DateTime.Parse("16:00", System.Globalization.CultureInfo.InvariantCulture); TE_Day_close = 5; Quantity = 1; ProfitTarget = 2300; StopLoss = 2200; } else if (State == State.Configure) { AddDataSeries(this.Instrument.FullName, BarsPeriodType.Day, 1); SetProfitTarget(@"Long1", CalculationMode.Currency, ProfitTarget); SetStopLoss(@"Long1", CalculationMode.Currency, StopLoss, false); SetProfitTarget(@"Short1", CalculationMode.Currency, ProfitTarget); SetStopLoss(@"Short1", CalculationMode.Currency, StopLoss, false); } else if (State == State.DataLoaded) { MF = MichaelsFunction(SessionStartTime, SessionEndTime, false); MP = new Series<int>(this); AddChartIndicator(MichaelsFunction(SessionStartTime, SessionEndTime, false)); } } protected override void OnBarUpdate() { if (BarsInProgress != 0) return; if (CurrentBars[1] < 2) return; MP[0] = Position.MarketPosition == MarketPosition.Long ? 1 : Position.MarketPosition == MarketPosition.Short ? -1 : 0; if (ToTime(MyStartTime) > ToTime(MyEndTime)) StartTimeInv = ToTime(Time[0]) > ToTime(MyStartTime) || ToTime(Time[0]) < ToTime(MyEndTime); else if (ToTime(MyStartTime) < ToTime(MyEndTime)) StartTimeInv = (ToTime(Time[0]) > ToTime(MyStartTime) && ToTime(Time[0]) < ToTime(MyEndTime)); //Long if (LongOrder == null && !LongSignal && MF.highd0[0] > (Lows[1][0] + (Highs[1][0] - Lows[1][0]) * 0.5) && StartTimeInv && MP[0] != 1) { LongSignal = true; Draw.TriangleDown(this, "Long1" + CurrentBar, true, 0, Low[0]-1, Brushes.Green); EnterLongStopMarket(0, true, Quantity, MF.highd0[0], "Long1"); } //Short if (!ShortSignal && MF.lowd0[0] < (Highs[1][0] - (Highs[1][0] - Lows[1][0]) * 0.5) && StartTimeInv && MP[0] != -1) { ShortSignal = true; Draw.TriangleUp(this, "Short1" + CurrentBar, true, 0, High[0] + 1, Brushes.Red); EnterShortStopMarket(0, true, Quantity, MF.lowd0[0], "Short1"); } //Exit based on days if (MP[0] != MP[1] && MP[0] != 0) daysintrade = 1; if (ToTime(Time[1]) < ToTime(MyEndTime) && ToTime(Time[0]) >= ToTime(MyEndTime) && MP[0] != 0) daysintrade = daysintrade + 1; if (MP[0] == 1 && daysintrade >= TE_Day_close && TE_Day_close > 0 && ToTime(Time[0]) >= 1600) ExitLong(0, Quantity, "ExitLong1", "Long1"); if (MP[0] == -1 && daysintrade >= TE_Day_close && TE_Day_close > 0 && ToTime(Time[0]) >= 1600) ExitShort(0, Quantity, "ExitShort1", "Short1"); if (LongOrder != null && Position.MarketPosition != MarketPosition.Long && ToTime(Time[0]) >= ToTime(MyEndTime)) CancelOrder(LongOrder); if (ShortOrder != null && Position.MarketPosition != MarketPosition.Short && ToTime(Time[0]) >= ToTime(MyEndTime)) CancelOrder(ShortOrder); if (ToTime(Time[0]) >= ToTime(MyEndTime)) { LongSignal = false; ShortSignal = false; } Print(ShortSignal + " " + Time[0]); } 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 == "Long1") { LongOrder = order; if (order.OrderState == OrderState.Cancelled && order.Filled == 0) LongOrder = null; if (order.OrderState == OrderState.Filled) LongOrder = null; } if(order.Name == "Short1") { ShortOrder = order; if (order.OrderState == OrderState.Cancelled && order.Filled == 0) ShortOrder = null; if (order.OrderState == OrderState.Filled) ShortOrder = null; } }
This should have entered Short. Why did it not enter?
Comment