Stratégie de tendance de l'ADX

Auteur:ChaoZhang est là., Date: 2024-01-16 15h57 et 17h
Les étiquettes:

img

Résumé

Cette stratégie utilise l'indicateur ADX pour déterminer la tendance du marché, se combine avec l'indicateur DMI pour déterminer la direction, utilise la pente ADX pour mesurer la force de la tendance, définit le niveau clé ADX pour filtrer les marchés non tendance et utilise une moyenne mobile pour filtrer les signaux commerciaux.

La logique de la stratégie

  1. Calculer les indicateurs ADX, DI+ et DI-
  2. La pente de l'ADX > 0 indique une tendance à la hausse; le niveau clé est fixé à 23 pour filtrer les marchés qui ne présentent pas de tendance.
  3. DI+ au-dessus de DI- signifie que l'élan haussier annule l'élan baissier, ce qui donne un signal d'achat.
  4. Lorsque le filtre des moyennes mobiles est activé, les signaux d'achat ne sont générés que lorsque la clôture est supérieure à la moyenne mobile.
  5. Fermer les positions lorsque la pente de l'ADX est < 0, ce qui indique une tendance à la baisse.

Analyse des avantages

  1. Le filtre MA réduit le bruit des transactions sur les marchés qui ne connaissent pas de tendance.
  2. La pente ADX détermine avec précision la force de la tendance.
  3. DI indique la direction combinée avec ADX pour la force forme un système de trading de tendance robuste.
  4. Il faut s'attendre à un tirage inférieur et à un facteur de bénéfice plus élevé que les stratégies simples de MA.

Analyse des risques

  1. Les résultats de l'ADX varient considérablement selon les différents paramètres d'entrée.
  2. Le DMI peut donner de faux signaux avant que la direction ne soit clairement déterminée.
  3. Il y a un certain retard, ce qui réduit l'efficacité de la stratégie.

Directions d'optimisation

  1. Optimiser les paramètres ADX pour obtenir les meilleurs résultats.
  2. Ajouter le stop loss à la perte limite sur les transactions uniques.
  3. Essayez de combiner d'autres indicateurs pour filtrer les signaux, par exemple RSI, Bollinger Bands.

Résumé

Cette stratégie utilise pleinement la force de l'ADX dans la détermination de la tendance et de l'élan, combinée avec le DMI pour l'analyse de direction, formant un système complet de suivi de tendance. Le filtre MA réduit efficacement le bruit.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 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