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