Stratégie de trading à terme stop loss dynamique avec indicateurs techniques multiples

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
Date de création: 2025-04-02 09:41:48 Dernière modification: 2025-04-02 09:41:48
Copier: 0 Nombre de clics: 381
2
Suivre
319
Abonnés

Stratégie de trading à terme stop loss dynamique avec indicateurs techniques multiples Stratégie de trading à terme stop loss dynamique avec indicateurs techniques multiples

Aperçu de la stratégie

Cette stratégie est un système de trading à terme avancé qui combine plusieurs conditions techniques et une analyse des plus hautes périodes de temps pour identifier des opportunités de trading à forte probabilité. Cette stratégie utilise une approche basée sur la combinaison de plusieurs conditions techniques, qui exige que plusieurs conditions techniques soient satisfaites simultanément avant d’entrer dans une transaction.

Principe de stratégie

Le cœur de la stratégie est la combinaison de plusieurs méthodes d’analyse technique pour s’assurer que les transactions ne sont entrées que lorsque plusieurs indicateurs donnent des signaux simultanément. Plus précisément, la stratégie contient les éléments clés suivants:

  1. Le déficit de la juste valeur (FVG)- L’existence d’un écart de prix significatif entre deux lots est identifiée, indiquant qu’il peut exister un espace non comblé sur le marché.
  2. Bloc de commande- Ce sont des zones clés où les prix se retournent, généralement sous la forme d’une forte courbe de rejet, qui devient ensuite une zone de support ou de résistance.
  3. Le scan de la liquidité- Identifier les situations où le marché recule après avoir franchi un sommet ou une baisse préliminaire, ce qui indique généralement que les grandes institutions collectent de la liquidité.
  4. Découverte de la structure- Il se produit lorsque le prix dépasse la structure de la phase précédente, formant un sommet plus élevé ou un sommet plus bas.
  5. Confirmation de la tendance à haute période- Utilisez les EMA (moyennes mobiles indicielles) sur les périodes de 15 minutes et 60 minutes pour confirmer la direction de la tendance générale.

La stratégie ne génère un signal d’entrée que si au moins deux conditions fondamentales (une dans le mode de démarrage) sont ajoutées à un signal de rupture structurelle, tout en étant cohérent avec une tendance à des cycles de temps plus élevés.

En termes de gestion des risques, la stratégie utilise l’ATR (Average True Range) pour définir une position de stop-loss dynamique, avec une distance de stop-loss généralement 1,5 fois supérieure à l’ATR. Cette méthode augmente la distance de stop-loss avec une forte volatilité et réduit la distance avec une faible volatilité, ce qui rend le stop-loss plus intelligent.

La stratégie utilise une méthode de profit par tranches pour les positions qui sont rentables à 50% lorsqu’elles atteignent un profit équivalent au risque ((1R)), tout en déplaçant le stop loss de la position restante vers la position de garantie, créant ainsi une opportunité de trading sans risque. En outre, il existe un mécanisme d’exit basé sur le temps qui sera automatiquement fermé si la transaction ne se déplace pas dans la direction favorable dans un délai spécifié (de 30 minutes par défaut).

En outre, la stratégie contient une fonction de gestion de compte, qui exécute automatiquement toutes les positions lorsque le bénéfice du compte atteint l’objectif par défaut (< 3000 \() ou déclenche un arrêt de suivi (< 2500 \) pour le compte qui commence à suivre).

Avantages stratégiques

Après une analyse approfondie du code, nous pouvons résumer les avantages évidents suivants:

  1. Système de vérification multiple- La nécessité de satisfaire à plusieurs conditions techniques pour être admis, réduit efficacement les faux signaux et améliore la qualité des transactions.
  2. Une gestion intelligente des risques- L’utilisation d’un stop dynamique basé sur l’ATR est plus adaptée aux changements de la volatilité du marché que les stop ponctuels ou les stop en pourcentage.
  3. Filtrage des tendances à haute période- Utilisez la direction de la tendance pour les périodes de temps plus élevées et négociez uniquement dans la direction de la tendance, en évitant les transactions à l’envers.
  4. Stratégie de profit par tranches- Le blocage partiel des bénéfices est assuré par la prise de bénéfices par lots et le déplacement des pertes vers la position de couverture, tout en offrant une opportunité sans risque pour les positions restantes.
  5. Mécanisme de sortie basé sur le temps- La sortie automatique des transactions non valides pour éviter que les fonds ne soient bloqués pendant une longue période dans des transactions non motivées.
  6. Gestion des comptes dans leur ensemble- Protéger la rentabilité globale du compte en fixant des objectifs de profits et des arrêts de perte, et en assurant une bonne gestion des fonds.
  7. Très adaptable- offre une grande flexibilité grâce à plusieurs paramètres qui peuvent être adaptés à différentes conditions de marché et styles de négociation.
  8. Intégration des indicateurs techniques spécialisés- Combine plusieurs concepts d’analyse technique avancée, généralement utilisés uniquement par les traders professionnels.

