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.
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.
La estrategia tiene varias ventajas obvias:
Por lo tanto, esta es una tendencia muy práctica siguiendo una estrategia con un buen control de extracción.
La estrategia también tiene algunos riesgos:
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.
La estrategia se puede optimizar en los siguientes aspectos:
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.
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