Estrategia de tendencia de impulso de la ADX

El autor:¿ Qué pasa?, Fecha: 2024-01-16 15:57:17
Las etiquetas:

img

Resumen general

Esta estrategia utiliza el indicador ADX para determinar la tendencia del mercado, se combina con el indicador DMI para determinar la dirección, utiliza la pendiente ADX para medir la fuerza de la tendencia, establece el nivel clave ADX para filtrar los mercados que no están en tendencia y utiliza un promedio móvil para filtrar las señales comerciales.

Estrategia lógica

  1. Calcular los indicadores ADX, DI+ y DI-
  2. La pendiente del ADX > 0 indica una tendencia al alza; el nivel clave se establece en 23 para filtrar los mercados que no están en tendencia.
  3. DI+ por encima de DI- significa que el impulso alcista anula el impulso bajista, dando una señal de compra.
  4. Cuando el filtro de la media móvil esté habilitado, solo se generarán señales de compra cuando el cierre esté por encima de la media móvil.
  5. Cierre de posiciones cuando la pendiente ADX < 0, lo que indica una tendencia a la disminución.

Análisis de ventajas

  1. El filtro MA reduce el ruido de las operaciones en los mercados que no están en tendencia.
  2. La pendiente del ADX determina con precisión la fuerza de la tendencia.
  3. DI indica la dirección combinado con ADX para la fuerza forma un sistema de trading de tendencia robusto.
  4. Se espera una reducción de la absorción y un mayor factor de ganancia que las estrategias simples de MA.

Análisis de riesgos

  1. Los resultados del ADX varían significativamente según los diferentes parámetros de entrada.
  2. El DMI puede emitir señales falsas antes de que se determine claramente la dirección.
  3. Existe un cierto retraso, lo que reduce la eficiencia de la estrategia.

Direcciones de optimización

  1. Optimice los parámetros de ADX para obtener los mejores resultados.
  2. Añadir stop loss para limitar la pérdida en operaciones individuales.
  3. Intente combinar otros indicadores para filtrar las señales, por ejemplo, RSI, bandas de Bollinger.

Resumen de las actividades

Esta estrategia utiliza plenamente la fuerza de ADX en la determinación de tendencia e impulso, combinada con DMI para el análisis de dirección, formando un sistema completo de seguimiento de tendencia. El filtro MA reduce eficazmente el ruido.


/*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')

Más.