MQL5

Régularité de la courbe d'équité (R² comme critère)

Mesure la linéarité de la courbe d'équité par le coefficient de détermination R² calculé sur les profits cumulés des deals — une équité en ligne droite vaut mieux qu'un même profit en dents de scie.

Cas d'usage

Sélectionner en optimisation les paramètres au comportement régulier, signature d'un edge stable.

Prérequis

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
}

Résultat

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

Snippets liés

Retour au Data Lab