Détection de croisement de moyennes (sans repaint)
Compare les deux dernières valeurs CLÔTURÉES des MA rapide et lente : un croisement validé à la clôture ne se « dé-croise » plus, contrairement à un test sur la bougie en cours.
Cas d'usage
Signal d'entrée classique fiabilisé — l'anti-repaint est ce qui sépare backtest et réel.
Prérequis
MetaTrader 5, MQL5
MQL5
// Handles créés dans OnInit : iMA(.., 9, ..) et iMA(.., 21, ..)
int CrossSignal(int fastHandle, int slowHandle)
{
double fast[], slow[];
ArraySetAsSeries(fast, true);
ArraySetAsSeries(slow, true);
// Index 1 et 2 : uniquement des bougies clôturées
if(CopyBuffer(fastHandle, 0, 1, 2, fast) != 2) return 0;
if(CopyBuffer(slowHandle, 0, 1, 2, slow) != 2) return 0;
bool crossUp = (fast[1] <= slow[1] && fast[0] > slow[0]);
bool crossDown = (fast[1] >= slow[1] && fast[0] < slow[0]);
if(crossUp) return 1;
if(crossDown) return -1;
return 0;
}Résultat
2026.06.10 13:00:00.045 CrossEA (EURUSD,H1) MA9 : 1.08401 -> 1.08422 | MA21 : 1.08418 -> 1.08415 2026.06.10 13:00:00.046 CrossEA (EURUSD,H1) Croisement HAUSSIER validé à la clôture -> signal +1 2026.06.10 14:00:00.039 CrossEA (EURUSD,H1) MA9 1.08440 > MA21 1.08421 (déjà au-dessus) -> signal 0 2026.06.10 14:00:00.040 CrossEA (EURUSD,H1) Index 1-2 only : le signal ne peut plus se « dé-croiser »
MA CrossRepaintSignaliMA