
La estrategia de indicadores de tendencia de media dinámica ADX es una estrategia de negociación cuantitativa que utiliza indicadores de ADX para determinar la fortaleza de la tendencia del mercado y la dirección de la tendencia. La estrategia determina si el mercado está en tendencia calculando el índice de dirección promedio ((ADX) y determina la dirección de la tendencia calculando el indicador positivo ((DI +) y el indicador negativo ((DI -)) para generar señales de compra y venta.
La estrategia utiliza primero el indicador ADX para determinar si hay una tendencia en el mercado. Cuando el ADX está por encima del valor clave establecido por el usuario (el valor por defecto es 23), la tendencia del mercado es fuerte. Cuando el valor actual del ADX es superior al valor de n días antes del ADX (el número de días de retrospección establecido por el usuario para n, el valor por defecto es 3 días), el ADX está subiendo y la tendencia del mercado se está formando.
La estrategia utiliza el DI+ y el DI- para determinar la dirección de la tendencia del mercado. Cuando el DI+ es superior al DI-, el mercado está en tendencia alcista; cuando el DI+ es inferior al DI-, el mercado está en tendencia bajista.
Por último, la estrategia de comprobación de la situación de ADX y DI, para generar señales concretas de compra y venta:
La estrategia también ofrece funciones como filtros de medias móviles y rangos de tiempo de respuesta personalizados, que se pueden configurar según sea necesario.
La estrategia del indicador de tendencia de media dinámica ADX tiene las siguientes ventajas:
La estrategia también tiene sus riesgos:
Para reducir el riesgo, se pueden considerar los siguientes puntos:
La estrategia puede ser optimizada en los siguientes aspectos:
La estrategia de indicador de tendencia de la media dinámica ADX utiliza la existencia de tendencias en el ADX y la dirección de tendencias en el DI, para generar señales de negociación cuando la tendencia está presente. La estrategia es clara. La estrategia puede juzgar automáticamente la tendencia, seguir la tendencia y, en cierta medida, evitar las transacciones ineficaces en los mercados no tendencia.
/*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')