Stratégie DCA de suivi intelligent de la volatilité et système de stop loss à double piste

EMA ATR DCA USD SO
Date de création: 2025-04-14 18:18:25 Dernière modification: 2025-04-14 18:18:25
Copier: 0 Nombre de clics: 521
2
Suivre
319
Abonnés

Stratégie DCA de suivi intelligent de la volatilité et système de stop loss à double piste Stratégie DCA de suivi intelligent de la volatilité et système de stop loss à double piste

Aperçu

La stratégie est une stratégie de coût moyen en dollars intelligents basée sur les signaux croisés des moyennes mobiles des indices (EMA), combinant un ordre de sécurité adapté à la volatilité (SO) et un mécanisme de stop-loss innovant à deux voies. Elle entre dans le marché à la confirmation d’une tendance à la hausse, puis déploie automatiquement des ordres de sécurité supplémentaires en fonction de la volatilité du marché, tout en utilisant un système de suivi de stop-loss et de verrouillage des bénéfices standard pour protéger les gains.

Principe de stratégie

La logique centrale de cette stratégie s’articule autour des éléments clés suivants:

  1. Système de détection des tendances: Utilisez le croisement des EMA rapides (default 9 cycles) et des EMA lentes (default 21 cycles) pour identifier une tendance haussière potentielle. Lorsque les EMA rapides traversent les EMA lentes vers le haut, le système confirme la tendance haussière et déclenche les ordres d’entrée de base.

  2. Système d’accès DCA à plusieurs niveauxLa stratégie est basée sur un système d’admission à trois niveaux:

    • Commande de base (USD 1000): commande à la confirmation du signal croisé EMA
    • Commande de sécurité 1 ((USD 1250): déclenchée lorsque le prix est inférieur au prix de la commande de base
    • Commande de sécurité 2 (~$1750): déclenchée si le prix continue à baisser
  3. Les mécanismes d’adaptation à la volatilité: Le prix de déclenchement d’un ordre de sécurité peut être calculé dynamiquement sur la base de l’indicateur ATR, permettant à la stratégie d’ajuster automatiquement sa position d’entrée en fonction des fluctuations actuelles du marché. L’utilisateur peut choisir d’utiliser le multiplicateur ATR (par défaut, SO1 est 1,2 fois l’ATR, SO2 est 2,5 fois l’ATR) ou une baisse de pourcentage fixe (par défaut, SO1 est 4% et SO2 est 8%) pour calculer le point de déclenchement d’un ordre de sécurité.

  4. Système de protection contre les dommages à double voie:

    • Stop-loss de suivi standard: suivi du prix le plus élevé après l’entrée, réglé sur un pourcentage fixe (défault de 8%) à partir du sommet
    • Stop loss de suivi du verrouillage des bénéfices: activé lorsque la position atteint une marge de profit spécifique (défault 2.5%), utilisez un pourcentage de suivi plus étroit (défault 1.5%) pour verrouiller plus activement les bénéfices réalisés
  5. Mécanisme de période de refroidissement: La mise en place d’une période de refroidissement après l’exécution de l’ordre de base ((par défaut 4 lignes K) pour éviter une survente des transactions dans un court laps de temps.

Avantages stratégiques

L’analyse de la stratégie a révélé les avantages suivants:

  1. Une grande capacité d’adaptation: Le calcul de l’ATR pour les ordres de sécurité déclencheurs de prix permet à la stratégie de s’adapter intelligemment à différents environnements de fluctuation du marché, en élargissant de manière appropriée l’intervalle des ordres de sécurité pendant les périodes de forte volatilité et en resserrant l’intervalle pendant les périodes de faible volatilité.

  2. Optimisation de la gestion des fonds: La méthode d’allocation croissante des fonds ((1000 \(→1250 \)→1750 $) est conforme au principe de gestion de position “pyramidale”, permettant à la stratégie d’obtenir un meilleur prix d’entrée moyen avec une plus grande quantité de fonds lorsque les prix baissent.

  3. Le mécanisme de double protectionL’innovation du système d’arrêt à double voie offre une protection contre les risques de baisse de base et permet de passer automatiquement à un mode d’arrêt plus conservateur en cas de profit, équilibrant efficacement la maximisation des profits et la gestion des risques.

  4. Flexibilité personnalisée: Tous les paramètres clés sont personnalisables, y compris le cycle EMA, la longueur ATR, l’intervalle des ordres de sécurité, le pourcentage d’arrêt et la taille des ordres, permettant aux traders d’optimiser en fonction de leurs préférences de risque personnelles et des conditions du marché.

  5. L’intégration: La stratégie intègre des alertes conditionnelles formatées en messages JSON pour faciliter l’intégration avec des plates-formes de trading automatisées tierces (comme 3Commas) pour une exécution de transactions entièrement automatisée.

Risque stratégique

Malgré la conception globale de la stratégie, les risques et les défis potentiels sont les suivants:

  1. Risque d’inversion de tendance: La stratégie repose sur les signaux croisés EMA, qui peuvent générer des signaux erronés dans des marchés en évolution rapide ou en tremblement de terre, entraînant une entrée inutile. La solution consiste à ajuster la longueur des cycles EMA ou à ajouter des indicateurs de confirmation supplémentaires.

  2. Le risque de dépense: Dans un marché en perpétuelle baisse, même avec tous les ordres de sécurité déployés, le prix d’entrée moyen peut être bien supérieur au prix du marché, entraînant des pertes à long terme. Il est recommandé de définir un seuil de perte maximale ou un seuil de taille de position globale.

  3. Risques liés à la survente: Dans les marchés très volatils, les EMA peuvent se croiser fréquemment, déclenchant des transactions excessives. Malgré le mécanisme de période de refroidissement intégré, il peut être nécessaire d’optimiser davantage ou d’ajouter des restrictions supplémentaires sur la fréquence des transactions.

  4. Arrêt de double voie: Dans certaines conditions de marché, les deux mécanismes de stop-loss peuvent interférer l’un avec l’autre, entraînant une sortie prématurée ou un signal répété. L’équilibre entre ces deux paramètres de stop-loss doit être régulièrement revu et ajusté.

  5. Difficulté à optimiser les paramètres: Les multiples paramètres d’une stratégie doivent être coordonnés entre eux pour obtenir des résultats optimaux, ce qui augmente la complexité de l’optimisation des paramètres. Il est recommandé d’utiliser les outils d’optimisation de la rétroaction pour une analyse des paramètres complète.

Orientation de l’optimisation de la stratégie

Sur la base d’une analyse approfondie du code, voici les directions potentielles d’optimisation de la stratégie:

  1. La mise en place d’un mécanisme de confirmation de tendances multiples: La stratégie actuelle repose uniquement sur un seul signal de croisement EMA. Il est envisageable d’ajouter des indicateurs de confirmation de tendance supplémentaires, tels que le RSI, le MACD ou des jugements de tendance sur des périodes plus longues, pour réduire les signaux erronés. Cela réduit considérablement le risque de fausse rupture.

  2. Système dynamique de répartition des fondsLa stratégie actuelle utilise un montant fixe en dollars comme taille d’ordre, optimisé pour un système d’ajustement dynamique basé sur la volatilité du marché ou les intérêts des comptes, garantissant le maintien d’un niveau d’exposition au risque approprié dans différentes conditions de marché.

  3. Stratégie de sortie optimiséeIl est possible de développer des logiques de stop-loss plus complexes, telles que des stops de suivi adaptatifs basés sur la volatilité du marché, ou l’intégration d’indicateurs de volume d’action et de volume de transaction pour optimiser les décisions d’exit et éviter les sorties prématurées dans les fluctuations à court terme.

  4. Retraite renforcée: Ajout d’une fonctionnalité de limitation des retraits globaux, qui suspend automatiquement les nouveaux ordres ou ferme les positions existantes lorsque la stratégie atteint le pourcentage de retraits maximal prévu, pour éviter des pertes catastrophiques dans des conditions de marché extrêmes.

  5. Système d’optimisation des cycles: Développer une fonction d’optimisation automatique des cycles permettant aux stratégies d’ajuster automatiquement la longueur des EMA, les cycles ATR et d’autres paramètres liés au temps en fonction des conditions de marché récentes pour s’adapter aux changements de l’état du marché.

Résumer

La stratégie DCA à suivi d’oscillation intelligent et le système de stop-loss à deux voies est un programme de trading quantitatif bien conçu, particulièrement adapté pour capturer les tendances à la hausse et gérer les risques dans les marchés volatiles. Il combine habilement le suivi des tendances, la méthode des moyennes de coût du dollar et le mécanisme d’adaptation aux fluctuations, et protège les gains grâce à un système de stop-loss à deux voies innovant.

L’avantage central de cette stratégie réside dans son équilibre entre adaptabilité et gestion des risques, permettant d’ajuster automatiquement les décisions d’entrée et de sortie dans différents environnements de marché. En utilisant ATR pour calculer dynamiquement les déclencheurs d’ordres sécurisés, la stratégie peut répondre intelligemment en fonction des conditions de marché en temps réel, plutôt que de s’appuyer sur des paramètres statiques prédéfinis.

Bien qu’il existe des risques potentiels liés à l’identification des tendances et à la gestion des fonds, ceux-ci peuvent être efficacement atténués par les orientations d’optimisation proposées. En particulier, l’introduction d’un système de reconnaissance de tendances multiples et d’allocation dynamique des fonds améliorera considérablement la solidité et la performance à long terme de la stratégie.

Pour les traders quantifiés qui recherchent des méthodes de négociation systématiques dans des marchés volatiles, la stratégie offre un cadre complet et extensible qui permet de saisir les opportunités de tendance à la hausse tout en offrant une protection adéquate contre les risques dans des conditions de marché défavorables.

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

//@version=5
strategy(
     title="BONK/USD (1H) - $4k DCA + Dual Trailing + Date Filter", // Updated Title
     overlay=true,
     initial_capital=4000,
     currency=currency.USD,
     default_qty_type=strategy.fixed,
     default_qty_value=0, // Quantity calculated dynamically based on USD value
     commission_type=strategy.commission.percent, // Example: Add commission settings
     commission_value=0.1 // Example: 0.1% commission
     )

// 1) USER INPUTS (Defaults adjusted for 1H timeframe - REQUIRES BACKTESTING/TUNING)


// --- Trend ---
fastMALen = input.int(9, title="Fast EMA Length (Default for 1H)")
slowMALen = input.int(21, title="Slow EMA Length (Default for 1H)")

// --- Trailing Stops ---
trailStopPerc   = input.float(8.0, title="Standard Trailing Stop (%) (Default for 1H)", minval=0.1) / 100
lockInThreshold = input.float(2.5,  title="Profit Lock-In Trigger (%) (Default for 1H)", minval=0.1) / 100
lockInTrailPct  = input.float(1.5,  title="Lock-In Trail (%) after Trigger (Default for 1H)", minval=0.1) / 100

// --- Safety Orders (SO) ---
useATRSpacing     = input.bool(true, title="Use ATR-Based Spacing?")
atrLength         = input.int(14,   title="ATR Length", minval=1)
atrSo1Multiplier  = input.float(1.2, title="ATR SO1 Multiplier (Default for 1H)", minval=0.1)
atrSo2Multiplier  = input.float(2.5, title="ATR SO2 Multiplier (Default for 1H)", minval=0.1)

// --- Fallback SO Spacing (if not using ATR) ---
fallbackSo1Perc = input.float(4.0,  title="Fallback SO1 Drop (%) (Default for 1H)", minval=0.1) / 100
fallbackSo2Perc = input.float(8.0, title="Fallback SO2 Drop (%) (Default for 1H)", minval=0.1) / 100

// --- Entry Cooldown ---
cooldownBars = input.int(4, "Cooldown Bars After Base Entry (Default for 1H)", minval=0)

// --- Order Sizes in USD ---
baseUsd = input.float(1000.0, title="Base Order Size (USD)", minval=1.0)
so1Usd  = input.float(1250.0, title="Safety Order 1 Size (USD)", minval=1.0)
so2Usd  = input.float(1750.0, title="Safety Order 2 Size (USD)", minval=1.0)

// 2) CALCULATIONS

// --- Trend & Reversal Detection ---
fastMA    = ta.ema(close, fastMALen)
slowMA    = ta.ema(close, slowMALen)
trendUp   = ta.crossover(fastMA, slowMA)
trendDown = ta.crossunder(fastMA, slowMA)

// --- ATR Value ---
atrValue = ta.atr(atrLength)

// 3) BASE ENTRY LOGIC

// Base Buy Signal: EMA crossover
baseBuySignal = trendUp

var int   lastBuyBar     = na // Tracks the bar index of the last base entry
inCooldown = not na(lastBuyBar) and (bar_index - lastBuyBar < cooldownBars)

var float baseEntryPrice = na // Stores the price of the initial base entry for SO calculations

// --- Execute Base Entry ---
// Added 'inDateRange' to the condition
if baseBuySignal and strategy.position_size == 0 and not inCooldown
    baseQty = baseUsd / close // Calculate quantity based on USD
    strategy.entry("Base Order", strategy.long, qty=baseQty, comment="Base Entry")
    baseEntryPrice := close
    lastBuyBar     := bar_index

// 4) SAFETY ORDERS LOGIC

// --- Calculate SO Trigger Prices ---
float so1TriggerPrice = na
float so2TriggerPrice = na

if not na(baseEntryPrice) // Only calculate if a base order has been placed
    so1TriggerPrice := useATRSpacing ?
         (baseEntryPrice - atrValue * atrSo1Multiplier) :
         (baseEntryPrice * (1 - fallbackSo1Perc))

    so2TriggerPrice := useATRSpacing ?
         (baseEntryPrice - atrValue * atrSo2Multiplier) :
         (baseEntryPrice * (1 - fallbackSo2Perc))

// --- Conditions for SO Execution ---
// Added 'inDateRange' check
// Ensure base order exists, price trigger hit, and the specific SO hasn't filled yet
bool so1Condition = not na(baseEntryPrice) and strategy.position_size > 0 and close <= so1TriggerPrice and strategy.opentrades == 1
bool so2Condition = not na(baseEntryPrice) and strategy.position_size > 0 and close <= so2TriggerPrice and strategy.opentrades == 2

// --- Execute SO1 ---
if so1Condition
    so1Qty = so1Usd / close // Calculate quantity based on USD
    strategy.entry("Safety Order 1", strategy.long, qty=so1Qty, comment="SO1")

// --- Execute SO2 ---
if so2Condition
    so2Qty = so2Usd / close // Calculate quantity based on USD
    strategy.entry("Safety Order 2", strategy.long, qty=so2Qty, comment="SO2")

// 5) AVERAGE ENTRY PRICE

// Use the built-in variable for the average price of the open position
avgEntryPrice = strategy.position_avg_price

// 6) DUAL TRAILING STOP LOGIC

// Variables to track trailing stop levels and states
var float highestSinceEntry = na
var float trailStopPrice    = na
var bool  stopHitNormal     = false

var bool  lockInTriggered = false
var float lockInPeak      = na
var float lockInStopPrice = na
var bool  stopHitLockIn   = false

// --- Update Trailing Logic when in a Position ---
if strategy.position_size > 0
    // --- Standard Trail ---
    highestSinceEntry := na(highestSinceEntry) ? close : math.max(highestSinceEntry, close)
    trailStopPrice    := highestSinceEntry * (1 - trailStopPerc)
    stopHitNormal     := close < trailStopPrice

    // --- Lock-In Trail ---
    if not lockInTriggered and close >= avgEntryPrice * (1 + lockInThreshold)
        lockInTriggered := true
        lockInPeak      := close

    if lockInTriggered
        lockInPeak      := math.max(lockInPeak, close)
        lockInStopPrice := lockInPeak * (1 - lockInTrailPct)
        stopHitLockIn   := close < lockInStopPrice
    else
        stopHitLockIn   := false
        lockInStopPrice := na

// --- Reset Variables when Flat ---
else
    highestSinceEntry := na
    trailStopPrice    := na
    stopHitNormal     := false

    lockInTriggered   := false
    lockInPeak        := na
    lockInStopPrice   := na
    stopHitLockIn     := false

    baseEntryPrice    := na
    // lastBuyBar is intentionally NOT reset here, cooldown depends on it

// 7) EXIT CONDITIONS

// Added 'inDateRange' check
// Exit if either trailing stop is hit OR if the trend reverses downward, within the active date range
exitCondition = (stopHitNormal or stopHitLockIn or trendDown) and strategy.position_size > 0

if exitCondition
    strategy.close_all(comment="Exit: SL / LockIn / TrendDown")

// 8) ALERT CONDITIONS (Potential 3Commas Integration)
// WARNING: Verify and adapt these JSON message strings for your specific 3Commas bot configuration!
//          The required format ('action', parameters, etc.) can vary.

// Added 'inDateRange[1]' check for Base Alert
alertcondition(inDateRange[1] and baseBuySignal and strategy.position_size[1] == 0 and not inCooldown[1],
     title="Base Buy Alert",
     message='{"action":"start_deal","order":"base"} // Verify/Adapt JSON for your 3Commas bot!')

// Added 'inDateRange' check for SO1 Alert
alertcondition(so1Condition, title="SO1 Alert",
     message='{"action":"add_funds","order":"so1"} // Verify/Adapt JSON for your 3Commas bot!')

// Added 'inDateRange' check for SO2 Alert
alertcondition(so2Condition, title="SO2 Alert",
     message='{"action":"add_funds","order":"so2"} // Verify/Adapt JSON for your 3Commas bot!')

// Added 'inDateRange' check for Exit Alert
alertcondition(exitCondition, title="Exit Alert",
     message='{"action":"close_at_market_price"} // Verify/Adapt JSON for your 3Commas bot!')


// 9) PLOTS & DEBUG TABLE

// --- Plot MAs ---
plot(fastMA, color=color.new(color.green, 0), title="Fast EMA", linewidth=2)
plot(slowMA, color=color.new(color.red, 0),   title="Slow EMA", linewidth=2)

// --- Plot Trailing Stops ---
plot(strategy.position_size > 0 ? trailStopPrice : na, color=color.new(color.orange, 0), title="Standard Trailing Stop", style=plot.style_linebr, linewidth=2)
plot(lockInTriggered ? lockInStopPrice : na, color=color.new(color.fuchsia, 0), title="Lock-In Trailing Stop", style=plot.style_linebr, linewidth=2)

// --- Debug Info Table ---
var table tradeInfo = table.new(position=position.bottom_right, columns=2, rows=10, border_width=1)