Matrice de moyenne mobile adaptative multidimensionnelle et stratégie de trading de précision dynamique ATR

MA ATR HMA TEMA DEMA VWMA ZLEMA ALMA KAMA EMA SMA WMA
Date de création: 2025-04-16 15:50:36 Dernière modification: 2025-04-16 15:50:36
Copier: 0 Nombre de clics: 412
2
Suivre
319
Abonnés

Matrice de moyenne mobile adaptative multidimensionnelle et stratégie de trading de précision dynamique ATR Matrice de moyenne mobile adaptative multidimensionnelle et stratégie de trading de précision dynamique ATR

Aperçu

Le cœur de la stratégie est de combiner plusieurs types de filtres de moyenne mobile et d’ATR (Average True Range) pour former une matrice de négociation hautement flexible et adaptable. En capturant avec précision les tendances et la volatilité du marché, la stratégie est capable d’identifier des entrées et des sorties à forte probabilité dans des environnements de négociation à haute fréquence, tout en appliquant des mesures rigoureuses de contrôle du risque.

Principe de stratégie

Le principe de base de cette stratégie repose sur la collaboration de plusieurs composants clés:

  1. Matrice de moyenne mobile élevéeLe système utilise deux moyennes mobiles (Fast et Slow) comme principaux indicateurs de tendance, leur croisement et leur position relative pour générer des signaux de trading de base.

  2. Gestion des risques basée sur l’ATRLa stratégie consiste à mesurer la volatilité du marché à l’aide de l’indicateur ATR et à l’appliquer dans plusieurs domaines:

    • Évaluation de la volatilité: utilisation du ratio ATR/prix de clôture comme critère de filtrage de la volatilité
    • Filtre d’entrée: assure que le prix doit être suffisamment éloigné de la moyenne mobile lente (en multipliant par ATR) pour entrer
    • Contrôle du risque dynamique: arrêt fixe, profit cible et suivi du stop loss basé sur l’ATR, permettant une gestion du risque adaptée à la volatilité du marché actuel
  3. Filtrage des tendances à plusieurs périodesStratégie: Renforcer la fiabilité du signal en interrogeant les tendances des moyennes mobiles sur des périodes de temps plus longues (environ 15 minutes) et en veillant à ce que la direction des transactions soit cohérente avec les grandes tendances du marché.

  4. Vérification du volume et des fenêtres de temps: les transactions sont exécutées uniquement lorsque les exigences de volume de transaction minimum sont remplies, en cas de rupture de volume de transaction et dans une fenêtre de temps de transaction prédéfinie, ce qui améliore encore la qualité des transactions.

  5. Logistique de génération de signaux

    • Conditions multiples: prix supérieurs aux moyennes mobiles rapides et lentes, moyennes mobiles rapides supérieures aux moyennes mobiles lentes, tout en respectant le filtre ATR, les conditions de transaction et les exigences de fenêtre de temps
    • Condition de tête vide: condition correspondante dans le cas contraire
  6. Logique de sortie globaleLa stratégie utilise un mécanisme de sortie à trois niveaux: arrêt fixe (multiples de l’ATR), profit cible (multiples de l’ATR) et arrêt suivi (ajustement dynamique basé sur l’ATR), offrant une protection complète contre le risque pour chaque transaction.

Avantages stratégiques

L’analyse du code de la stratégie permet de résumer les avantages notables suivants:

  1. Une grande capacité d’adaptationLa flexibilité permet au trader de choisir l’indicateur optimal en fonction de l’environnement actuel du marché sans avoir à réécrire l’ensemble de la stratégie.

  2. Gestion dynamique des risquesLe mécanisme de contrôle des risques basé sur l’ATR assure que les objectifs de stop-loss et de profit s’ajustent automatiquement en fonction de la volatilité du marché. Cette méthode offre une meilleure protection dans les marchés plus volatiles, tout en permettant de capturer plus de bénéfices dans les marchés tendanciels.

  3. Filtrage des signaux à plusieurs niveauxEn combinant le croisement des moyennes mobiles, l’analyse des volumes de transactions, les marges de volatilité et le filtrage des tendances sur plusieurs périodes, la stratégie réduit efficacement les signaux erronés et améliore la qualité des transactions. La fonction de filtrage des tendances, en particulier sur les périodes de 15 minutes, réduit considérablement la possibilité de négocier à contre-courant.

  4. Les conditions précises d’entréeCette stratégie repose non seulement sur la croisée des indicateurs techniques, mais exige également une distance ATR suffisante entre les prix et les moyennes mobiles lentes, ce qui permet d’éviter les transactions fréquentes sur les marchés horizontaux et de réduire les pertes causées par les fausses ruptures.

  5. Une surveillance transparente des performancesLe tableau de bord intégré fournit un affichage en temps réel des indicateurs de performance clés, y compris le bénéfice/perte actuel, l’équité, l’ATR (la valeur brute et le pourcentage) et l’écart entre les moyennes mobiles, permettant aux traders d’évaluer l’état de la stratégie à tout moment.

