
La stratégie d’indicateur de tendance des moyennes dynamiques de l’ADX est une stratégie de négociation quantitative qui utilise les indicateurs de l’ADX pour déterminer la force et la direction des tendances du marché. La stratégie détermine si le marché est en tendance en calculant l’indicateur de tendance moyenne ((ADX) et la direction de la tendance en calculant l’indicateur positif ((DI +) et l’indicateur négatif ((DI -)) pour générer des signaux d’achat et de vente.
La stratégie utilise d’abord l’indicateur ADX pour déterminer si le marché est en tendance. Lorsque l’ADX est supérieur à la valeur clé définie par l’utilisateur (par défaut 23), la tendance du marché est forte. Lorsque la valeur actuelle de l’ADX est supérieure à la valeur de n jours avant l’ADX (par défaut 3 jours), l’ADX est en hausse et la tendance du marché se forme.
La stratégie utilise ensuite les valeurs DI+ et DI- pour déterminer la direction de la tendance du marché. Lorsque DI+ est supérieur à DI-, le marché est en hausse; lorsque DI+ est inférieur à DI-, le marché est en baisse.
Enfin, la stratégie de synthèse juge l’ADX et le DI et génère des signaux d’achat et de vente spécifiques:
La stratégie fournit également des fonctionnalités telles que le filtrage des moyennes mobiles et des intervalles de temps de rétroaction personnalisés, qui peuvent être configurés selon les besoins.
La stratégie d’indicateur de tendance des moyennes dynamiques de l’ADX présente les avantages suivants:
Cette stratégie comporte aussi des risques:
Pour atténuer les risques, il faut tenir compte des points suivants:
Cette stratégie peut être optimisée dans les domaines suivants:
La stratégie de l’indicateur de tendance ADX utilise l’ADX pour juger de l’existence d’une tendance et le DI pour juger de la direction de la tendance, pour générer des signaux de négociation lorsque la tendance est présente, l’idée de la stratégie est claire. La stratégie peut juger automatiquement de la tendance, suivre la tendance et, dans une certaine mesure, éviter les transactions inefficaces sur les marchés non tendance.
/*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')