Risque stratégique

Bien que cette stratégie soit bien conçue, elle comporte des risques potentiels, notamment:

  1. Risques liés à l’optimisation des paramètres- Les stratégies dépendent de plusieurs paramètres, si l’optimisation excessive peut entraîner une sur-adaptation, une mauvaise performance dans les conditions futures du marché. La solution consiste à utiliser des cycles de test suffisamment longs et à effectuer des tests avant.
  2. Dépendance à l’environnement de marché- Cette stratégie peut être efficace dans les marchés tendanciels, mais peut produire plus de faux signaux dans les marchés à intervalles de choc. La solution consiste à ajouter un filtre d’environnement de marché, à ajuster la fréquence de négociation ou à arrêter complètement la négociation lorsqu’elle est identifiée comme un marché à choc.
  3. Exécution des points de dérapage- Pendant les périodes de forte volatilité, les prix d’entrée et de sortie peuvent être très différents des prévisions, ce qui affecte la performance de la stratégie. La solution consiste à simuler les points de glissement réels dans la rétro-analyse et à utiliser un ordre de limite au lieu d’un ordre de marché dans les transactions réelles.
  4. Risque de défaillance technique- Les systèmes de négociation automatisés peuvent faire face à des pannes techniques ou à des interruptions de réseau. La solution consiste à mettre en place des systèmes de sauvegarde et des mécanismes d’intervention manuels.
  5. Gestion de la complexité- La complexité des stratégies peut rendre difficile le diagnostic ou la compréhension des raisons de l’échec de certaines transactions. La solution consiste à conserver un journal détaillé des transactions et à analyser régulièrement la performance de la stratégie.
  6. Risques liés à la liquidité- Dans certaines conditions de marché, par exemple avant ou après une annonce majeure, la liquidité peut diminuer rapidement, entraînant un glissement plus important ou l’impossibilité de sortir d’une position. La solution consiste à éviter de négocier pendant la publication de données économiques importantes ou à réduire la taille de la position pendant ces périodes.

Orientation de l’optimisation de la stratégie

Sur la base de l’analyse du code, voici quelques pistes d’optimisation potentielles:

  1. Renforcement de la détection des tendances- Les stratégies actuelles utilisent une simple croisement EMA pour déterminer la tendance et peuvent envisager d’ajouter d’autres indicateurs de tendance tels que l’ADX (indice de direction moyenne) pour confirmer la force de la tendance, car les marchés à forte tendance offrent généralement de meilleures opportunités de négociation.
  2. Adaptation à l’état du marché- Ajout d’un mécanisme d’identification de l’état du marché pour ajuster automatiquement les paramètres de la stratégie dans différents environnements de marché (tendance, intervalle, haute volatilité, basse volatilité). Cela peut rendre la stratégie plus flexible et s’adapter aux différentes conditions du marché.
  3. Optimiser le temps d’entrée- Considérer l’ajout d’indicateurs dynamiques tels que le RSI ou les indices aléatoires pour s’assurer d’entrer dans la direction de la tendance tout en évitant d’entrer dans le cas d’un surachat ou d’une survente excessive, réduisant ainsi le risque de revers.
  4. Amélioration des stratégies de profit- Les gains de 1R actuellement fixes peuvent être trop conservateurs ou trop radicaux. Il est possible d’envisager d’ajuster dynamiquement les objectifs de gains en fonction de la volatilité ou des niveaux de support/résistance, en définissant des objectifs plus éloignés lorsque la volatilité est plus grande.
  5. Une gestion plus fine des risques- Introduction d’un mécanisme d’ajustement dynamique de la taille de la position, qui ajuste automatiquement la marge de risque en fonction de la performance récente de la stratégie et de la volatilité du marché, augmentant le risque lorsque la stratégie fonctionne bien et réduisant le risque en cas de mauvaise performance.
  6. Ajouter un filtre d’heure- Les marchés à terme présentent des caractéristiques différentes selon les périodes, et l’ajout d’un filtre temporel permet d’éviter les périodes de faible fluidité ou d’indirection.
  7. Intégration des indicateurs de l’humeur du marché- Ajout d’indicateurs de l’humeur du marché tels que VIX, pour ajuster les paramètres de stratégie ou suspendre les transactions en cas d’humeur extrême.
  8. Optimiser l’efficacité du code- Il y a des cycles dans le code actuel qui peuvent affecter l’efficacité de l’exécution, en particulier sur des délais plus courts. L’optimisation de ces cycles peut améliorer la rapidité de réponse de la stratégie.

