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