Stratégie de tendance dynamique de l'ADX

Auteur:ChaoZhang est là., Date: 2024-01-15 15h32 et 45 min
Les étiquettes:

img

Résumé

L'ADX Dynamic Trend Strategy est une stratégie de trading quantitative qui utilise l'indicateur ADX pour déterminer la force et la direction des tendances du marché.

Logique de négociation

La stratégie utilise d'abord l'indicateur ADX pour déterminer si une tendance existe sur le marché. Lorsque l'ADX est au-dessus d'un niveau clé défini par l'utilisateur (par défaut 23), il indique que la tendance du marché est relativement forte. Lorsque la valeur actuelle de l'ADX est supérieure à la valeur de l'ADX il y a n jours (n est la période de rétrospective définie par l'utilisateur, par défaut 3 jours), elle indique que l'ADX est en hausse et qu'une tendance se forme sur le marché.

La stratégie utilise ensuite DI+ et DI- pour déterminer la direction de la tendance du marché. Lorsque DI+ est supérieur à DI-, il indique une tendance haussière sur le marché. Lorsque DI+ est inférieur à DI-, il indique une tendance à la baisse sur le marché.

Enfin, la stratégie combine l'analyse ADX et l'analyse DI pour générer des signaux d'achat et de vente spécifiques:

  1. Lorsque l'ADX augmente et est supérieur au niveau clé et que DI+ est supérieur à DI-, un signal d'achat est généré
  2. Lorsque l'ADX augmente et est supérieur au niveau clé et que DI+ est inférieur à DI-, un signal de vente est généré
  3. Lorsque l'ADX tourne à la baisse, un signal de position plat est généré

La stratégie fournit également des fonctionnalités telles que le filtrage des moyennes mobiles et une plage de temps de backtesting personnalisable.

Analyse des avantages

La stratégie de tendance dynamique ADX présente les avantages suivants:

  1. Détecte automatiquement l'existence de tendances du marché, évitant ainsi des transactions inefficaces
  2. Déterminer automatiquement la direction des tendances du marché pour la tendance suivante
  3. Une logique claire d'achat sur l'existence de la tendance et d'aplatissement sur la disparition de la tendance
  4. Filtrage des moyennes mobiles configurables pour éviter les fausses ruptures
  5. Plage de temps de backtesting personnalisable pour les tests antérieurs
  6. Paramètres d'indicateur réglables pour l'optimisation entre différents produits

Analyse des risques

La stratégie comporte également certains risques:

  1. L'indicateur ADX a un effet de retard, éventuellement en l'absence d'opportunités de tendance précoce
  2. La dépendance à l'égard de l'indice de tendance peut produire de faux signaux car l'indice de tendance est sensible.
  3. Filtre à moyenne mobile peut manquer des opportunités à court terme
  4. Un délai de rétro-test inapproprié peut entraîner un surajustement
  5. Des paramètres d'indicateur inappropriés peuvent affecter les performances de la stratégie

Pour atténuer les risques, les mesures suivantes peuvent être prises:

  1. Réduire les délais de mise en œuvre des paramètres ADX
  2. Retirer ou régler le filtre DI pour éviter les faux signaux
  3. Réduction de la durée de la moyenne mobile
  4. Élargir le délai de backtesting pour un test complet de l'échantillon
  5. Optimiser les paramètres pour trouver les meilleurs paramètres

Des possibilités d'amélioration

La stratégie peut être améliorée par les aspects suivants:

  1. Test du portefeuille sur plusieurs stocks pour diversifier le risque d'un seul stock
  2. Ajouter une logique de stop-loss au contrôle par perte de transaction
  3. Combiner avec d'autres indicateurs pour la vérification du signal afin d'améliorer la précision
  4. Introduction d'algorithmes d'apprentissage automatique pour la génération de signaux d'achat/de vente
  5. Ajouter le module de réglage automatique des paramètres pour un réglage dynamique

Conclusion

L'ADX Dynamic Trend Strategy utilise l'ADX pour déterminer l'existence d'une tendance et l'DI pour la direction de la tendance. Il génère des signaux de trading lorsqu'une tendance existe et aplatit les positions lorsque la tendance disparaît. La logique est claire. En détectant et en suivant automatiquement les tendances, le trading inefficace peut être évité dans une certaine mesure sur les marchés non-trending. Avec une amélioration appropriée, cette stratégie peut devenir un outil puissant pour le trading quantitatif à moyen et long terme.


/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')

Plus de