Système de négociation quantitative d'identification de la structure des prix à plusieurs niveaux et d'écart de juste valeur

CHoCH FVG Pivot Points Risk-Reward Ratio Price Structure SWING POINTS Quantitative Trading
Date de création: 2025-06-03 10:50:29 Dernière modification: 2025-06-03 10:50:29
Copier: 0 Nombre de clics: 347
2
Suivre
319
Abonnés

Système de négociation quantitative d’identification de la structure des prix à plusieurs niveaux et d’écart de juste valeur Système de négociation quantitative d’identification de la structure des prix à plusieurs niveaux et d’écart de juste valeur

Aperçu

Le système de négociation quantifiée à plusieurs niveaux est une stratégie de négociation automatisée basée sur l’action des prix qui combine deux concepts clés de négociation: les traits de changement (CHoCH, Change of Character) et l’écart de juste valeur (FVG, Fair Value Gap). Cette stratégie capture les opportunités de négociation à haute probabilité en identifiant les points de changement de la structure du marché et les zones d’imbalance, permettant une entrée et une sortie précises lorsque les prix se retirent vers l’écart de juste valeur. Cette approche systématique permet aux traders d’analyser objectivement le marché, d’éliminer les facteurs émotionnels et d’avoir des règles de gestion du risque claires.

Principe de stratégie

Le système de trading quantitatif fonctionne selon les principes fondamentaux suivants:

  1. Identifier la structure des prixLe système utilise une longueur d’oscillation paramétrable (en principe 5 cycles) pour identifier ces points clés.

  2. Détection des caractéristiques du changement:

    • CHoCH à plusieurs têtes: les prix franchissent les hauts de la précédente oscillation après avoir formé des bas plus bas
    • Blank CHoCH: les prix franchissent les bas précédents après avoir formé des hauts plus élevés Le système exige que l’intervalle de temps de formation de CHoCH réponde à la distance minimale requise (default 10 cycles) pour filtrer les signaux invalides.
  3. Identification de la faille de juste valeur:

    • FVG à plusieurs têtes: les bas du cycle actuel sont supérieurs aux hauts des deux cycles précédents
    • FVG à vide: le sommet de la période actuelle est inférieur au sommet des deux périodes précédentes Le système a fixé le seuil de taille minimum de FVG (de 2 points par défaut) pour s’assurer de ne capturer que les déséquilibres de prix significatifs.
  4. Logistique d’entrée:

    • Entrée multiple: après confirmation du multiple CHoCH, attendez que le prix revienne à la zone FVG multiple
    • Entrée en vol à vide: après confirmation de vol CHoCH, attendre que le prix revienne à la zone de vol à vide FVG Le prix d’entrée est fixé au milieu de la zone FVG, offrant un prix d’entrée équilibré.
  5. Le mécanisme de gestion des risques:

    • Arrêt de perte sur le plus proche point de basse oscillation (multi-tête) ou le plus haut point de basse oscillation (tête vide)
    • Stop-loss basé sur le ratio de rendement au risque (défaut 2.0) ou sur un nombre de points de cible fixe
    • Fonction de réglage automatique des positions en fonction du pourcentage de risque du compte et de la taille de la position calculée en fonction de la distance de stop loss

Avantages stratégiques

Après une analyse approfondie du code, la stratégie présente les avantages suivants:

  1. Analyse structurée des marchés: La stratégie est basée sur les changements de structure des prix et les déséquilibres du marché, plutôt que sur une simple croisement d’indicateurs, ce qui en fait un avantage unique pour identifier les points de retournement du marché.

  2. L’heure exacte d’entréeEn attendant la formation du FVG après le CHoCH, la stratégie permet d’entrer à un niveau de prix avantageux, d’éviter la poursuite de la hauteur et de la basse, et d’améliorer la qualité de l’entrée.

  3. Gestion des risques adaptéeLa stratégie consiste à ajuster automatiquement la position de stop loss en fonction de la structure réelle du marché, plutôt que d’utiliser un nombre de points fixe, ce qui est plus conforme aux caractéristiques de la volatilité réelle du marché.

  4. Éléments de transaction visualisés: La stratégie fournit une visualisation complète, comprenant les balises CHoCH, les boîtes FVG, les points d’oscillation et les lignes de négociation, permettant aux traders de comprendre de manière intuitive la structure du marché et la logique de la stratégie.

  5. Une gestion de position flexible: La taille de la position est automatiquement ajustée en fonction du pourcentage de risque, ce qui permet de protéger les fonds du compte et d’ajuster automatiquement la marge de risque en fonction de la volatilité.

  6. Conception optimisée pour la performance: Le code contient un mécanisme pour nettoyer les boîtes de vieux FVG, afin de s’assurer que les performances du système ne sont pas réduites pendant une longue période de fonctionnement.

  7. Surveillance intégrée du rendement: La stratégie fournit des tableaux de performance en temps réel, comprenant des indicateurs clés tels que l’état de la stratégie, le taux de victoire et les facteurs de profit, afin de permettre aux traders d’évaluer la performance de la stratégie.

