Estrategia de tendencia de impulso ADX


Fecha de creación: 2024-01-16 15:57:17 Última modificación: 2024-01-16 15:57:17
Copiar: 0 Número de Visitas: 762
1
Seguir
1617
Seguidores

Estrategia de tendencia de impulso ADX

Descripción general

La estrategia se basa en el indicador ADX para determinar la tendencia del mercado, en combinación con el indicador DMI para determinar la dirección de la pluralidad de espacios, el uso de la pendiente ADX para determinar la fuerza de la tendencia, la configuración de los valores clave de ADX para filtrar los mercados no tendenciales, auxiliado por la media móvil para filtrar las señales de negociación.

Principio de estrategia

  1. Calcular los indicadores ADX, DI+ y DI-
  2. La inclinación del ADX es >0, lo que indica una tendencia creciente; el valor clave se establece en 23, para filtrar los mercados no tendenciales.
  3. El DI+ es mayor que el DI-, lo que indica que la fuerza de las cabezas es mayor que la fuerza de las cabezas, para ver más señales.
  4. Cuando se activa el filtro de media móvil, solo se genera una señal de múltiples cabezas cuando el precio de cierre es superior a la media móvil.
  5. Cuando la inclinación del ADX es menor que 0, la tendencia disminuye.

Análisis de las ventajas

  1. El filtro de MA auxiliar reduce el ruido de las operaciones en mercados fuera de tendencia.
  2. La inclinación de la ADX permite determinar con precisión el desarrollo de la tendencia.
  3. La dirección de DI se combina con la capacidad de juicio de ADX para formar un sistema de toma de decisiones de comercio de tendencias más completo.
  4. El retiro y la pérdida son mejores que las estrategias simples de medias móviles.

Análisis de riesgos

  1. El índice ADX establece diferentes parámetros y los resultados varían considerablemente.
  2. El DMI aún no ha determinado completamente la dirección de la zona de sobrevuelo, por lo que es posible que haya emitido una señal errónea.
  3. Hay un cierto retraso que reduce la eficacia de la estrategia.

Dirección de optimización

  1. Optimización de la combinación de parámetros de ADX para encontrar el mejor parámetro.
  2. Aumentar las estrategias de stop loss para evitar que las pérdidas individuales se extiendan.
  3. Trate de combinar las señales de filtración con otros indicadores, como el RSI, la banda de Brin.

Resumir

La estrategia aprovecha al máximo las ventajas de ADX para juzgar la tendencia y la intensidad de la tendencia, en combinación con la dirección de juicio del indicador DMI, para formar un sistema de seguimiento de tendencias completo. Al mismo tiempo, la media móvil puede ayudar a filtrar eficazmente el ruido de los mercados que no son de tendencia. La optimización de los parámetros y la combinación de indicadores también pueden mejorar aún más la estabilidad y la eficiencia de la estrategia.

Código Fuente de la Estrategia
/*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')