I´ve tried to implement the e-ratio (edge ratio) in Zorro. Basically it compares the MFE to the MAE for your trades, and calculates the ratio between them.
A more detailed description can be found here at the Build Alpha site:https://www.buildalpha.com/eratio/
I typically run it in the EXITRUN like this
if(is(EXITRUN)) {
var cumMfeNorm = 0;
var cumMaeNorm = 0;
string CurrentAlgo = Algo;
for(all_trades) {
if(strstr(TradeAlgo,CurrentAlgo)) {
cumMfeNorm += TradeMFE/TradeVar[0];
cumMaeNorm += TradeMAE/TradeVar[0];
}
}
var averageMfeNorm = cumMfeNorm/(NumWinLong+NumLossLong);
var averageMaeNorm = cumMaeNorm/(NumWinLong+NumLossLong);
var eratio = averageMfeNorm/averageMaeNorm;
printf("nE-ratio for %s is %.3f%",Algo, eratio);
}
As you can see a TradeVar is used which holds the ATR, so you also need to setup a TMF that records the ATR when the trade is closed
int recordAtr()
{
if(TradeIsClosed) { // trade is closing?
TradeVar[0] = ATR(20);
}
return 0;
}
You can also put the calculation in an objective function and "optimize" over LifeTime to get a feeling for how the eratio changes with the length of your trades:
var objective() {
var cumMfeNorm = 0;
var cumMaeNorm = 0;
string CurrentAlgo = Algo;
for(all_trades) {
if(strstr(TradeAlgo,CurrentAlgo)) {
cumMfeNorm += TradeMFE/TradeVar[0];
cumMaeNorm += TradeMAE/TradeVar[0];
}
}
var averageMfeNorm = cumMfeNorm/(NumWinLong+NumLossLong);
var averageMaeNorm = cumMaeNorm/(NumWinLong+NumLossLong);
var eratio = averageMfeNorm/averageMaeNorm;
return eratio;
}
You could probably implement something along the lines of plotPriceProfile() as well, but I haven't looked into that.
Happy to hear comments and suggestions for improvement!