MACD Zone Cross H1 — candidate production
Variante candidate du MACD cross classique (cf. macd-cross.md)
appliquée à EUR/USD H1 avec un filtre de zone d'extension : un cross MACD/signal
n'est valide que si le MACD est déjà du bon côté de zéro. SL/TP ATR-based pour
adapter à la volatilité.
🛑🛑 STATUT au 2026-05-12 : REJETÉ OOS — pas d'EA livré. Backtest 6 ans 4 mois Dukascopy : 923 trades, expectancy IS +0.005 R et OOS +0.011 R (dans le bruit, ≈ random walk), max DD OOS −27.4 R (au-delà du gate < 20 R). 2/4 gates échouent. Verdict détaillé :
mt5/AUDIT_2026-05-12_macd_zone_cross.md.Différence avec les 3 rejets précédents (BCMR, RSI Learn, Alligator Learn) : l'expectancy OOS n'est pas franchement négative mais dans le bruit. Asymétrie LONG/SHORT révélée : LONG OOS +0.042 R (hit 33.8%), SHORT OOS −0.018 R. Pas d'edge exploitable cependant.
Aucun EA MQL5 livré. La fiche reste comme référence méthodologique + point de départ pour d'éventuelles variantes v2 (multi-TF, magnitude filter, LONG only, trailing stop). Chaque variante = nouveau cycle complet.
🛑 STATUT ORIGINEL : CANDIDATE — backtest gate à passer avant tout EA. Cette fiche décrit une stratégie candidate au registry Hermes V2+ (hors scope V1.5 strict qui fixe 4 stratégies actives). Aucune ligne d'EA MQL5 ne sera écrite avant que le backtest Dukascopy 2020-2026 passe les 4 gates OOS : expectancy ≥ +0.20 R, max DD < 20 R, n ≥ 30 trades, ratio OOS/IS ≥ 0.6. Si rejet → archivage comme BCMR (script de backtest conservé, EA non livré).
Méthodologie stricte (cf. KANBAN root, anti-patterns) : pas de tuning post-hoc. Les paramètres ci-dessous sont fixés AVANT le backtest selon les standards documentés (MACD 12/26/9 = Gerald Appel 1979). Toute variation nécessite une justification ex-ante et un commit sous nouveau nom (v2).
Pourquoi H1 et pas M15
Les 3 stratégies M15 testées en mai 2026 (BCMR, RSI Learn, Alligator Learn) ont toutes échoué OOS sur Dukascopy 6 ans. Diagnostic commun :
- Coûts (spread + commission ~1 pip EUR/USD IC Markets Raw Spread) consomment 0.06-0.10 R sur des SL de 15 pips → mange tout edge marginal
- Bruit M15 = faux signaux fréquents en range, hit-rate sous break-even
- RR=2.0 fixe inadapté aux régimes de volatilité variables
H1 mitige ces 3 points :
- SL ATR-based ~30-50 pips → coût relatif ~0.02 R par trade (3× moindre)
- Bars H1 = 4× moins de signaux mais qualité par signal plus haute
- Aligné avec LonBO #12 (déjà validé OOS) qui tourne aussi en H1
Mécanique
Indicateur unique : MACD(12, 26, 9) sur close H1
macd_line = EMA(12, close) - EMA(26, close)
signal_line = EMA(9, macd_line)
histogram = macd_line - signal_line [informatif, non utilisé]
Notation : tout évalué au close du bar i=1 (dernier bar H1 fermé).
1. Détection du cross (entre i=2 et i=1) :
- LONG cross : macd(i=2) ≤ signal(i=2) AND macd(i=1) > signal(i=1)
- SHORT cross : macd(i=2) ≥ signal(i=2) AND macd(i=1) < signal(i=1)
2. Filtre zone d'extension (cœur de la variante) :
- LONG valide ssi macd(i=1) > 0
- SHORT valide ssi macd(i=1) < 0
Le cross en zone neutre (proche de zéro) est rejeté — typiquement piège
de range où MACD oscille des deux côtés sans direction installée.
3. Filtre coût :
- Skip si spread courant > MaxSpreadPoints (30 = 3 pips sur 5-digit)
4. Stop / Take Profit ATR-based :
- Calcul ATR(14) H1 au bar i=1
- SL = entry ± SLATRMult × ATR (1.5 × ATR par défaut)
- TP = entry ± TPATRMult × ATR (3.0 × ATR par défaut)
- RR théorique fixe = TPATRMult / SLATRMult = 2.0
5. Entry = close du bar i=1 (au moment où le cross est confirmé)
6. Cooldown 4 heures (= 4 bars H1) post-signal, toutes directions
confondues. Évite l'overshoot après un cross qui retournerait.
7. Pas de filtre session ni news en v1 — si l'edge est conditionnel, on
le verra dans la décomposition par heure UTC du backtest.
Pourquoi le filtre MACD vs 0
Le cross MACD/signal seul est le défaut classique : très fréquent (~10-20/jour H1), majorité de faux signaux dans les phases de consolidation. Le filtre zone d'extension réduit drastiquement la fréquence en ne gardant que les crosses dans le sens du momentum installé :
MACD > 0⇔EMA(12) > EMA(26)⇔ tendance court-terme haussière- Un cross vers le haut dans ce contexte = continuation, pas reversal
- Un cross vers le haut quand MACD < 0 (donc EMA(12) < EMA(26)) = potentielle fin de baisse, mais signal plus faible et plus prone aux faux retours
C'est l'équivalent moderne du "trade with the trend" appliqué à MACD.
Pourquoi SL/TP ATR-based
Leçon Alligator Learn 2026-05-12 : RR=2.0 avec SL=15 pips fixe sur M15 EUR/USD = 27.9% hit rate OOS (sous break-even 33.3%). Causes :
- En volatilité haute, 15 pips se fait taper sur du bruit normal
- En volatilité basse, 30 pips de TP rarement atteint
ATR adapte mécaniquement :
- Haute vol (ATR=80 pips) → SL=120, TP=240 → trades larges, peu mais nets
- Basse vol (ATR=20 pips) → SL=30, TP=60 → trades serrés mais réalistes
Le RR théorique reste 2.0 partout, c'est la distance absolue qui varie avec le contexte de marché.
Paramètres baseline
| Paramètre | Valeur | Justification |
|---|---|---|
MACDFast |
12 | Gerald Appel 1979, standard universel |
MACDSlow |
26 | Idem |
MACDSignal |
9 | Idem |
ATRPeriod |
14 | Wilder standard |
SLATRMult |
1.5 | ~1 ATR au-dessus du noise typique H1 |
TPATRMult |
3.0 | RR théorique 2.0 |
MaxSpreadPoints |
30 | 3 pips 5-digit (aligné LonBO) |
CooldownHours |
4 | 4 bars H1 entre signaux |
MagicNumber |
70707070 | Identifiant EA (TBD si livraison) |
Aucune optimisation post-backtest. Si l'edge n'apparaît pas avec ces paramètres standards, le marché ne récompense pas MACD cross zone-filtered sur EUR/USD H1 — pas qu'il faut "ajuster".
Fréquence attendue
- ~24 bars H1 par jour ouvré
- Cross MACD/signal sans filtre : ~3-5/jour (~10-15% des bars)
- Avec filtre zone d'extension : ~1-3 signaux/jour
- Avec cooldown 4h : plafond à 6 signaux/jour
- Réaliste : 5-15 signaux/semaine
Sur 6 ans 4 mois (2020-01 → 2026-05) ≈ 1600 jours ouvrés, on attend ~1500-2500
signaux pré-cooldown. Largement au-dessus du gate n ≥ 30 trades OOS.
Gates OOS (méthodologie BCMR, non négociables)
| # | Gate | Cible | Action si raté |
|---|---|---|---|
| 1 | OOS expectancy ≥ +0.20 R / trade | edge réel après random walk + frais | rejet définitif |
| 2 | OOS max DD < 20 R | gestion risque acceptable | rejet (~10% capital à 0.5%/trade) |
| 3 | OOS n ≥ 30 trades | significativité statistique | rejet (sample trop petit) |
| 4 | Ratio OOS/IS expectancy ≥ 0.6 | robustesse / pas d'effondrement OOS | rejet (sur-fit IS) |
Découpage IS/OOS : 2020-01-01 → 2023-12-31 = IS (4 ans), 2024-01-01 → 2026-05-11 = OOS (~2.4 ans), soit ~70/30.
Performance attendue (à confirmer)
| Métrique | Cible | Acceptable | Rejet |
|---|---|---|---|
| Hit rate à RR=2.0 | ≥ 38% | ≥ 33.3% (BE) | < 30% |
| Expectancy R | ≥ +0.30 | ≥ +0.20 | < +0.10 |
| Profit factor | ≥ 1.4 | ≥ 1.2 | < 1.0 |
| Max DD OOS | < 12 R | < 20 R | ≥ 25 R |
Pièges connus
1. Cross au sortir d'une consolidation (faux breakout MACD)
Quand le marché consolide longtemps, MACD oscille autour de zéro. Un cross
avec MACD juste légèrement positif (genre +0.00001) déclenche un LONG juste
avant un retournement. Le filtre MACD > 0 est strict mais la magnitude
n'est pas pondérée — cross "frais" reste vulnérable.
Mitigation possible v2 : exiger |MACD| > k × ATR pour confirmer la
zone d'extension. Pas en v1 pour éviter le tuning.
2. News rouge dans 30-60 min
Aucun filtre news. SL ATR-based atténue (45 pips au lieu de 15 fixe) mais ne résout pas. Si MACD passe le gate, l'EA déployé bénéficiera du filtre news_blackout standard d'Hermes (cf. KANBAN root Phase H1).
3. Régime change (cf. Alligator finding 2026-05-12)
Le backtest 2020-2026 couvre plusieurs régimes (COVID, inflation, hausse de taux, normalisation). Si l'expectancy s'effondre OOS versus IS, même symptôme que Alligator. La méthodologie ne récompense pas une stratégie qui ne survit pas à un régime change → rejet.
4. Bias direction (long vs short)
MACD cross long peut différer fortement de cross short selon le contexte EUR/USD (tendance baissière ou haussière dominante). Décompo par direction obligatoire dans le backtest.
Variantes envisagées (non implémentées en v1)
| Variante | Modification | Rationale |
|---|---|---|
| Magnitude filter | ` | MACD |
| Histogram acceleration | Cross + histogram qui s'écarte | Confirme momentum |
| Multi-TF | H1 cross + H4 MACD>0 (LONG) | Cross-TF confirmation |
| Filtre session London | 07-16 UTC | Volatilité EUR/USD max |
| Trailing stop | TP devient trailing après +1×ATR | Capture trends longs |
| Filtre news rouge ±60 min | Skip si news majeure | Évite spread spike |
Toutes attendent que la baseline passe le gate avant d'être considérées.
Couplage piliers A↔B↔C (CLAUDE.md root)
| Pilier | Fichier |
|---|---|
| A (docs) | docs/strategies/momentum/macd-zone-cross.md (cette fiche) |
| C (spec) | mt5/tests/test_macd_zone_cross_spec.py |
| B (R&D) | hermes/scripts/backtest_macd_zone_cross.py |
| C (EA) | mt5/MACD_Zone_Cross_v1.mq5 + includes — uniquement si gates OOS verts |
Pas d'EA tant que le backtest n'a pas validé l'edge.
Liens
- Fiche descriptive parent :
macd-cross.md(général MACD) - Famille :
index.md(momentum) - Spec exécutable :
mt5/tests/test_macd_zone_cross_spec.py - Backtest R&D :
hermes/scripts/backtest_macd_zone_cross.py - Audit (post-backtest) :
mt5/AUDIT_<date>_macd_zone_cross.md