MQL5

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 CurveOnTesterRobustesse

Related snippets

Back to the Data Lab