Risque stratégique

Malgré la bonne conception de cette stratégie, il y a des risques potentiels et des limites:

  1. Risque de fausse percée:Le signal CHoCH peut être une fausse rupture, entraînant un retrait rapide du prix et déclenchant un stop loss. Pour atténuer ce risque, il est possible d’envisager d’ajouter un mécanisme de confirmation, tel que l’attente d’une rupture confirmée par la ligne K de Dogen.

  2. Risques liés à l’écart: dans un marché très volatil ou une transaction de nuit, le prix peut dépasser la position de stop, entraînant une perte réelle supérieure à celle prévue. Il est recommandé d’utiliser un ordre de stop garanti (si possible) ou de réduire la taille de la position.

  3. Paramètre SensibilitéLa performance de la stratégie dépend fortement de paramètres tels que la longueur d’oscillation, la distance minimale de CHoCH et la taille du FVG. Différents marchés et périodes de temps peuvent nécessiter des combinaisons de paramètres différentes, il est recommandé d’optimiser le retour complet.

  4. Dépendance à l’environnement de marché: Cette stratégie fonctionne mieux dans les marchés en tendance, et peut générer de fréquents signaux erronés dans les marchés de consolidation. Considérez l’ajout d’un filtre de tendance ou d’un mécanisme d’identification de l’état du marché.

  5. Complexité informatique: La stratégie utilise plusieurs ensembles et vérifications conditionnelles, ce qui peut entraîner des problèmes de performances sur des appareils de configuration inférieure. Bien que le code contienne un mécanisme de nettoyage, il est nécessaire de faire attention à la consommation de ressources à long terme.

  6. Une mauvaise gestion des retraits: La stratégie actuelle ne prend pas en compte l’ajustement dynamique de la taille des positions dans différentes conditions de marché, ce qui peut entraîner des retraits plus importants dans un environnement persistant défavorable. Il est recommandé de mettre en place des limites de retrait de compte et un mécanisme de réduction progressive des positions.

Orientation de l’optimisation de la stratégie

L’analyse du code suggère les orientations d’optimisation suivantes:

  1. Confirmation de plusieurs périodes: Introduire une analyse de la structure du marché pour des périodes plus élevées, ne négocier que dans la direction de la tendance principale. Par exemple, un filtre de tendance à la ligne solaire peut être ajouté, n’exécutant des transactions que lorsque la direction de la tendance à la ligne solaire est cohérente.

  2. Optimisation des paramètres dynamiques: un système de paramètres qui s’ajuste automatiquement en fonction de la volatilité du marché, par exemple en augmentant la taille minimale de FVG et les exigences de distance de CHoCH pendant les périodes de forte volatilité et en réduisant ces paramètres pendant les périodes de faible volatilité.

  3. Optimisation de l’entrée:

    • Mettre en œuvre des stratégies d’entrée par lots, telles que la mise en place de plusieurs points d’entrée à différents niveaux dans les zones FVG
    • Ajout de confirmations d’entrée supplémentaires, telles que la rupture de volume ou la confirmation de la dynamique
  4. Amélioration de la gestion des risques:

    • Mise en place d’une fonction de suivi des arrêts de perte, qui ajuste automatiquement la position des arrêts de perte au fur et à mesure des gains de transaction
    • Ajout d’une fonctionnalité de profit partiel, qui permet d’annuler une partie de la position à un certain niveau de profit
    • Introduction d’une limite de retrait maximale, réduisant automatiquement la taille de la position ou suspendant la négociation lorsque le retrait du compte atteint la marge
  5. Adaptation à l’état du marché:

    • Ajout d’une reconnaissance de l’état du marché (trend/consolidation/haute volatilité) et adaptation des paramètres de la stratégie en fonction de l’état
    • Réduction ou évitement des transactions sur le marché de la consolidation
    • Prendre une taille de position plus prudente lorsque la volatilité augmente soudainement
  6. Le renforcement de l’apprentissage automatiqueIntroduction d’algorithmes d’apprentissage automatique pour analyser les modèles historiques de CHoCH et de FVG afin d’identifier les caractéristiques des modèles qui ont un taux de réussite plus élevé et d’ajuster les poids de décision d’entrée en jeu en conséquence.

  7. Filtrage des heures de transaction: Ajout d’un filtre pour les heures de négociation, afin d’éviter les grandes annonces et les périodes de forte volatilité à l’ouverture et à la fermeture des marchés, en se concentrant sur les heures de négociation les plus fluides.

Résumer

