VWAP Pullback H1 — retest du VWAP London en tendance NY
Stratégie trend-following candidate ancrée sur la session VWAP. Anchor à 08:00 UTC (London open), évaluation tendance à 11:00 UTC, entry sur pullback à VWAP pendant la fenêtre NY 12-16 UTC. Conçue comme miroir trend-following de LonBO #12 (qui est breakout) : même contrainte temporelle forte, niveau de référence structurel différent (VWAP vs Asian range).
🛑🛑 STATUT au 2026-05-12 : REJETÉ OOS — pas d'EA livré. Backtest 8 ans 4 mois Dukascopy : 1091 trades, expectancy IS −0.002 R / OOS −0.104 R (clairement sous gate +0.20), hit rate 10.1% (très sous BE 33.3%), max DD OOS −36.9 R (au-dessus gate 20). 3/4 gates échouent. Verdict détaillé :
mt5/AUDIT_2026-05-12_vwap_pullback.md.Particularité : edge disparu post-2019. Seule année positive sur 9 (2019 +0.118 R), puis 7 années consécutives négatives. Décomposition par heure trigger révèle 12h OOS catastrophique (−0.266 R, sur-arbitré) mais 15-16h marginalement positifs (+0.19, +0.14, sample petit). Variante "v2 trigger 15-16h only" = cherry-picking post-hoc, refusée par méthodologie.
Aucun EA MQL5 livré. La fiche reste comme référence méthodologique + point de départ pour d'éventuelles variantes v2 (fenêtre 15-16h ex ante, filtre slope magnitude, anchor 00:00 UTC). 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 2018-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 les 5 précédentes (script de backtest conservé, EA non livré).
Caveat forex : VWAP utilise le tick volume Dukascopy (nombre de ticks par bar), pas du volume réel — le forex étant OTC décentralisé n'a pas de volume consolidé. Tick volume est un proxy reconnu (corrélation ~0.7-0.9 avec volume CME futures sur EUR/USD) mais introduit du bruit. Si la stratégie passe les gates en backtest, validation cross-broker requise avant EA.
Pourquoi VWAP après 5 rejets
Bilan des 5 candidates testées en mai 2026 (toutes rejetées OOS) :
| Strat | TF | Type | Contexte structurel | Verdict |
|---|---|---|---|---|
| BCMR | M5 | Mean-rev | aucun (signal indicateur) | ❌ |
| RSI Learn | M15 | Trend+momentum | aucun | ❌ broken |
| Alligator Learn | M15 | Trend | aucun | ❌ |
| MACD Zone Cross | H1 | Momentum cross | aucun | ❌ |
| NY Reversal | H1 | Reversal session | session NY first H1 | ❌ (gate sous-edge) |
LonBO #12 (seule validée, +0.342 R OOS) repose sur :
- Range Asian (00-07 UTC) comme niveau de référence
- Fenêtre NY overlap (12-17 UTC) comme contrainte temporelle
- 1 trade max/jour
VWAP Pullback applique le même principe avec un niveau de référence dynamique (VWAP session) au lieu d'un range statique (Asian high/low) :
- VWAP anchored 08:00 UTC comme niveau de référence intraday
- Fenêtre NY 12-16 UTC comme contrainte temporelle
- 1 trade max/jour
Différenciation méthodologique vs LonBO :
- LonBO trade le breakout du range Asian
- VWAP Pullback trade la continuation du trend établi via retest VWAP
- Les deux peuvent coexister sans se chevaucher (signaux mutuellement exclusifs dans la majorité des cas) — un breakout d'Asian range implique typiquement un éloignement marqué du VWAP, pas un pullback.
Mécanique
Bars H1 EUR/USD, timestamps UTC, avec colonne tick_volume.
Notation : "bar à HH:00 UTC" = bar qui ouvre à HH:00 et ferme à HH+1:00.
1. Anchored VWAP (reset quotidien à 08:00 UTC) :
- À partir du bar 08:00 UTC, cumul :
typical_price_i = (high_i + low_i + close_i) / 3
cum_pv_i = Σ (typical_price_k × volume_k) pour k ∈ [08:00, i]
cum_vol_i = Σ volume_k pour k ∈ [08:00, i]
VWAP_i = cum_pv_i / cum_vol_i
- Au bar 08:00 lui-même : VWAP_08 = typical_price_08
- VWAP recalculé chaque jour, indépendamment des jours précédents.
2. Évaluation tendance à la clôture du bar 11:00 UTC :
- VWAP_11 = VWAP calculé sur les 4 bars 08, 09, 10, 11
- close_11 = close du bar 11:00
- VWAP_slope = VWAP_11 - VWAP_08 (déviation sur la fenêtre 4 bars)
- Trend UP ssi : close_11 > VWAP_11 AND VWAP_slope > 0
- Trend DOWN ssi : close_11 < VWAP_11 AND VWAP_slope < 0
- Sinon : SKIP (pas de trend clair)
3. Fenêtre entry : bars 12, 13, 14, 15, 16 UTC (5 bars H1 max)
Trigger évalué à la clôture de chacun de ces bars, dans l'ordre.
4. Trigger pullback (trend UP) :
- bar.low ≤ VWAP_at_bar (le prix a tagué le VWAP)
- bar.close > VWAP_at_bar (la bougie a clôturé au-dessus)
- bar.close > bar.open (bougie haussière = continuation)
→ Entry LONG au close du bar trigger
Symétrique pour trend DOWN → Entry SHORT.
Premier trigger valide pris dans la journée. Les suivants ignorés.
5. SL / TP ATR-based :
- ATR(14) au bar trigger
- LONG : SL = entry - 1.5 × ATR, TP = entry + 3.0 × ATR
- SHORT : SL = entry + 1.5 × ATR, TP = entry - 3.0 × ATR
- RR théorique fixe = 2.0
6. Filtre coût (live uniquement) :
- Skip si spread courant > 30 points (3 pips 5-digit, aligné LonBO)
7. Cooldown : 1 trade max / jour calendaire UTC. Si trigger validé à 12h
pour LONG, aucune ré-entry possible à 13h/14h/etc le même jour.
8. Timeout : exit forcé à clôture du bar 21:00 UTC si ni SL ni TP touché.
Pourquoi anchor 08:00 UTC
- 08:00 UTC = London cash open standard. C'est l'événement de session qui initie l'orderflow institutionnel européen.
- Reset quotidien = chaque jour est un signal isolé, pas de drift cumulé multi-jour
- Évite l'arbitraire d'un anchor 00:00 UTC (heure morte, low volume)
- Aligne avec l'horloge des traders pro européens
Pourquoi VWAP_slope = VWAP_11 - VWAP_08
- Mesure simple, non-paramétrique
- Capture la direction du flow institutionnel London sur la fenêtre 4 bars
- Pas de seuil de magnitude — la condition
close_11 vs VWAP_11filtre déjà les VWAP plats
Pourquoi fenêtre entry 12-16 UTC
- 12:00 UTC = transition London→NY (orderflow se déplace côté US)
- 16:00 UTC = London close approximatif, après c'est NY pur
- Bars 12, 13, 14, 15, 16 = 5 chances de trigger pullback
- Évite la zone post-London-close 17-20 UTC où VWAP session devient moins pertinent (anchor trop ancien, divergence locale possible)
Pourquoi trigger = tag + close-back + bullish-bar
3 conditions pour filtrer les faux retests :
- bar.low ≤ VWAP : le prix est vraiment allé chercher le VWAP (pas juste une approche distale)
- bar.close > VWAP : la mèche basse a été rejetée, le bar referme au-dessus = invalidation du pullback
- bar.close > bar.open : bougie de continuation, pas un doji ou un rejet faible
Les trois ensemble = signal de "pullback complete + reprise trend" classique. Conceptuellement proche du "hammer at support" mais avec le VWAP comme support dynamique.
Pourquoi RR=2.0 et pas 2.5 (comme LonBO)
- LonBO breakout : hit rate ~40%, RR 2.5 OK
- VWAP Pullback : trend-continuation à un retest = hit rate attendu 35-45%. RR 2.5 → break-even 28.6% (atteignable mais marge fine)
- RR 2.0 → break-even 33.3% (marge confortable si hit ≥ 40%)
- Cohérent avec NY Reversal (RR 2.0 aussi pour comparaison)
Pourquoi SL/TP en ATR multiples (pas niveaux VWAP)
- Tester une stratégie purement "TP = next VWAP touch" introduit du hindsight bias (où sera le prochain retest ?)
- SL/TP en multiples ATR = simple, falsifiable, comparable aux 5 candidates précédentes (NY Reversal, MACD Zone Cross utilisent aussi ATR-based)
Paramètres baseline
| Paramètre | Valeur | Justification |
|---|---|---|
AnchorUTC |
8 | London cash open |
TrendEvalUTC |
11 | Close du 11:00 bar = 4 bars cumulés |
EntryWindowStartUTC |
12 | Début NY transition |
EntryWindowEndUTC |
16 | Fin fenêtre, avant London close drift |
ATRPeriod |
14 | Wilder standard |
SLATRMult |
1.5 | ~1 ATR au-dessus du noise typique H1 |
TPATRMult |
3.0 | RR théorique 2.0 |
TimeoutH |
21 | Exit forcé 21:00 UTC (mi-NY) |
MaxSpreadPoints |
30 | 3 pips 5-digit (aligné LonBO, live uniquement) |
MagicNumber |
90909090 | Identifiant EA (TBD si livraison) |
Aucune optimisation post-backtest. Si l'edge n'apparaît pas avec ces paramètres, l'hypothèse de "retest VWAP institutionnel sur EUR/USD H1" est invalidée — pas qu'il faut tuner.
Fréquence attendue
- Trend filter (close vs VWAP + slope) qualifie ~50-60% des jours
- Trigger pullback dans 12-16 UTC : ~40-60% des jours qualifiés
- Estimation : ~2-3 signaux / semaine, soit ~100-150 / an
Sur 8 ans 4 mois (2018-01 → 2026-05) ≈ 2100 jours ouvrés, on attend
~800-1300 signaux. 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 : 2018-01-01 → 2023-12-31 = IS (6 ans), 2024-01-01 → 2026-05-11 = OOS (~2.4 ans), soit ~72/28.
Performance attendue (à confirmer)
| Métrique | Cible | Acceptable | Rejet |
|---|---|---|---|
| Hit rate à RR=2.0 | ≥ 42% | ≥ 33.3% (BE) | < 30% |
| Expectancy R | ≥ +0.35 | ≥ +0.20 | < +0.10 |
| Profit factor | ≥ 1.5 | ≥ 1.2 | < 1.0 |
| Max DD OOS | < 12 R | < 20 R | ≥ 25 R |
Conditions favorables
- Trend intraday clair (close 11:00 nettement vs VWAP, slope marqué)
- Liquidité London + NY normale (tick volume non anormal)
- Pas de news rouge majeure 14:30 UTC (NFP, FOMC, CPI) — risque spread spike pendant la fenêtre
- Pas de jour férié US/EU (volume distordu)
Pièges connus
1. Tick volume ≠ volume réel
La principale incertitude méthodologique. Tick volume mesure l'activité (nb de transactions), pas la taille en lots. Corrélation ~0.7-0.9 avec volume CME futures mais variable selon broker. Risque : VWAP calculé sur tick volume ≠ VWAP "vrai" institutionnel → faux niveau de retest.
Mitigation v2 possible : recalcul cross-broker (IC Markets vs Dukascopy) avant promotion EA. Pas en v1.
2. Trend à 11:00 contredit par news 14:30
Le filtre tendance fixe son verdict à 11:00 UTC. À 14:30, une news US (NFP, CPI) peut inverser brutalement le trend. Un trigger pullback à 15:00 ou 16:00 prend alors à contre-trend post-news.
Mitigation v2 possible : skip si news rouge USD pendant la fenêtre 12-17 UTC. Pas en v1 (pas de filtre news).
3. VWAP plat = condition rare mais possible
Si London a été ranging (close_11 ≈ VWAP_11), le filtre rejette. C'est souhaité mais signifie ~40% des jours sont éliminés. Capital cumulé plus faible que LonBO (qui prend tous les jours qualifiés sans filtre tendance).
4. Bias direction (long vs short)
Décompo LONG/SHORT obligatoire dans le backtest. Si l'edge est concentré sur un côté, variante v2 LONG-only ou SHORT-only à tester séparément (comme NY Reversal a révélé SHORT seul a un edge marginal).
5. Conflit avec LonBO
Possible mais peu probable. Un breakout LonBO (close > asian_high) implique typiquement éloignement marqué du VWAP → pas de pullback trigger ce jour. Si conflict en live : priorité à LonBO (validée).
6. Premier trigger pris vs meilleur trigger
On prend le premier pullback valide du jour. Hindsight pourrait suggérer attendre le 2e/3e mais c'est du tuning post-hoc. La règle "premier trigger" est aligned avec LonBO ("premier breakout pris").
7. Volume = 0 ou anomalie
Sur certaines périodes (jours fériés), le tick volume Dukascopy peut être 0 sur des bars. Si cum_vol = 0 → VWAP indéfini → skip ce jour (géré explicitement dans le backtest).
Variantes envisagées (non implémentées en v1)
| Variante | Modification | Rationale |
|---|---|---|
| Anchor 00:00 UTC | VWAP daily standard | Comparaison vs anchor London |
| Anchor 13:00 UTC | VWAP NY only | Si edge London faible |
| Fenêtre 12-20 UTC | Plus large | Plus de chances de trigger |
| Filtre slope magnitude | ` | VWAP_slope |
| Multi-TF D1 align | Skip si D1 contre-trend | Évite contre-trend D1 |
| Trigger sans bullish bar | 2 conditions au lieu de 3 | Plus de trades |
| RR=1.5 ou 2.5 | TP ajusté | Ajustement risk-reward |
| LONG only ou SHORT only | Selon bias EUR/USD | Si décompo asymétrique |
| Filtre news rouge | Skip ±30 min news USD | Évite spike |
Toutes attendent que la baseline passe le gate.
Couplage piliers A↔B↔C (CLAUDE.md root)
| Pilier | Fichier |
|---|---|
| A (docs) | docs/strategies/trend/vwap-pullback.md (cette fiche) |
| C (spec) | mt5/tests/test_vwap_pullback_spec.py |
| B (R&D) | hermes/scripts/backtest_vwap_pullback.py |
| C (EA) | mt5/VWAP_Pullback_v1.mq5 + includes — uniquement si gates OOS verts |
Pas d'EA tant que le backtest n'a pas validé l'edge.
Liens
- Référence méthodologique :
../breakout/london-breakout.md(LonBO #12, miroir conceptuel breakout vs pullback) - Référence reversal :
../mean-reversion/ny-reversal.md(NY Reversal, autre tentative session-aware) - Famille :
index.md(trend) - Spec exécutable :
mt5/tests/test_vwap_pullback_spec.py - Backtest R&D :
hermes/scripts/backtest_vwap_pullback.py - Audit (post-backtest) :
mt5/AUDIT_<date>_vwap_pullback.md