
La estrategia es una estrategia de seguimiento de tendencias que combina el indicador ATR y el indicador ADX. Se ajusta dinámicamente el múltiplo de ATR según el estado de tendencia del mercado, lo que permite un mejor seguimiento de tendencias.
La estrategia se basa principalmente en los indicadores ATR y ADX.
En primer lugar, se calcula el rango de fluctuación real (ATR) y el ADX. El ATR refleja la volatilidad del mercado y el ADX determina la fuerza de la tendencia.
Luego, en función de la diferencia entre el indicador de orientación de la pluralidad de ADX y el indicador de orientación de la pluralidad de DX, juzgue el estado de pluralidad de la tendencia actual. Si DI+ es superior a DI-, es una tendencia de múltiples cabezas, y si DI- es superior a DI+, es una tendencia de cabezas vacías.
Luego, cuando el ADX sube, se usa un mayor múltiplo de ATR (m1) y cuando el ADX baja, se usa un menor múltiplo de ATR (m2) para lograr un ajuste dinámico. Este es el núcleo de la estrategia.
Por último, la mediana de la ATR y el precio se combinan para calcular la subida y bajada de la curva y determinar la dirección de la tendencia.
Por lo tanto, la estrategia combina el indicador ATR y el indicador ADX para poder capturar mejor las tendencias mediante el ajuste dinámico de los parámetros ATR.
Esta estrategia tiene varias ventajas evidentes:
Por lo tanto, es una estrategia de seguimiento de tendencias muy práctica, con una excelente capacidad de control de retroceso y es recomendable.
La estrategia también tiene sus riesgos:
Por lo tanto, se debe prestar atención a la optimización de parámetros y el control de riesgos. Además, los eventos de cisnes negros también pueden tener un gran impacto en la estrategia.
La estrategia puede ser optimizada en las siguientes direcciones:
Por lo tanto, la estrategia aún tiene mucho espacio para la optimización, y es muy necesario ajustar los parámetros y mecanismos para responder a los problemas.
La estrategia de tendencias ATR-ADX de adaptación automática es excelente para V2 en general, ya que puede capturar tendencias de manera eficiente mediante el ajuste dinámico de los parámetros ATR; al mismo tiempo, la combinación de los dos indicadores de ATR y ADX es tolerante a errores. Pero también debemos prestar atención al control de riesgos y a la optimización de la estrategia para evitar el retraso y la expansión de las pérdidas.
/*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