You are on page 1of 1

//https://forum.amibroker.

com/t/using-custom-backtest-to-find-min-max-mae-mfe-per-
loosing-winning-trades/15376/2

SetCustomBacktestProc("");
if (Status("action") == actionPortfolio) {

bo = GetBacktesterObject();
bo.Backtest();

wi = li = 0;
csMAE_wi = csMFE_wi = csMAE_li = csMFE_li = 0;
Min_MAE_wi = Min_MFE_wi = Min_MAE_li = Min_MFE_li = 1e9;
Max_MAE_wi = Max_MFE_wi = Max_MAE_li = Max_MFE_li = -1e9;
for (trade=bo.GetFirstTrade(); trade; trade=bo.GetNextTrade()) {
MAE = trade.GetMAE();
MFE = trade.GetMFE();
if (trade.GetPercentProfit() > 0) {
Min_MAE_wi = Min(Min_MAE_wi, MAE);
Min_MFE_wi = Min(Min_MFE_wi, MFE);
Max_MAE_wi = Max(Max_MAE_wi, MAE);
Max_MFE_wi = Max(Max_MFE_wi, MFE);
csMAE_wi += trade.GetMAE();
csMFE_wi += trade.GetMFE();
wi++;
} else {
Min_MAE_li = Min(Min_MAE_li, MAE);
Min_MFE_li = Min(Min_MFE_li, MFE);
Max_MAE_li = Max(Max_MAE_li, MAE);
Max_MFE_li = Max(Max_MFE_li, MFE);
csMAE_li += MAE;
csMFE_li += MFE;
li++;
}
}

bo.AddCustomMetric("#Winning", wi);
bo.AddCustomMetric("#Losing", li);
bo.AddCustomMetric("");
// Winning ones
bo.AddCustomMetric("Min Winning MAE", Min_MAE_wi);
bo.AddCustomMetric("Max Winning MAE", Max_MAE_wi);
bo.AddCustomMetric("Min Winning MFE", Min_MFE_wi);
bo.AddCustomMetric("Max Winning MFE", Max_MFE_wi);
bo.AddCustomMetric("");
bo.AddCustomMetric("Mean Winning MAE", csMAE_wi/wi);
bo.AddCustomMetric("Mean Winning MFE", csMFE_wi/wi);
bo.AddCustomMetric("");
// Losing ones
bo.AddCustomMetric("Min Loosing MAE", Min_MAE_li);
bo.AddCustomMetric("Max Loosing MAE", Max_MAE_li);
bo.AddCustomMetric("Min Loosing MFE", Min_MFE_li);
bo.AddCustomMetric("Max Loosing MFE", Max_MFE_li);
bo.AddCustomMetric("");
bo.AddCustomMetric("Mean Loosing MAE", csMAE_li/li);
bo.AddCustomMetric("Mean Loosing MFE", csMFE_li/li);
}

You might also like