Risque stratégique

Malgré la bonne conception de cette stratégie, les risques potentiels sont les suivants:

  1. piège d’optimisation des paramètres: la stratégie contient de nombreux paramètres (type et période de la moyenne mobile, cycle ATR et multiplications, etc.), une optimisation excessive peut entraîner une adéquation de la courbe, ce qui rend la stratégie moins performante dans les transactions sur le marché réel. La solution consiste à effectuer des tests robustes sur les marchés et les périodes de temps afin d’éviter un ajustement excessif des paramètres.

  2. Le risque d’une reprise rapide: Malgré l’utilisation d’ATR stop loss dynamique, lors d’un revirement soudain du marché (comme après une annonce majeure), les prix peuvent sauter avant le déclenchement d’un stop loss, entraînant des pertes supérieures à celles attendues. Il est recommandé d’appliquer des contrôles de risque supplémentaires la nuit ou de suspendre les transactions avant des événements à forte volatilité.

  3. Signal retardé: Toutes les moyennes mobiles sont intrinsèquement retardées. Même des variantes à faible latence comme HMA ou ZLEMA peuvent manquer leur point d’entrée idéal dans un marché rapide.

  4. Dépendance au volume des livraisons: la stratégie émet un signal lorsque le volume de transactions augmente, mais dans certains marchés ou périodes, le volume de transactions peut être trompeur. Si nécessaire, ajustez le filtre de volume de transactions ou envisagez de désactiver cette fonction dans certaines conditions de marché.

  5. Limite de la fenêtre de tempsIl est recommandé d’ajuster les horaires de négociation en fonction des heures les plus actives de chaque marché.

Orientation de l’optimisation de la stratégie

Après analyse du code, voici quelques pistes d’optimisation possibles:

  1. Adaptation des paramètresUne optimisation avancée est la mise en place de paramètres qui s’adaptent automatiquement en fonction de l’état du marché (trend, volatilité, gamme). Par exemple, il est possible d’augmenter automatiquement le coefficient ATR pendant les périodes de forte volatilité ou de changer de type de moyenne mobile dans différents environnements de marché.

  2. Intégrer des modèles d’apprentissage automatique: par l’introduction d’une couche d’apprentissage automatique permettant de prédire quel type de moyenne mobile est susceptible de fonctionner le mieux dans les conditions actuelles du marché, afin de choisir automatiquement la combinaison de moyennes mobiles optimale. Cela peut être réalisé en analysant la performance relative des différents indicateurs dans les données historiques.

  3. Identifier les tendances à l’améliorationEn plus des filtres de tendance de 15 minutes existants, des algorithmes de reconnaissance de tendance plus complexes, tels que l’indice Hurst ou l’indicateur de mouvement directionnel (DMI), peuvent être intégrés pour déterminer plus précisément l’intensité et la continuité des tendances.

  4. Renforcement des stratégies de sortieLes stratégies d’exit actuelles peuvent être optimisées en ajoutant des signaux d’exit basés sur la structure du marché, tels que la rupture de la ligne de tendance, des points de support/résistance critiques ou des changements brusques de volatilité. Cela peut aider à verrouiller les bénéfices avant la fin de la tendance.

  5. Taille de la position ajustée au risque: réaliser un ajustement dynamique de la taille des positions basé sur la volatilité actuelle et les fonds du compte, plutôt que d’utiliser un nombre fixe de transactions. Par exemple, réduire les positions pendant les périodes de forte volatilité et augmenter modérément les positions pendant les périodes de faible volatilité afin d’optimiser le ratio de retour sur risque.

  6. Filtrage des marchés concernés: améliorer la qualité des signaux en surveillant les marchés pertinents (attention au VIX pour les transactions sur des indices boursiers) ou la corrélation entre les actifs. La crédibilité des transactions peut être augmentée lorsque les marchés pertinents affichent des mouvements directionnels cohérents.

