O recurso está a ser carregado... Carregamento...

Uma estratégia de tendência adaptativa ATR-ADX V2

Autora:ChaoZhang, Data: 2023-12-05 18:08:14
Tags:

img

Resumo

Trata-se de uma estratégia de seguimento de tendências que combina o indicador ATR e o indicador ADX. Ajusta dinamicamente o multiplicador ATR de acordo com as condições da tendência do mercado para obter um melhor acompanhamento da tendência.

Estratégia lógica

A estratégia baseia-se principalmente no indicador ATR e no indicador ADX.

Em primeiro lugar, calcula o True Range (ATR) e o ADX. O ATR reflete a volatilidade do mercado enquanto o ADX avalia a força da tendência.

Em segundo lugar, determina a direção da tendência atual de acordo com a diferença entre DI+ e DI- no indicador ADX. Se DI+ é maior que DI-, é uma tendência de alta. Se DI- é maior que DI+, é uma tendência de queda.

Então, quando o ADX está subindo, ele usa um multiplicador de ATR maior (m1).

Finalmente, combinado com o ATR e o ponto médio do preço, ele calcula as faixas superior e inferior para determinar a direção da tendência.

Assim, a estratégia incorpora ATR e ADX, e ajustando dinamicamente os parâmetros ATR, pode capturar melhor as tendências para a negociação.

Análise das vantagens

A estratégia tem várias vantagens óbvias:

  1. Capaz de ajustar dinamicamente parâmetros para melhor captura de tendências
  2. Combina ATR e ADX para um julgamento mais abrangente
  3. A expectativa é de que os saques sejam controlados
  4. Implementação simples e fácil de compreender

Por conseguinte, esta é uma tendência muito prática, seguindo uma estratégia com bom controlo da retirada.

Análise de riscos

A estratégia apresenta também alguns riscos:

  1. ADX tem problemas atrasados, pode perder pontos de reversão da tendência
  2. A seleção inadequada do tamanho do ATR pode conduzir a lucros insuficientes ou stop loss de grande dimensão
  3. A ruptura rápida contra as bandas causada por eventos de cisne negro pode levar a perdas.

Por isso, a otimização dos parâmetros e o controlo dos riscos precisam de atenção.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Otimizar os parâmetros do ATR e do ADX para melhor captura da tendência
  2. Adicionar outros indicadores de confirmação para evitar problemas de atraso do ADX
  3. Construir mecanismos dinâmicos de stop loss para controlar perdas de negociação única
  4. Ajustar o dimensionamento das posições para os diferentes ambientes de mercado

Assim, ainda há muito espaço para otimização, ajustando parâmetros e mecanismos de acordo com os problemas.

Conclusão

Em geral, esta estratégia de tendência adaptativa ATR-ADX V2 tem um desempenho muito bom. Ao ajustar dinamicamente os parâmetros ATR, ela capta tendências muito bem. Além disso, a combinação de dois indicadores em ATR e ADX torna-a mais robusta. Mas ainda precisamos prestar atenção ao controle de risco e otimização para evitar perdas atrasadas e de tamanho excessivo.


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

Mais.