Système de trading multi-stratégies dynamique de rupture, de retrait et d'inversion de la fourchette de prix

FVG 5M 1M R:R RANGE TRADING SCALPING
Date de création: 2025-08-22 09:55:06 Dernière modification: 2025-08-22 09:55:06
Copier: 0 Nombre de clics: 333
2
Suivre
319
Abonnés

Système de trading multi-stratégies dynamique de rupture, de retrait et d’inversion de la fourchette de prix Système de trading multi-stratégies dynamique de rupture, de retrait et d’inversion de la fourchette de prix

Aperçu

La stratégie intègre trois modes d’entrée différents: la rupture d’entrée, la trappe d’entrée et la reprise d’entrée, qui permettent de négocier en identifiant les lacunes de juste valeur (FVG) et les modes de rupture de la zone de prix. La stratégie est axée sur la période de forte volatilité de la première heure après l’ouverture des marchés boursiers américains (09:30-10:30 EST) et exécute des transactions sur un graphique de 1 minute et utilise un taux de rendement de risque de 2:1 pour gérer les gains plutôt que les pertes.

Principe de stratégie

Le principe de base de la stratégie est basé sur le comportement des prix après la formation de la fourchette initiale du matin, qui se déroule en trois étapes:

  1. La zone de marquage est à 9h30:

    • Attendez la première ligne K de 5 minutes après le début du tirage ((9:30-9:35) pour la clôture)
    • Marquez le plus haut et le plus bas de cette ligne K comme zone de transaction
    • Passez à un graphique d’une minute pour effectuer des transactions réelles
  2. Trouver un point d’entrée (une heure seulement après le début de la transaction): La stratégie offre trois types d’accès différents:

    • La série a été diffusée sur les réseaux sociaux.:

      • La nécessité de satisfaire aux conditions de la fourchette de valeur juste (FVG)
      • La zone de rupture de la clôture d’une ligne K dans le FVG
      • Le FVG est défini comme un modèle de saut en forme de trois lignes K (wick-gap)
    • Le jeu de l’entrée de piège:

      • Les prix sont les premiers à franchir les frontières
      • Puis on remonte à l’intérieur de la zone.
      • La zone est à nouveau fermée.
    • Entrée inversée:

      • Le prix après l’échec d’une percée dans une direction
      • Les FVG qui apparaissent en sens inverse retournent à l’intérieur de la zone
  3. Gestion des échanges:

    • Réglages de stop-loss:
      • Stratégie de rupture/piège: utilisez le premier point de clôture sur la ligne K en dehors de la zone pour le plus bas/le plus haut
      • Stratégie inverse: bas/haut de la première ligne K en mode FVG
    • Paramètres de l’arrêt:
      • Le rapport risque/rendement est toujours de 2:1.
      • Le risque est de 100 \( et le profit de 200 \)

Le code de stratégie implémente un cadre logique complet, comprenant la détection automatique des intervalles de négociation, l’identification de diverses conditions d’entrée, la mise en place de niveaux de stop-loss et le calcul de la taille de position appropriée. Le système comprend également un filtre temporel qui garantit que les transactions se déroulent uniquement dans des périodes de temps spécifiques et permet d’activer ou de désactiver sélectivement différentes stratégies d’entrée.

