I encounter wrong results in strategy analyzer.
The results look at first glance as the same value for buy and sell, but in cum net profit on trade level they are different, the sell should be -3596.32
Please provide a solution idea for this behaviour.
Result buy in trades
Result sell:
Here the code:
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.Gui.Tools;
using NinjaTrader.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.Indicators;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
//This namespace holds Strategies in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Strategies
{
public class SZATRTimeWindowStrategy : Strategy
{
private NinjaTrader.NinjaScript.Indicators.SZVWAP SZVWAP1;
private ATR atr;
private bool tradedToday = false;
region Parameters
[NinjaScriptProperty]
[Range(0, 23)]
[Display(Name = "Start Hour", Order = 1)]
public int StartHour { get; set; }
[NinjaScriptProperty]
[Range(0, 59)]
[Display(Name = "Start Minute", Order = 2)]
public int StartMinute { get; set; }
[NinjaScriptProperty]
[Range(0, 23)]
[Display(Name = "End Hour", Order = 3)]
public int EndHour { get; set; }
[NinjaScriptProperty]
[Range(0, 59)]
[Display(Name = "End Minute", Order = 4)]
public int EndMinute { get; set; }
[NinjaScriptProperty]
[Range(0, 600)]
[Display(Name = "Trade Minute Index (ab Startzeit)", Order = 5)]
public int TradeMinuteIndex { get; set; }
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name = "ATR Periode", Order = 6)]
public int ATRPeriod { get; set; }
[NinjaScriptProperty]
[Display(Name = "Trade Richtung", Order = 7)]
public TradeDirection Direction { get; set; }
#endregion
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Handel in bestimmter Minute mit ATR-basiertem SL/TP.";
Name = "SZATRTimeWindowStrategy";
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.PerEntryExecution;
BarsRequiredToTrade = 20;
IsInstantiatedOnEachOptimizationIteration = true;
StartHour = 9;
StartMinute = 30;
EndHour = 16;
EndMinute = 0;
TradeMinuteIndex = 0;
ATRPeriod = 14;
Direction = TradeDirection.Buy;
}
else if (State == State.Configure)
{
AddDataSeries(Data.BarsPeriodType.Minute, 1);
}
else if (State == State.DataLoaded)
{
SZVWAP1 = SZVWAP(9, 30);
atr = ATR(ATRPeriod);
}
}
protected override void OnBarUpdate()
{
if (BarsInProgress != 0 || CurrentBar < ATRPeriod)
return;
DateTime today = Times[0][0].Date;
DateTime startTime = today.AddHours(StartHour).AddMinutes(StartMinute);
DateTime endTime = today.AddHours(EndHour).AddMinutes(EndMinute);
DateTime targetTradeTime = startTime.AddMinutes(TradeMinuteIndex);
if (Bars.IsFirstBarOfSession)
tradedToday = false;
if (Times[0][0] < startTime || Times[0][0] > endTime)
return;
if (!tradedToday && Times[0][0] == targetTradeTime)
{
double atrValue = atr[0];
double entryPrice = Close[0];
if (Direction == TradeDirection.Buy && Close[0] >= SZVWAP1.PlotVWAP[0])
{
EnterLong("MinBuy");
SetStopLoss("MinBuy", CalculationMode.Price, entryPrice - atrValue, false);
SetProfitTarget("MinBuy", CalculationMode.Price, entryPrice + atrValue);
}
else if (Direction == TradeDirection.Sell && Close[0] <= SZVWAP1.PlotVWAP[0])
{
EnterShort("MinSell");
SetStopLoss("MinSell", CalculationMode.Price, entryPrice + atrValue, false);
SetProfitTarget("MinSell", CalculationMode.Price, entryPrice - atrValue);
}
tradedToday = true;
}
}
public enum TradeDirection
{
Buy,
Sell
}
}
}

Comment