Résumer

Il s’agit d’une stratégie de négociation de futures multi-indicateurs bien conçue, intégrant plusieurs concepts d’analyse technique avancée et dotée de fonctions de gestion des risques et de gestion des fonds. Elle réduit les faux signaux en exigeant le respect simultané de plusieurs conditions et la confirmation de tendances à haute périodicité, tout en utilisant des stratégies de stop-loss et de profit par lots dynamiques basées sur l’ATR pour optimiser le ratio de rendement au risque.

Le principal avantage de cette stratégie réside dans son système de confirmation à plusieurs niveaux et sa gestion intelligente des risques, qui lui permettent de capturer des opportunités de transactions à haute probabilité tout en conservant un risque faible. Cependant, la complexité de la stratégie entraîne également des défis d’optimisation des paramètres et d’adaptation au marché, qui doivent être maintenus via une surveillance continue et des ajustements périodiques pour rester efficaces.

La stratégie a le potentiel de maintenir une performance stable dans différents environnements de marché en mettant en œuvre des mesures d’optimisation recommandées, en particulier en renforçant la capacité d’adaptation aux conditions du marché et en améliorant le système de gestion des risques. Globalement, il s’agit d’une stratégie avancée adaptée aux traders expérimentés, qui, avec une surveillance et une adaptation appropriées, peut devenir un outil puissant dans le système de négociation.

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

// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)

// ==========================================
// Parameters
// ==========================================

// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650

// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)

// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")

// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")

// ==========================================
// Indicators & Calculations
// ==========================================

// ATR Calculation
atr = ta.atr(atrLength)

// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)

// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50

// ==========================================
// Entry Conditions
// ==========================================

// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false

for i = 1 to fvgLength
    if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
        bullishFVG := true
    if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
        bearishFVG := true

// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false

for i = 1 to fvgLength
    if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
        inverseBullishFVG := true
    if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
        inverseBearishFVG := true

// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false

for i = 1 to obLength
    if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
        bullishOrderBlock := true
    if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
        bearishOrderBlock := true

// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false

lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)

if low[1] < lowestLow[2] and close > open
    bullishSweep := true
if high[1] > highestHigh[2] and close < open
    bearishSweep := true

// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false

prevHigh = high[2]
prevLow = low[2]

if high > prevHigh and low[1] < low[2]
    bullishBOS := true
if low < prevLow and high[1] > high[2]
    bearishBOS := true

// Simpler version for debug mode
if debugMode
    bullishBOS := close > open and close > close[1]
    bearishBOS := close < open and close < close[1]

// ==========================================
// Signal Generation
// ==========================================

// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)

bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)

// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)

// Debug mode override for testing
if debugMode
    longSignal := longSignal or (bullishBOS and htf1_bullish)
    shortSignal := shortSignal or (bearishBOS and htf1_bearish)

// ==========================================
// Risk Management
// ==========================================

// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier

// Default fixed values for testing
if debugMode
    longStopDistance := close * 0.01  // 1% stop
    shortStopDistance := close * 0.01  // 1% stop

// Calculate position size based on risk
nqPointValue = 20  // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))

// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)

// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize

// ==========================================
// Strategy Execution
// ==========================================

// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false

longEnteredThisBar := false
shortEnteredThisBar := false

// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
    strategy.close_all()
    strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEnteredThisBar := true
    entryTime := time

if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
    strategy.close_all()
    strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEnteredThisBar := true
    entryTime := time

// Take profit and stop loss orders
if strategy.position_size > 0
    stopPrice = strategy.position_avg_price - longStopDistance
    takeProfitPrice1 = strategy.position_avg_price + longStopDistance
    strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if high >= takeProfitPrice1
        strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)

if strategy.position_size < 0
    stopPrice = strategy.position_avg_price + shortStopDistance
    takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
    strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if low <= takeProfitPrice1
        strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)

// Time-based exit
if strategy.position_size != 0
    currentTime = time
    if (currentTime - entryTime) >= timeoutPeriod * 60000  // Convert minutes to milliseconds
        strategy.close_all(comment="Time Exit")

// ==========================================
// Trailing Stop for Account Management
// ==========================================

// Update equity curve
equityCurve := strategy.equity

// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
    strategy.close_all(comment="Profit Goal")

if strategy.equity >= accountSize + trailingThreshold
    trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
    if strategy.equity <= trailingStop
        strategy.close_all(comment="Trailing Stop")

// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
    strategy.close_all(comment="Stop Trailing")

// ==========================================
// Plotting
// ==========================================

// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)

// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")