Avantages stratégiques

  1. Des règles simples et claires: les règles de stratégie sont claires et intuitives, ne nécessitent pas de jugement subjectif, réduisent l’influence des émotions sur les décisions de négociation. La logique conditionnelle et le suivi des états dans le code assurent une application stricte des règles.

  2. Flexibilité dans le choix des modes d’admissionLe code est utilisé par les traders qui souhaitent s’adapter aux différents environnements de marché.enableBreakenableTrapetenableReversalLes paramètres permettent cette flexibilité.

  3. Concentrez-vous sur les périodes à forte probabilitéStratégie: négocier uniquement dans la première heure après le début de la période d’ouverture, en profitant de la volatilité et de la liquidité plus élevées qui existent généralement pendant cette période.inWindowLa condition est de s’assurer que les transactions ne sont exécutées qu’entre 9h30 et 10h30.

  4. Une gestion rigoureuse des risques: Ratio de risque/rendement fixe de 2:1 et paramètres de stop loss basés sur des actions de prix spécifiques, offrant un contrôle clair du risque pour chaque transaction.riskPctLes paramètres permettent à l’utilisateur d’ajuster le pourcentage de risque de chaque transaction en fonction de ses propres préférences en matière de risque.

  5. Pas besoin d’indicateurs compliquésLa stratégie ne repose pas sur des indicateurs techniques complexes, mais est basée sur le comportement et la structure purement des prix, ce qui réduit le risque de surajustement.

  6. Évasion saisonnière: Le code intègre une liste noire de vacances ((du 15 décembre au 15 janvier) pour éviter les périodes où le marché est susceptible d’être instable ou peu liquid.

  7. Gestion flexible des positionsLe système offre deux modes de gestion de position basés sur le pourcentage de risque ou le nombre de contrats fixes, adaptés à différents besoins de gestion de fonds.

Risque stratégique

  1. Risque de fausse percéePour atténuer ce risque, la stratégie intègre un modèle de piège et d’entrée en position inversée, mais nécessite une surveillance prudente.

  2. Problème de largeur d’intervalleSi la ligne K est trop large ou trop étroite dans les 5 premières minutes après le démarrage, cela peut affecter l’efficacité de la stratégie. Une distance trop étroite peut entraîner des signaux de déclenchement fréquents, tandis qu’une distance trop large peut entraîner un point d’arrêt trop éloigné.

  3. Coût d’opportunité lié à la duréeLes échanges sur une seule heure peuvent laisser passer des opportunités intéressantes pour les autres périodes de la journée. Cependant, cette restriction est aussi une discipline qui empêche les échanges excessifs.

  4. Limitation du ratio de retour sur risque fixeBien que le rapport risque/rendement de 2:1 offre une cohérence, il peut ne pas être le meilleur choix dans certains environnements de marché. Dans les marchés à forte tendance, un rapport risque/rendement plus élevé peut être plus approprié.

  5. Les anomalies du marché pendant les vacances: Bien que la stratégie évite les transactions entre le 15 décembre et le 15 janvier, d’autres comportements de marché avant et après les vacances peuvent également être anormaux et affecter la performance de la stratégie.

  6. Dépendance à la FVGLa stratégie repose sur le modèle FVG pour les entrées de rupture et de retournement, mais dans certaines conditions de marché, le FVG peut ne pas être facilement formé ou identifié.

  7. Les limites d’une seule période de tempsLa dépendance à l’égard d’un graphique d’une minute peut faire oublier à une stratégie la structure importante du marché sur une période plus longue.

Orientation de l’optimisation de la stratégie

  1. Adaptation de la largeur de la zoneIl est possible d’envisager d’ajuster la largeur de la fourchette en fonction de la dynamique de la volatilité du marché, par exemple en utilisant une fourchette plus large les jours de plus grande volatilité et une fourchette plus étroite les jours de moindre volatilité. Cela peut être réalisé en calculant la fourchette moyenne réelle de volatilité (ATR) ou un indicateur similaire.

  2. Optimiser la fenêtre de tempsIl est possible d’étudier les fenêtres d’optimisation des heures de négociation des différents marchés, plutôt que de les fixer à 9h30-10h30. Certains marchés peuvent présenter des modèles de rupture de fourchette plus visibles à différentes périodes.

  3. Paramètres dynamiques de risque et de rémunérationLe rapport risque/rendement peut être ajusté en fonction de la situation du marché et de la dynamique volatile, par exemple en augmentant les objectifs lorsque la tendance est forte et en réduisant les objectifs lors de la consolidation du marché.

  4. Intégration des indicateurs de l’humeur du marchéIl est possible d’envisager d’inclure des indices de largeur de marché ou de volatilité comme filtres, afin d’éviter de négocier dans des conditions défavorables.

  5. Confirmation de plusieurs périodes: Bien que l’exécution de la transaction reste sur le graphique d’une minute, des conditions de confirmation peuvent être ajoutées pour les périodes de temps plus élevées, telles que la vérification de la cohérence de la direction de la tendance sur le graphique de 15 minutes ou d’une heure.

  6. Optimiser la définition de FVG: La définition actuelle du FVG est relativement simple, mais il est possible d’envisager des définitions plus complexes ou plus précises des zones d’inégalité, par exemple en prenant en compte le corps du corps plutôt que la seule ligne d’ombre.

  7. Ajouter une confirmation de transactionL’ajout d’une confirmation de volume aux conditions d’entrée peut améliorer la qualité du signal, en particulier pour les entrées de rupture.

  8. Adaptation à l’arrêt des pertesLe fait d’ajuster le niveau de stop loss en fonction de la dynamique de la volatilité du marché peut améliorer l’adaptabilité de la stratégie dans différents environnements de marché.

Résumer

Le système de négociation multi-stratégie de rupture-reprise-retour est une stratégie de négociation intraday structurée, avec des règles claires, qui cherche des opportunités de négociation en identifiant les intervalles de prix qui se forment le matin et les modèles de rupture, de piège ou de retournement qui en résultent. Les principaux avantages de cette stratégie résident dans sa simplicité et la flexibilité de plusieurs modes d’entrée, tandis que des limites de temps strictes et des principes de gestion des risques aident à maintenir la discipline des transactions.

Cependant, la stratégie est également exposée à des risques tels que les fausses percées, l’inadéquation de la largeur de la fourchette et la dépendance à des modèles de prix spécifiques. La robustesse et l’adaptabilité de la stratégie peuvent être encore améliorées par des méthodes d’optimisation de la fourchette, l’ajustement de la fenêtre de temps, la mise en place dynamique du rapport de retour sur risque et l’intégration de l’analyse de plusieurs périodes.

En fin de compte, cette stratégie fournit un cadre systématisé pour les traders à courte ligne, particulièrement pour les investisseurs qui cherchent à négocier efficacement pendant les heures d’ouverture quotidiennes. Comme pour toutes les stratégies de trading, un retour d’expérience suffisant et une gestion appropriée des risques doivent être effectués avant la mise en œuvre effective.

Code source de la stratégie
/*backtest
start: 2025-07-22 00:00:00
end: 2025-08-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Three-Step 9:30 Range Scalping (Backtest)", overlay=true, calc_on_every_tick=false, process_orders_on_close=true,
     initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0)

// -------------------- Inputs
enableBreak    = input.bool(true,  "Enable Break Entry")
enableTrap     = input.bool(false, "Enable Trap Entry")
enableReversal = input.bool(true, "Enable Reversal Entry")
rr             = input.float(2.0,  "Take-Profit R Multiple", step=0.25, minval=0.25)
oneTradePerDay = input.bool(false,  "One Trade Per Day")
showRange      = input.bool(true,  "Show 9:30 5m Range")

// Risk management
riskPct        = input.float(1.0,  "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=100.0)
sizeMode       = input.string("Risk %", "Position Sizing Mode", options=["Risk %", "Fixed contracts"])
fixedContracts = input.int(1, "Fixed Contracts", minval=1)

// Optional: warn if not on 1-minute chart (execution timeframe per PRD)
onOneMinute = timeframe.isminutes and timeframe.multiplier == 1

// -------------------- Time helpers (chart is assumed New York time)
newDay   = ta.change(time("D")) != 0
// Trade the first hour only: 9:30:00 to 10:29:59
inWindow = (hour == 9 and minute >= 30) or (hour == 10 and minute <= 29)
// Holiday blackout window: Do not trade Dec 15 – Jan 15
inBlackout = (month == 12 and dayofmonth >= 15) or (month == 1 and dayofmonth <= 15)

// -------------------- First 5-min range (use the actual 9:30 5m candle via security())
var float rangeHi = na
var float rangeLo = na
var bool  haveRange = false

// -------------------- State for entries
var bool  breakUpFound           = false
var bool  breakDownFound         = false
var float initBreakUpLow         = na    // for Break/Trap long SL
var float initBreakDownHigh      = na    // for Break/Trap short SL
var bool  trapUpRetestedInside   = false
var bool  trapDownRetestedInside = false
var bool  tradedToday            = false

// Reset daily state at midnight (chart timezone)
if newDay
    rangeHi := na
    rangeLo := na
    haveRange := false
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// Pull the 5-minute bar that STARTS at 9:30 (value available on its close at 9:35)
sess0930Hi = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? high : na, barmerge.gaps_off, barmerge.lookahead_off)
sess0930Lo = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? low  : na, barmerge.gaps_off, barmerge.lookahead_off)

// Lock the range when the 9:30 5m candle closes (value appears non-na exactly then)
if not haveRange and not na(sess0930Hi) and not na(sess0930Lo)
    rangeHi := sess0930Hi
    rangeLo := sess0930Lo
    haveRange := true
    // reset session-specific flags at start of trading window
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// -------------------- Visuals
plot(showRange and haveRange ? rangeHi : na, "Range High", color=color.new(color.teal, 0), style=plot.style_linebr, linewidth=2)
plot(showRange and haveRange ? rangeLo : na, "Range Low",  color=color.new(color.orange, 0), style=plot.style_linebr, linewidth=2)

plotchar(not onOneMinute, title="Use 1-minute chart", char="⚠", location=location.top, color=color.new(color.red, 0), size=size.tiny)
plotchar(inBlackout, title="Holiday blackout (Dec 15–Jan 15)", char="⛔", location=location.top, color=color.new(color.red, 0), size=size.tiny)

// -------------------- Convenience conditions
closeAbove  = haveRange and close > rangeHi
closeBelow  = haveRange and close < rangeLo
closeInside = haveRange and close <= rangeHi and close >= rangeLo

// Track first body-close outside the range in each direction (initial break-close)
if haveRange and inWindow and not tradedToday
    if not breakUpFound and closeAbove
        breakUpFound := true
        initBreakUpLow := low
        trapUpRetestedInside := false
    if not breakDownFound and closeBelow
        breakDownFound := true
        initBreakDownHigh := high
        trapDownRetestedInside := false

// Trap retest flags (retest back inside after first break)
if haveRange and inWindow and not tradedToday
    if breakUpFound and not trapUpRetestedInside and closeInside
        trapUpRetestedInside := true
    if breakDownFound and not trapDownRetestedInside and closeInside
        trapDownRetestedInside := true

// -------------------- FVG detectors (three-candle imbalance)
// Simple wick-gap definition, preserved through the third candle
// Bullish: gap exists if Candle C low > Candle A high AND Candle B low > Candle A high
// Bearish: gap exists if Candle C high < Candle A low  AND Candle B high < Candle A low
bullFVG = not na(high[2]) and (low[1] > high[2]) and (low > high[2])
bearFVG = not na(low[2])  and (high[1] < low[2])  and (high < low[2])

// -------------------- Entry gating
allowEntry = haveRange and inWindow and not inBlackout and strategy.position_size == 0 and (not oneTradePerDay or not tradedToday)

// Calculate contracts based on selected sizing mode
calcOrderQty(entryPrice, stopPrice) =>
    qty = 0
    if sizeMode == "Fixed contracts"
        qty := fixedContracts
    else
        riskCash = strategy.equity * riskPct / 100.0
        riskPerContract = math.abs(entryPrice - stopPrice) * syminfo.pointvalue
        qty := riskPerContract > 0 ? math.floor(riskCash / riskPerContract) : 0
    qty

// -------------------- BREAK Entries (needs FVG and ANY of the 3 bars closes outside)
if enableBreak and allowEntry
    // Long BREAK
    breakLongOk  = bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)
    if breakLongOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopL = na
        stopL := close[2] > rangeHi ? low[2] : stopL
        stopL := na(stopL) and close[1] > rangeHi ? low[1] : stopL
        stopL := na(stopL) and close > rangeHi ? low : stopL
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_BREAK", strategy.long, qty=qtyL)
                strategy.exit("LONG_BREAK_TP/SL", from_entry="LONG_BREAK", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short BREAK
    breakShortOk = bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)
    if breakShortOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopS = na
        stopS := close[2] < rangeLo ? high[2] : stopS
        stopS := na(stopS) and close[1] < rangeLo ? high[1] : stopS
        stopS := na(stopS) and close < rangeLo ? high : stopS
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_BREAK", strategy.short, qty=qtyS)
                strategy.exit("SHORT_BREAK_TP/SL", from_entry="SHORT_BREAK", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- TRAP Entries (Break → Retest inside → Reclose outside; FVG not required)
if enableTrap and allowEntry
    // Long TRAP
    if breakUpFound and trapUpRetestedInside and closeAbove
        stopL  = na(initBreakUpLow) ? low : initBreakUpLow
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_TRAP", strategy.long, qty=qtyL)
                strategy.exit("LONG_TRAP_TP/SL", from_entry="LONG_TRAP", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short TRAP
    if breakDownFound and trapDownRetestedInside and closeBelow
        stopS  = na(initBreakDownHigh) ? high : initBreakDownHigh
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_TRAP", strategy.short, qty=qtyS)
                strategy.exit("SHORT_TRAP_TP/SL", from_entry="SHORT_TRAP", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- REVERSAL Entries (Failed break + opposite FVG back into range)
if enableReversal and allowEntry
    // After bearish break, bullish FVG back into range → LONG
    if breakDownFound and bullFVG and closeInside
        stopL  = low[2]  // first candle of the FVG
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_REV", strategy.long, qty=qtyL)
                strategy.exit("LONG_REV_TP/SL", from_entry="LONG_REV", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // After bullish break, bearish FVG back into range → SHORT
    if breakUpFound and bearFVG and closeInside
        stopS  = high[2] // first candle of the FVG
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_REV", strategy.short, qty=qtyS)
                strategy.exit("SHORT_REV_TP/SL", from_entry="SHORT_REV", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- Markers
plotshape(enableBreak and (bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)) and allowEntry,  title="Break Long",  style=shape.triangleup,   color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Break")
plotshape(enableBreak and (bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)) and allowEntry,  title="Break Short", style=shape.triangledown, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Break")
plotshape(enableTrap  and breakUpFound   and trapUpRetestedInside   and closeAbove and allowEntry,  title="Trap Long",  style=shape.circle, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Trap")
plotshape(enableTrap  and breakDownFound and trapDownRetestedInside and closeBelow and allowEntry,  title="Trap Short", style=shape.circle, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Trap")
plotshape(enableReversal and breakDownFound and bullFVG and closeInside and allowEntry, title="Reversal Long",  style=shape.diamond, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Rev")
plotshape(enableReversal and breakUpFound   and bearFVG and closeInside and allowEntry, title="Reversal Short", style=shape.diamond, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Rev")