I did write PerformanceMetrics to calculate maxEvalDD (Eval Prop Funding program way of calculating MaxDD).
I added a printout to verify my calculations are correct and learned 2 unexplained facts:
- During the run of the Strategy Analyzer BackTesting, the Custom PerformanceMetrics is called 4 times for each trade. Why?
- The entire point of the PerformanceMetrics is to aggregate values. However, for unexplained reasons, the Values are reset on the 3rd trade (#2). Why?
A hwmProfit=0.00, evalDD=0.00, cumProfit=0.00, maxEvalDD=0.00
B hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
Time=05/29 14:30:38 857, Trade#=0, TradeTime=05/26 10:27:08 752
A hwmProfit=0.00, evalDD=0.00, cumProfit=0.00, maxEvalDD=0.00
B hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
Time=05/29 14:30:38 857, Trade#=0, TradeTime=05/26 10:27:08 752
A hwmProfit=0.00, evalDD=0.00, cumProfit=0.00, maxEvalDD=0.00
B hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
Time=05/29 14:30:38 857, Trade#=0, TradeTime=05/26 10:27:08 752
A hwmProfit=0.00, evalDD=0.00, cumProfit=0.00, maxEvalDD=0.00
B hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
Time=05/29 14:30:38 857, Trade#=1, TradeTime=05/26 13:28:02 256
A hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
Time=05/29 14:30:38 857, Trade#=1, TradeTime=05/26 13:28:02 256
A hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
Time=05/29 14:30:38 857, Trade#=1, TradeTime=05/26 13:28:02 256
A hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
Time=05/29 14:30:38 857, Trade#=1, TradeTime=05/26 13:28:02 256
A hwmProfit=1040.00, evalDD=-1215.00, cumProfit=601.02, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
Time=05/29 14:30:38 858, Trade#=2, TradeTime=05/26 14:39:12 084
A hwmProfit=0.00, evalDD=0.00, cumProfit=0.00, maxEvalDD=0.00
B hwmProfit=295.00, evalDD=-425.00, cumProfit=-133.98, maxEvalDD=-425.00
Time=05/29 14:30:38 858, Trade#=2, TradeTime=05/26 14:39:12 084
A hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-518.98, cumProfit=863.06, maxEvalDD=-1215.00
Time=05/29 14:30:38 858, Trade#=2, TradeTime=05/26 14:39:12 084
A hwmProfit=0.00, evalDD=0.00, cumProfit=0.00, maxEvalDD=0.00
B hwmProfit=295.00, evalDD=-425.00, cumProfit=-133.98, maxEvalDD=-425.00
Time=05/29 14:30:38 858, Trade#=2, TradeTime=05/26 14:39:12 084
A hwmProfit=0.00, evalDD=0.00, cumProfit=0.00, maxEvalDD=0.00
B hwmProfit=295.00, evalDD=-425.00, cumProfit=-133.98, maxEvalDD=-425.00
Time=05/29 14:30:38 879, Trade#=3, TradeTime=05/26 15:13:32 936
A hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-388.98, cumProfit=1258.06, maxEvalDD=-1215.00
Time=05/29 14:30:38 879, Trade#=3, TradeTime=05/26 15:13:32 936
A hwmProfit=1386.02, evalDD=-518.98, cumProfit=863.06, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-522.96, cumProfit=1124.08, maxEvalDD=-1215.00
Time=05/29 14:30:38 879, Trade#=3, TradeTime=05/26 15:13:32 936
A hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-388.98, cumProfit=1258.06, maxEvalDD=-1215.00
Time=05/29 14:30:38 879, Trade#=3, TradeTime=05/26 15:13:32 936
A hwmProfit=1386.02, evalDD=-995.00, cumProfit=997.04, maxEvalDD=-1215.00
B hwmProfit=1386.02, evalDD=-388.98, cumProfit=1258.06, maxEvalDD=-1215.00
protected override void OnAddTrade(Cbi.Trade trade)
{
if (denomination == (Cbi.Currency) (-1))
denomination = trade.Exit.Account.Denomination;
double hwmProfit = Values[(int)Cbi.PerformanceUnit.Percent];
double evalDD = Values[(int)Cbi.PerformanceUnit.Points];
double cumProfit = Values[(int)Cbi.PerformanceUnit.Pips];
double maxEvalDD = Values[(int)Cbi.PerformanceUnit.Currency];
Print("Time="+DateTime.Now.ToString("MM/dd HH:mm:ss fff")+", Trade#="+trade.TradeNumber+", TradeTime="+trade.Entry.Time.ToString("MM/dd HH:mm:ss fff"));
Print("A hwmProfit="+hwmProfit.ToString("0.00")
+", evalDD="+evalDD.ToString("0.00")+", cumProfit="+cumProfit.ToString("0.00")+", maxEvalDD="+maxEvalDD.ToString("0.00"));
hwmProfit = Math.Max(hwmProfit, cumProfit+trade.MfeCurrency);
evalDD = cumProfit-(trade.MaeCurrency+hwmProfit);
cumProfit += trade.ProfitCurrency;
maxEvalDD = Math.Min(maxEvalDD, evalDD);
Values[(int)Cbi.PerformanceUnit.Percent] = hwmProfit;
Values[(int)Cbi.PerformanceUnit.Points] = evalDD;
Values[(int)Cbi.PerformanceUnit.Pips] = cumProfit;
Values[(int)Cbi.PerformanceUnit.Currency] = maxEvalDD;
//Values[(int)Cbi.PerformanceUnit.Ticks] += trade.ProfitTicks;
Print("B hwmProfit="+hwmProfit.ToString("0.00")
+", evalDD="+evalDD.ToString("0.00")+", cumProfit="+cumProfit.ToString("0.00")+", maxEvalDD="+maxEvalDD.ToString("0.00"));
}

Comment