Equity curve smoothness (R² as a criterion)
Measures the linearity of the equity curve via the R² coefficient of determination computed on the cumulative profits of the deals — a straight-line equity beats the same profit in a zigzag.
Prerequisites
MetaTrader 5, Strategy Tester
MQL5
double OnTester()
{
if(!HistorySelect(0, TimeCurrent())) return 0.0;
double equity[]; int n = 0;
double cum = 0.0;
for(uint i = 0; i < HistoryDealsTotal(); i++)
{
ulong t = HistoryDealGetTicket(i);
if(HistoryDealGetInteger(t, DEAL_ENTRY) != DEAL_ENTRY_OUT) continue;
cum += HistoryDealGetDouble(t, DEAL_PROFIT);
ArrayResize(equity, n + 1);
equity[n++] = cum;
}
if(n < 10 || cum <= 0.0) return 0.0;
// Régression linéaire equity = a*i + b, puis R²
double sx = 0, sy = 0, sxy = 0, sxx = 0;
for(int i = 0; i < n; i++)
{ sx += i; sy += equity[i]; sxy += i * equity[i]; sxx += (double)i * i; }
double a = (n * sxy - sx * sy) / (n * sxx - sx * sx);
double b = (sy - a * sx) / n;
double ssRes = 0, ssTot = 0, mean = sy / n;
for(int i = 0; i < n; i++)
{
ssRes += MathPow(equity[i] - (a * i + b), 2);
ssTot += MathPow(equity[i] - mean, 2);
}
double r2 = (ssTot > 0) ? 1.0 - ssRes / ssTot : 0.0;
return r2 * cum; // régularité pondérée par le profit
}Result
2026.06.10 23:55:10.205 Core 2 pass 1571 returned result 1893.42 2026.06.10 23:55:10.206 MyEA (EURUSD,H1) n=112 clôtures, profit cumulé 2104.90 2026.06.10 23:55:10.206 MyEA (EURUSD,H1) Régression : pente a=18.79/deal, R² = 0.8996 2026.06.10 23:55:10.207 MyEA (EURUSD,H1) Score = R² x profit = 1893.42 (équité quasi linéaire) 2026.06.10 23:55:11.480 Core 4 pass 1572 returned result 312.07 (R² 0.41 : dents de scie pénalisées)
Equity CurveR²OnTesterRobustesse