
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.
Le système de trading quantitatif fonctionne selon les principes fondamentaux suivants:
Identifier la structure des prixLe système utilise une longueur d’oscillation paramétrable (en principe 5 cycles) pour identifier ces points clés.
Détection des caractéristiques du changement:
Identification de la faille de juste valeur:
Logistique d’entrée:
Le mécanisme de gestion des risques:
Après une analyse approfondie du code, la stratégie présente les avantages suivants:
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é.
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.
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é.
É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.
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é.
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.
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.
Malgré la bonne conception de cette stratégie, il y a des risques potentiels et des limites:
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.
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.
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.
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é.
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.
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.
L’analyse du code suggère les orientations d’optimisation suivantes:
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.
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é.
Optimisation de l’entrée:
Amélioration de la gestion des risques:
Adaptation à l’état du marché:
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.
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.
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é.
/*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}}")