Stratégie de suivi des tendances dynamiques et de filtrage de la volatilité : Système de croisement de moyennes mobiles basé sur la double confirmation de l'ADX et du CI

ADX CI SMA DM TR ATR DI
Date de création: 2025-02-21 09:33:38 Dernière modification: 2025-02-21 09:33:38
Copier: 0 Nombre de clics: 406
2
Suivre
319
Abonnés

Stratégie de suivi des tendances dynamiques et de filtrage de la volatilité : Système de croisement de moyennes mobiles basé sur la double confirmation de l’ADX et du CI Stratégie de suivi des tendances dynamiques et de filtrage de la volatilité : Système de croisement de moyennes mobiles basé sur la double confirmation de l’ADX et du CI

Aperçu

Cette stratégie est un système de négociation qui combine des signaux de croisement équilibrés et un filtrage de l’état du marché. Elle capte les tendances du marché en croisant une moyenne mobile simple de 9 cycles et 21 cycles (SMA) tout en utilisant l’indice de direction moyenne (ADX) et l’indice de chaos (Choppiness Index, CI) pour filtrer l’environnement du marché, en veillant à ce que les transactions ne soient effectuées que dans des marchés où la tendance est claire et bien caractérisée par la volatilité. Cette méthode combine efficacement les stratégies traditionnelles de suivi des tendances avec les indicateurs techniques modernes, offrant un cadre de négociation plus robuste.

Principe de stratégie

La logique centrale de la stratégie comprend trois composantes clés:

  1. Génération de signaux de tendance: utilisation d’un croisement de 9 cycles et de 21 cycles SMA pour déterminer la direction de la tendance et former un signal de négociation de base.
  2. Confirmation de la force de la tendance: vérifier la force de la tendance à l’aide de l’indicateur ADX (la barre est fixée à 20), en veillant à ce que les transactions se déroulent uniquement dans un environnement de marché où la tendance est claire.
  3. Filtrage des fluctuations du marché: introduction de l’indice de chaos (avec un seuil de 50) pour identifier les caractéristiques de la volatilité du marché et éviter de négocier dans des marchés très volatiles.

La stratégie utilise des méthodes de calcul de paramètres techniques optimisées, comprenant des fonctions de addition personnalisées, des calculs de valeurs maximales et minimales, ainsi que des calculs standardisés de la longueur d’onde réelle (TR), garantissant l’exactitude et l’efficacité du calcul du signal.

Avantages stratégiques

  1. Mécanisme de confirmation multiple: amélioration significative de la fiabilité des signaux de négociation en combinant le croisement homogène, le triple filtre ADX et CI.
  2. Adaptabilité: les paramètres de la stratégie peuvent être ajustés en fonction des différentes conditions du marché et ont une bonne adaptabilité.
  3. Le contrôle des risques est parfait: le risque de fausse rupture est réduit efficacement pendant les périodes de forte volatilité par le filtrage de l’indice CI.
  4. L’efficacité du calcul: l’utilisation de méthodes de calcul optimisées, en particulier pour traiter les données historiques.

Risque stratégique

  1. Sensibilité aux paramètres: l’efficacité de la stratégie dépend fortement des paramètres de seuil de l’ADX et du CI, et différents paramètres peuvent être configurés dans différentes conditions de marché.
  2. Légèreté: Il peut y avoir un problème de retard de signal en raison de l’utilisation de plusieurs indicateurs de moyenne mobile.
  3. Les marchés en crise: il est possible de manquer des opportunités de négociation en ligne courte dans les marchés en crise.
  4. Complexité du calcul: le calcul de multiples indicateurs augmente la complexité de la stratégie et peut affecter l’efficacité de l’exécution des transactions en temps réel.

Orientation de l’optimisation de la stratégie

  1. Adaptation dynamique des paramètres: introduction d’un mécanisme d’ajustement des paramètres adaptatifs pour ajuster les seuils de l’ADX et du CI en fonction de la dynamique du marché.
  2. Optimisation des arrêts de perte: ajout d’un mécanisme d’arrêt dynamique permettant de concevoir des stratégies d’arrêt plus flexibles basées sur l’ATR ou les bandes de volatilité.
  3. Renforcement de la confirmation du signal: il est envisageable d’ajouter un mécanisme de confirmation de la livraison pour améliorer encore la fiabilité du signal.
  4. Amélioration de l’efficacité des calculs: optimisation des méthodes de calcul des indicateurs, en particulier des performances lors du traitement de données à long cycle.