Résumer

La stratégie de trading de précision dynamique avec une matrice de moyennes mobiles multidimensionnellement auto-adaptative représente une méthode de trading quantitative complète et avancée. En combinant les avantages de plusieurs types de moyennes mobiles avec un contrôle rigoureux des risques de base ATR, la stratégie est capable de s’adapter à différentes conditions de marché tout en maintenant une bonne gestion des risques.

La véritable valeur de cette stratégie réside dans sa flexibilité et son adaptabilité, permettant aux traders de la personnaliser en fonction de leur marché et de leurs préférences personnelles en matière de risque. Il existe un potentiel d’amélioration de la performance de la stratégie grâce à l’orientation de l’optimisation proposée, en particulier l’ajustement des paramètres d’adaptation et l’intégration de l’apprentissage automatique.

Pour les traders qui cherchent à utiliser un système technique et discipliné dans un environnement de trading à haute fréquence, cette stratégie offre un cadre solide, combinant la précision technique et la maîtrise des risques, deux éléments indispensables. Il est important que les traders vérifient la performance de la stratégie dans leur marché cible par un retour complet et des transactions simulées, et effectuent les ajustements nécessaires en fonction de l’environnement de trading spécifique.

Code source de la stratégie
/*backtest
start: 2024-04-16 00:00:00
end: 2025-04-15 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Dskyz (DAFE) MAtrix with ATR-Powered Precision", 
     overlay=true, 
     default_qty_type=strategy.fixed, 
     initial_capital=1000000, 
     commission_value=0, 
     slippage=1, 
     pyramiding=10)

// ==================================================================
// USER-DEFINED FUNCTIONS
// ==================================================================

// Hull Moving Average (HMA)
hma(src, len) =>
    halfLen = math.round(len * 0.5)
    sqrtLen = math.round(math.sqrt(len))
    wmaf = ta.wma(src, halfLen)
    wmaFull = ta.wma(src, len)
    ta.wma(2 * wmaf - wmaFull, sqrtLen)

// Triple Exponential Moving Average (TEMA)
tema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    ema3 = ta.ema(ema2, len)
    3 * (ema1 - ema2) + ema3

// Double Exponential Moving Average (DEMA)
dema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    2 * ema1 - ema2

// VWMA - Volume Weighted Moving Average
vwma(src, len) =>
    ta.vwma(src, len)

// ZLEMA - Zero Lag EMA
zlema(src, len) =>
    lag = math.floor((len - 1) / 2)
    ta.ema(2 * src - src[lag], len)

// ALMA - Arnaud Legoux Moving Average
alma(src, len, offset=0.85, sigma=6) =>
    ta.alma(src, len, offset, sigma)

// Custom Kaufman Adaptive Moving Average (KAMA)
kama(src, len) =>
    fastSC = 2.0 / (2 + 1)
    slowSC = 2.0 / (30 + 1)
    change = math.abs(src - src[len])
    volatility = 0.0
    for i = 0 to len - 1
        volatility += math.abs(src - src[i])
    er = volatility != 0 ? change / volatility : 0.0
    sc = math.pow(er * (fastSC - slowSC) + slowSC, 2)
    var float kama_val = na
    kama_val := na(kama_val) ? ta.sma(src, len) : kama_val + sc * (src - kama_val)
    kama_val

// ==================================================================
// INPUTS
// ==================================================================

fastLength   = input.int(9, "[MA] Fast MA Length", minval=1)
slowLength   = input.int(19, "[MA] Slow MA Length", minval=1)
fastMAType   = input.string("SMA", "Fast MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])
slowMAType   = input.string("SMA", "Slow MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])

atrPeriod           = input.int(14, "ATR Period", minval=1)
atrMultiplier       = input.float(1.5, "ATR Multiplier for Filter", minval=0.1, step=0.1)
useTrendFilter      = input.bool(true, "[Filter Settings] Use 15m Trend Filter")
minVolume           = input.int(10, "Minimum Volume", minval=1)
volatilityThreshold = input.float(1.0, "Volatility Threshold (%)", minval=0.1, step=0.1) / 100
tradingStartHour    = input.int(9, "Trading Start Hour (24h)", minval=0, maxval=23)
tradingEndHour      = input.int(16, "Trading End Hour (24h)", minval=0, maxval=23)
trailOffset         = input.float(0.5, "[Exit Settings] Trailing Stop Offset ATR Multiplier", minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, "Profit Target ATR Multiplier", minval=0.1, step=0.1)
fixedStopMultiplier = input.float(1.3, "Fixed Stop Multiplier", minval=0.5, step=0.1)
fixedQuantity       = input.int(2, "Trade Quantity", minval=1)

resetDashboard      = input.bool(false, "Reset Dashboard Stats")

// ==================================================================
// CALCULATIONS
// ==================================================================

volumeOk    = volume >= minVolume
currentHour = hour(time)
timeWindow  = currentHour >= tradingStartHour and currentHour <= tradingEndHour
volumeSpike = volume > 1.2 * ta.sma(volume, 10)

// ATR Calculation
atr          = ta.atr(atrPeriod)
volatility   = nz(atr / close, 0)
volatilityOk = volatility <= volatilityThreshold

// ==================================================================
// MOVING AVERAGES CALCULATIONS
// ==================================================================

var float fastMA = na
var float slowMA = na

// Fast MA Logic
if fastMAType == "SMA"
    fastMA := ta.sma(close, fastLength)
else if fastMAType == "EMA"
    fastMA := ta.ema(close, fastLength)
else if fastMAType == "SMMA"
    fastMA := ta.rma(close, fastLength)
else if fastMAType == "HMA"
    fastMA := hma(close, fastLength)
else if fastMAType == "TEMA"
    fastMA := tema(close, fastLength)
else if fastMAType == "WMA"
    fastMA := ta.wma(close, fastLength)
else if fastMAType == "VWMA"
    fastMA := vwma(close, fastLength)
else if fastMAType == "ZLEMA"
    fastMA := zlema(close, fastLength)
else if fastMAType == "ALMA"
    fastMA := alma(close, fastLength)
else if fastMAType == "KAMA"
    fastMA := kama(close, fastLength)
else if fastMAType == "DEMA"
    fastMA := dema(close, fastLength)

// Slow MA Logic
if slowMAType == "SMA"
    slowMA := ta.sma(close, slowLength)
else if slowMAType == "EMA"
    slowMA := ta.ema(close, slowLength)
else if slowMAType == "SMMA"
    slowMA := ta.rma(close, slowLength)
else if slowMAType == "HMA"
    slowMA := hma(close, slowLength)
else if slowMAType == "TEMA"
    slowMA := tema(close, slowLength)
else if slowMAType == "WMA"
    slowMA := ta.wma(close, slowLength)
else if slowMAType == "VWMA"
    slowMA := vwma(close, slowLength)
else if slowMAType == "ZLEMA"
    slowMA := zlema(close, slowLength)
else if slowMAType == "ALMA"
    slowMA := alma(close, slowLength)
else if slowMAType == "KAMA"
    slowMA := kama(close, slowLength)
else if slowMAType == "DEMA"
    slowMA := dema(close, slowLength)

// ==================================================================
// TREND FILTER & SIGNAL LOGIC
// ==================================================================

// Retrieve 15-minute MAs for trend filtering
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, "15", [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m    = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0
trendLongOk = not useTrendFilter or trend15m >= 0
trendShortOk= not useTrendFilter or trend15m <= 0

// ATR-based Price Filter
atrFilterLong  = close > slowMA + atr * atrMultiplier
atrFilterShort = close < slowMA - atr * atrMultiplier

// Signal Logic: MA alignment + filters
maAbove       = close > fastMA and fastMA > slowMA
maBelow       = close < fastMA and fastMA < slowMA
longCondition = maAbove and trendLongOk and atrFilterLong and volumeOk and volumeSpike and timeWindow and volatilityOk
shortCondition= maBelow and trendShortOk and atrFilterShort and volumeOk and volumeSpike and timeWindow and volatilityOk

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

if strategy.position_size == 0 and longCondition
    strategy.entry("Long", strategy.long, qty=fixedQuantity)
if strategy.position_size == 0 and shortCondition
    strategy.entry("Short", strategy.short, qty=fixedQuantity)

// ==================================================================
// EXIT LOGIC
// ==================================================================
if strategy.position_size > 0
    strategy.exit("Long Exit", "Long",
         stop  = strategy.position_avg_price - atr * fixedStopMultiplier,
         limit = strategy.position_avg_price + atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)
if strategy.position_size < 0
    strategy.exit("Short Exit", "Short",
         stop  = strategy.position_avg_price + atr * fixedStopMultiplier,
         limit = strategy.position_avg_price - atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)

// ==================================================================
// VISUALS: PLOT MAs
// ==================================================================

plot(fastMA, color=color.blue, linewidth=2, title="Fast MA")
plot(slowMA, color=color.red, linewidth=2, title="Slow MA")

// ==================================================================
// METRICS CALCULATIONS (for Dashboard)
// ==================================================================

// Additional metrics:
atrPct   = close != 0 ? (atr / close) * 100 : na               // ATR as percentage of Close
maGapPct = (slowMA != 0) ? (math.abs(fastMA - slowMA) / slowMA) * 100 : na  // % difference between MAs

// Open PnL Calculation
currentPnL = strategy.position_size != 0 ? (close - strategy.position_avg_price) * strategy.position_size : 0

// Persistent variable for highest equity (for drawdown calculation)
var float highestEquity = strategy.equity
highestEquity := math.max(highestEquity, strategy.equity)
totalDrawdown = strategy.equity - highestEquity

// Reset dashboard metrics if reset toggle is on.
if resetDashboard
    highestEquity := strategy.equity

// ==================================================================
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
// ==================================================================
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
if barstate.islast
    table.cell(watermarkTable, 0, 0, "⚡ Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)

// ==================================================================
// DASHBOARD: METRICS TABLE (Bottom-Left)
// ==================================================================
var table dashboard = table.new(position.middle_right, 2, 12, bgcolor=color.new(#000000, 29), border_color=color.rgb(80, 80, 80), border_width=1)
if barstate.islast
    // Row 0 – Dashboard Title (duplicated in both columns to simulate spanning)
    table.cell(dashboard, 0, 0, "⚡(DAFE) Trading Systems", text_color=color.rgb(135, 135, 135), text_size=size.small)
    
    // Row 1 – Position
    table.cell(dashboard, 0, 1, "Position", text_color=color.gray)
    positionText = strategy.position_size > 0 ? "Long" : strategy.position_size < 0 ? "Short" : "Flat"
    table.cell(dashboard, 1, 1, positionText, text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
    
    // Row 2 – Current PnL
    table.cell(dashboard, 0, 2, "Current P/L", text_color=color.gray)
    table.cell(dashboard, 1, 2, str.tostring(currentPnL, "#.##"), text_color=(currentPnL > 0 ? color.green : currentPnL < 0 ? color.red : color.gray))
    
    // Row 3 – Equity
    table.cell(dashboard, 0, 3, "Equity", text_color=color.gray)
    table.cell(dashboard, 1, 3, str.tostring(strategy.equity, "#.##"), text_color=color.white)

    // Row 4 – Closed Trades
    table.cell(dashboard, 0, 4, "Closed Trades", text_color=color.gray)
    table.cell(dashboard, 1, 4, str.tostring(strategy.closedtrades), text_color=color.white)

    // Row 5 – Title Step
    table.cell(dashboard, 0, 5, "Metrics", text_color=color.rgb(76, 122, 23))
   
    // Row 6 – Fast MA
    table.cell(dashboard, 0, 6, "Fast MA", text_color=color.gray)
    table.cell(dashboard, 1, 6, str.tostring(fastMA, "#.##"), text_color=color.white)
    
    // Row 7 – Slow MA
    table.cell(dashboard, 0, 7, "Slow MA", text_color=color.gray)
    table.cell(dashboard, 1, 7, str.tostring(slowMA, "#.##"), text_color=color.white)
    
    // Row 8 – ATR (Raw)
    table.cell(dashboard, 0, 8, "ATR", text_color=color.gray)
    table.cell(dashboard, 1, 8, str.tostring(atr, "#.##"), text_color=color.white)
    
    // Row 9 – ATR (%)
    table.cell(dashboard, 0, 9, "ATR (%)", text_color=color.gray)
    table.cell(dashboard, 1, 9, str.tostring(atrPct, "#.##") + "%", text_color=color.white)
    
    // Row 10 – MA Gap (%)
    table.cell(dashboard, 0, 10, "MA Gap (%)", text_color=color.gray)
    table.cell(dashboard, 1, 10, na(maGapPct) ? "N/A" : str.tostring(maGapPct, "#.##") + "%", text_color=color.white)
    
    // Row 11 – Volatility (%)
    table.cell(dashboard, 0, 11, "Volatility (%)", text_color=color.gray)
    table.cell(dashboard, 1, 11, str.tostring(volatility * 100, "#.##") + "%", text_color=color.white)