Le système de négociation quantifiant la structure des prix à plusieurs niveaux et l’écart de juste valeur est une solution de négociation complète qui combine une théorie avancée du comportement des prix. Il protège le capital de négociation en identifiant les variations de la structure du marché (CHoCH) et les zones d’inégalité des prix (FVG) à des niveaux de prix idéaux et en utilisant une approche systématique de gestion des risques.

Le plus grand avantage de la stratégie réside dans sa méthode d’analyse basée sur la structure réelle du marché, plutôt que de s’appuyer sur des indicateurs de retard, ce qui lui permet d’identifier plus tôt les points de retournement du marché. De plus, les fonctionnalités de visualisation et le système de surveillance de la performance permettent aux traders de comprendre intuitivement la logique de la stratégie et d’évaluer son efficacité.

Bien qu’il existe des risques tels que les fausses percées et la sensibilité des paramètres, la stabilité et la performance de la stratégie peuvent être considérablement améliorées par la direction d’optimisation proposée, en particulier la confirmation de plusieurs délais, l’ajustement dynamique des paramètres et la fonctionnalité de gestion des risques renforcée.

Cette stratégie offre un cadre solide aux investisseurs qui souhaitent opter pour une approche systématisée de la négociation, qui absorbe à la fois l’essence de la négociation traditionnelle des prix et les avantages de l’objectivité et de la discipline des systèmes quantifiés. Grâce à l’optimisation continue des paramètres et à l’adaptation au marché, cette stratégie a le potentiel de réaliser des performances de négociation stables dans divers environnements de marché.

