Una estrategia de tendencia adaptativa ATR-ADX V2

El autor:¿ Qué pasa?, Fecha: 2023-12-05 18:08:14
Las etiquetas:

img

Resumen general

Esta es una estrategia de seguimiento de tendencias que combina el indicador ATR y el indicador ADX. Ajusta dinámicamente el multiplicador ATR de acuerdo con las condiciones de tendencia del mercado para lograr un mejor seguimiento de tendencias.

Estrategia lógica

La estrategia se basa principalmente en el indicador ATR y el indicador ADX.

En primer lugar, calcula el True Range (ATR) y el ADX. ATR refleja la volatilidad del mercado, mientras que el ADX juzga la fuerza de la tendencia.

En segundo lugar, determina la dirección de la tendencia actual de acuerdo con la diferencia entre DI + y DI- en el indicador ADX. Si DI + es mayor que DI-, es una tendencia alcista. Si DI- es mayor que DI +, es una tendencia bajista.

Luego, cuando el ADX está subiendo, utiliza un multiplicador de ATR más grande (m1).

Finalmente, combinado con ATR y el punto medio del precio, calcula las bandas superior e inferior para determinar la dirección de la tendencia.

Por lo tanto, la estrategia incorpora ATR y ADX, y al ajustar dinámicamente los parámetros de ATR, puede capturar mejor las tendencias para el comercio.

Análisis de ventajas

La estrategia tiene varias ventajas obvias:

  1. Capaz de ajustar dinámicamente los parámetros para una mejor captura de tendencias
  2. Combina ATR y ADX para un juicio más completo
  3. Se prevé que las extracciones sean controladas
  4. Implementación sencilla y fácil de entender

Por lo tanto, esta es una tendencia muy práctica siguiendo una estrategia con un buen control de extracción.

Análisis de riesgos

La estrategia también tiene algunos riesgos:

  1. ADX tiene problemas rezagados, puede perder puntos de inversión de tendencia
  2. La selección incorrecta del tamaño del ATR puede dar lugar a un beneficio insuficiente o a un stop loss de gran tamaño
  3. La rápida ruptura contra las bandas causada por los eventos del cisne negro puede conducir a pérdidas.

Así que la optimización de parámetros y el control de riesgos necesitan atención. Además, los eventos de cisne negro pueden tener un mayor impacto.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Optimizar los parámetros de ATR y ADX para una mejor captura de tendencias
  2. Añadir otros indicadores para la confirmación para evitar problemas de retraso de ADX
  3. Construir mecanismos dinámicos de detención de pérdidas para controlar las pérdidas de operaciones individuales
  4. Ajustar el tamaño de las posiciones para diferentes entornos de mercado

Por lo tanto, todavía hay mucho espacio para la optimización mediante el ajuste de parámetros y mecanismos de acuerdo con los problemas.

Conclusión

En general, esta Estrategia de Tendencia Adaptativa ATR-ADX V2 funciona muy bien. Al ajustar dinámicamente los parámetros de ATR, captura las tendencias muy bien. Además, la combinación de dos indicadores en ATR y ADX lo hace más robusto. Pero aún necesitamos prestar atención al control de riesgos y la optimización para evitar pérdidas rezagadas y de gran tamaño. En general, la estrategia vale la pena aprender y aplicar.


/*backtest
start: 2022-11-28 00:00:00
end: 2023-12-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// From mortdiggiddy's indicator to strategy
// See also: https://www.tradingview.com/u/mortdiggiddy/

strategy(title = "Adaptive ATR-ADX Trend V2", shorttitle = "Adaptive ATR V2 Strategy", overlay = true)

//Mode
src = input(title = "Source",  defval = hlc3)
atrLen = input(title = "ATR",  defval = 21, minval = 1, maxval = 100)
m1 = input(title = "ATR Multiplier - ADX Rising", type = float, defval = 3.5, minval = 1, step = 0.1, maxval = 100)
m2 = input(title = "ATR Multiplier - ADX Falling", type = float, defval = 1.75, minval = 1, step = 0.1, maxval = 100)

adxLen = input(title = "ADX",  defval = 14, minval = 1, maxval = 100)
adxThresh = input(title = "ADX Threshold",  defval = 30, minval = 1)
aboveThresh = input(true, title = "ADX Above Threshold uses ATR Falling Multiplier Even if Rising?")
useHeiken = input(false, title = "Use Heiken-Ashi Bars (Source will be ohlc4)")
    
// DI-Pos, DI-Neg, ADX

hR = change(high)
lR = -change(low)

dmPos = hR > lR ? max(hR, 0) : 0
dmNeg = lR > hR ? max(lR, 0) : 0

sTR = nz(sTR[1]) - nz(sTR[1]) / adxLen + tr
sDMPos = nz(sDMPos[1]) - nz(sDMPos[1]) / adxLen + dmPos
sDMNeg = nz(sDMNeg[1]) - nz(sDMNeg[1]) / adxLen + dmNeg

DIP = sDMPos / sTR * 100
DIN = sDMNeg / sTR * 100
DX = abs(DIP - DIN) / (DIP + DIN) * 100
adx = sma(DX, adxLen)

// Heiken-Ashi

xClose = ohlc4
xOpen = (nz(xOpen[1]) + nz(close[1])) / 2
xHigh = max(high, max(xOpen, xClose))
xLow = min(low, min(xOpen, xClose))

// Trailing ATR

v1 = abs(xHigh - xClose[1])
v2 = abs(xLow - xClose[1])
v3 = xHigh - xLow

trueRange = max(v1, max(v2, v3))
atr = useHeiken ? rma(trueRange, atrLen) : atr(atrLen)

m = rising(adx, 1) and (adx < adxThresh or not aboveThresh) ? m1 : falling(adx, 1) or (adx > adxThresh and aboveThresh) ? m2 : nz(m[1])
mUp = DIP >= DIN ? m : m2
mDn = DIN >= DIP ? m : m2

src_ = useHeiken ? xClose : src
c = useHeiken ? xClose : close
t = useHeiken ? (xHigh + xLow) / 2 : hl2

up = t - mUp * atr
dn = t + mDn * atr

TUp = max(src_[1], c[1]) > TUp[1] ? max(up, TUp[1]) : up
TDown = min(src_[1], c[1]) < TDown[1] ? min(dn, TDown[1]) : dn

trend = min(src_, min(c, close)) > TDown[1] ? 1 : max(src_, max(c, close)) < TUp[1]? -1 : nz(trend[1], 1)
stop = trend == 1 ? TUp : TDown
trendChange = change(trend)

longCondition = (trendChange > 0)
if (longCondition)
    strategy.entry("long", strategy.long)
shortCondition = (trendChange < 0)
if (shortCondition)
    strategy.entry("short", strategy.short)    
    
// Plot

lineColor = not(trendChange) ? trend > 0 ? #00FF00DD : #FF0000DD : #00000000
shapeColor = trendChange ? trendChange > 0 ? #00FF00F8 : #FF0000F8 : #00000000

plot(stop, color = lineColor, style = line, linewidth = 1, title = "ATR Trend")
plotshape(trendChange ? stop : na, style = shape.circle, size = size.tiny, location = location.absolute, color = shapeColor, title = "Change")

alertcondition(trendChange > 0, title = "ATR-ADX Change Up", message = "ATR-ADX Change Up")
alertcondition(trendChange < 0, title = "ATR-ADX Change Down", message = "ATR-ADX Change Down")

// end

Más.