Résumer

La stratégie a construit un système de négociation complet en combinant la stratégie classique de l’équilibrage linéaire avec des indicateurs techniques modernes. Elle ne se concentre pas seulement sur la capture des tendances, mais aussi sur la pertinence de l’environnement du marché, améliorant la stabilité des transactions grâce à un mécanisme de filtrage multiple. Bien qu’il existe un certain problème de sensibilité aux paramètres et de retard, la stratégie a encore beaucoup de place pour l’amélioration grâce à l’orientation optimisée proposée.

Code source de la stratégie
/*backtest
start: 2024-02-22 00:00:00
end: 2024-12-06 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("MA9/MA21 Cross with ADX & CHOP Filter", overlay=true, initial_capital=10000, currency=currency.USD)

// ─── CUSTOM FUNCTIONS ──────────────────────────────────────────────────────
// Custom function to compute the sum over the last 'len' bars.
f_sum(src, len) =>
    s = 0.0
    for i = 0 to len - 1
        s += src[i]
    s

// Custom function to compute the highest value over the last 'len' bars.
f_highest(src, len) =>
    h = src[0]
    for i = 1 to len - 1
        h := math.max(h, src[i])
    h

// Custom function to compute the lowest value over the last 'len' bars.
f_lowest(src, len) =>
    l = src[0]
    for i = 1 to len - 1
        l := math.min(l, src[i])
    l

// ─── INPUTS ──────────────────────────────────────────────────────────────
ma9Period   = input.int(9, title="MA 9 Period", minval=1)
ma21Period  = input.int(21, title="MA 21 Period", minval=1)
adxLength   = input.int(7, title="ADX Smoothing / DI Length", minval=1)
adxThresh   = input.float(20.0, title="ADX Threshold", step=0.1)
chopLen     = input.int(7, title="CHOP Length", minval=1)
chopOff     = input.int(0, title="CHOP Offset", minval=0)  // Not applied in calculation
chopThresh  = input.float(50.0, title="CHOP Maximum (do not trade if above)", step=0.1)

// ─── CALCULATE INDICATORS ────────────────────────────────────────────────────
// Moving Averages
ma9  = ta.sma(close, ma9Period)
ma21 = ta.sma(close, ma21Period)

// --- True Range Calculation ---
// Manual implementation of true range (tr)
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))), math.abs(low - nz(close[1])))

// --- ADX Calculation (Manual Implementation) ---
// Calculate directional movements
upMove   = high - nz(high[1])
downMove = nz(low[1]) - low
plusDM   = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM  = (downMove > upMove and downMove > 0) ? downMove : 0.0

// Smooth the values using the built-in rma function
atr      = ta.rma(tr, adxLength)
plusDI   = 100 * ta.rma(plusDM, adxLength) / atr
minusDI  = 100 * ta.rma(minusDM, adxLength) / atr
dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
adxValue = ta.rma(dx, adxLength)

// --- Choppiness Index Calculation ---
// Compute the sum of true range over chopLen periods
atrSum      = f_sum(tr, chopLen)
// Compute highest high and lowest low over chopLen periods using custom functions
highestHigh = f_highest(high, chopLen)
lowestLow   = f_lowest(low, chopLen)
priceRange  = highestHigh - lowestLow
chop        = priceRange != 0 ? 100 * math.log(atrSum / priceRange) / math.log(chopLen) : 0

// ─── STRATEGY CONDITIONS ─────────────────────────────────────────────────────
// MA Crossover Signals
longCond  = ta.crossover(ma9, ma21)
shortCond = ta.crossunder(ma9, ma21)

// Filter: Only trade if ADX > threshold and CHOP ≤ threshold.
filterCond = (adxValue > adxThresh) and (chop <= chopThresh)

// Entries and Exits
if longCond and filterCond
    strategy.entry("Long", strategy.long)
if shortCond and filterCond
    strategy.entry("Short", strategy.short)
if shortCond
    strategy.close("Long")
if longCond
    strategy.close("Short")

// ─── PLOTTING ──────────────────────────────────────────────────────────────
plot(ma9, color=color.red, title="MA 9")
plot(ma21, color=color.blue, title="MA 21")
plot(adxValue, title="ADX", color=color.purple)
hline(adxThresh, title="ADX Threshold", color=color.purple, linestyle=hline.style_dotted)
plot(chop, title="CHOP", color=color.orange)
hline(chopThresh, title="CHOP Threshold", color=color.orange, linestyle=hline.style_dotted)