Code source de la stratégie
/*backtest
start: 2024-06-03 00:00:00
end: 2025-06-02 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ICT CHoCH & FVG Strategy - NQ1!", overlay=true, pyramiding=0, calc_on_every_tick=false, calc_on_order_fills=false, max_boxes_count=500, max_lines_count=100, max_labels_count=100)

// ============================================================================
// INPUT PARAMETERS
// ============================================================================

// Strategy Settings
riskRewardRatio = input.float(2.0, title="Risk:Reward Ratio", minval=0.5, maxval=10.0, group="Strategy Settings")
fixedTarget = input.int(40, title="Fixed Target (Ticks)", minval=5, maxval=200, group="Strategy Settings")
useRRTarget = input.bool(true, title="Use Risk:Reward Target", tooltip="If false, uses fixed target", group="Strategy Settings")
riskPercent = input.float(2.0, title="Risk % of Account", minval=0.1, maxval=10.0, group="Strategy Settings")
useAutoSize = input.bool(false, title="Auto Size Positions", tooltip="Size based on risk % and stop distance", group="Strategy Settings")

// Visual Settings
showCHoCH = input.bool(true, title="Show CHoCH Labels", group="Visual Settings")
showFVG = input.bool(true, title="Show FVG Boxes", group="Visual Settings")
showSwings = input.bool(true, title="Show Swing Points", group="Visual Settings")
showTradeLines = input.bool(true, title="Show Entry/SL/TP Lines", group="Visual Settings")

// CHoCH Detection Settings
swingLength = input.int(5, title="Swing Detection Length", minval=2, maxval=20, group="CHoCH Settings")
minCHoCHDistance = input.int(10, title="Min CHoCH Distance (bars)", minval=5, maxval=50, group="CHoCH Settings")

// FVG Settings
minFVGSize = input.float(2.0, title="Min FVG Size (ticks)", minval=0.25, maxval=10.0, group="FVG Settings")
maxFVGAge = input.int(50, title="Max FVG Age (bars)", minval=10, maxval=200, group="FVG Settings")

// ============================================================================
// VARIABLES AND ARRAYS
// ============================================================================

// Swing point detection
var float lastSwingHigh = na
var float lastSwingLow = na
var int lastSwingHighBar = na
var int lastSwingLowBar = na

// CHoCH tracking
var bool bullishCHoCH = false
var bool bearishCHoCH = false
var float chochLevel = na
var int chochBar = na
var bool waitingForFVG = false

// FVG tracking
var array<box> bullishFVGs = array.new<box>()
var array<box> bearishFVGs = array.new<box>()
var float activeFVGTop = na
var float activeFVGBottom = na
var bool lookingForEntry = false

// Trade management
var float stopLossLevel = na
var float takeProfitLevel = na
var bool inPosition = false

// ============================================================================
// HELPER FUNCTIONS
// ============================================================================

// Convert ticks to price for NQ
ticksToPrice(ticks) => ticks * 0.25

// Calculate position size based on risk
calcPositionSize(stopDistance) =>
    if useAutoSize and strategy.equity > 0
        accountValue = strategy.equity
        riskAmount = accountValue * (riskPercent / 100)
        stopDistancePrice = stopDistance * syminfo.mintick
        math.max(1, math.floor(riskAmount / stopDistancePrice))
    else
        1

// ============================================================================
// SWING POINT DETECTION
// ============================================================================

// Detect swing highs and lows
swingHigh = ta.pivothigh(high, swingLength, swingLength)
swingLow = ta.pivotlow(low, swingLength, swingLength)

// Update swing points
if not na(swingHigh)
    lastSwingHigh := swingHigh
    lastSwingHighBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingHigh, "SH", style=label.style_triangledown, color=color.red, size=size.tiny)

if not na(swingLow)
    lastSwingLow := swingLow
    lastSwingLowBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingLow, "SL", style=label.style_triangleup, color=color.green, size=size.tiny)

// ============================================================================
// CHoCH DETECTION
// ============================================================================

// Check for bullish CHoCH (break above prior swing high after making lower low)
bullishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       high > lastSwingHigh and 
                       lastSwingLow < lastSwingHigh and
                       bar_index - lastSwingHighBar > minCHoCHDistance and
                       strategy.position_size == 0

// Check for bearish CHoCH (break below prior swing low after making higher high)
bearishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       low < lastSwingLow and 
                       lastSwingHigh > lastSwingLow and
                       bar_index - lastSwingLowBar > minCHoCHDistance and
                       strategy.position_size == 0

// Process CHoCH signals
if bullishCHoCHCondition and not bullishCHoCH
    bullishCHoCH := true
    bearishCHoCH := false
    chochLevel := lastSwingHigh
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


if bearishCHoCHCondition and not bearishCHoCH
    bearishCHoCH := true
    bullishCHoCH := false
    chochLevel := lastSwingLow
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


// ============================================================================
// FVG DETECTION
// ============================================================================

// Check for FVG formation (3-candle pattern)
if bar_index >= 2
    // Bullish FVG: low[0] > high[2]
    bullishFVG = low[0] > high[2] and (low[0] - high[2]) >= ticksToPrice(minFVGSize)
    
    // Bearish FVG: high[0] < low[2]  
    bearishFVG = high[0] < low[2] and (low[2] - high[0]) >= ticksToPrice(minFVGSize)
    
    // Process bullish FVG after bullish CHoCH
    if bullishFVG and bullishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[0]
        fvgBottom = high[2]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true
    
    // Process bearish FVG after bearish CHoCH
    if bearishFVG and bearishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[2]
        fvgBottom = high[0]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true

// ============================================================================
// ENTRY LOGIC
// ============================================================================

// Long entry: price touches bullish FVG after bullish CHoCH
longCondition = lookingForEntry and bullishCHoCH and 
               not na(activeFVGTop) and not na(activeFVGBottom) and
               low <= activeFVGTop and high >= activeFVGBottom and
               strategy.position_size == 0

// Short entry: price touches bearish FVG after bearish CHoCH  
shortCondition = lookingForEntry and bearishCHoCH and  not na(activeFVGTop) and not na(activeFVGBottom) and low <= activeFVGTop and high >= activeFVGBottom and  strategy.position_size == 0

// Process long entries
if longCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingLow
    stopDistance = entryPrice - stopLoss
    
    if useRRTarget
        takeProfit := entryPrice + (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice + ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Long", strategy.long, qty=qty)
    strategy.exit("Long Exit", "Long", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bullishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    


// Process short entries
if shortCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingHigh
    stopDistance = stopLoss - entryPrice
    
    if useRRTarget
        takeProfit := entryPrice - (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice - ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Short", strategy.short, qty=qty)
    strategy.exit("Short Exit", "Short", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bearishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    

// ============================================================================
// POSITION MANAGEMENT
// ============================================================================

// Reset position state when trade is closed
if inPosition and strategy.position_size == 0
    inPosition := false
    stopLossLevel := na
    takeProfitLevel := na

// ============================================================================
// VISUAL SIGNALS
// ============================================================================

// Plot entry signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, 
          style=shape.triangleup, size=size.normal)

plotshape(shortCondition, title="Short Entry", location=location.abovebar, color=color.red, 
          style=shape.triangledown, size=size.normal)

// Plot active stop loss and take profit levels
plot(inPosition ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(inPosition ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)

// ============================================================================
// CLEANUP
// ============================================================================

// Clean up old FVG boxes (helps with performance)
if bar_index % 100 == 0
    while array.size(bullishFVGs) > 20
        box.delete(array.shift(bullishFVGs))
    while array.size(bearishFVGs) > 20
        box.delete(array.shift(bearishFVGs))

// ============================================================================
// ALERTS
// ============================================================================

// Alert conditions
alertcondition(longCondition, title="Long Entry Signal", message="ICT Strategy: Long entry at FVG - SL: {{strategy.position_avg_price}}")
alertcondition(shortCondition, title="Short Entry Signal", message="ICT Strategy: Short entry at FVG - SL: {{strategy.position_avg_price}}")