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

Dinâmica de crescimento da tendência ADX seguindo a estratégia

Autora:ChaoZhang, Data: 2023-12-11 17:18:32
Tags:

img

Resumo

Esta estratégia rastreia as mudanças dinâmicas do indicador ADX para capturar as mudanças iniciais nas tendências do mercado para seguir a tendência em tempo hábil. Quando o ADX sobe rapidamente a partir de níveis baixos, ele sinaliza que uma tendência está se formando, o que apresenta uma grande oportunidade de entrar. Com a ajuda de médias móveis, ele pode filtrar sinais falsos de forma eficaz.

Estratégia lógica

O núcleo desta estratégia consiste em julgar o desenvolvimento da tendência com base nas mudanças dinâmicas do indicador ADX. ADX baixo significa pequenas flutuações nas tendências. Quando o ADX sobe rapidamente a partir de níveis baixos, ele sinaliza uma tendência está se formando. A estratégia captura o surgimento da tendência monitorando o aumento acentuado do ADX.

Especificamente, o sinal de entrada consiste nos seguintes factores:

  1. ADX ultrapassa um limiar (por exemplo 10)
  2. ADX sobe rapidamente para cima
  3. Os preços cruzam acima da média móvel simples ou exponencial

Quando todas as condições acima são atendidas, ele sinaliza uma tendência de alta está se formando para ir longo. Quando o preço cai abaixo das médias móveis, fechar posições. Duas médias móveis são usadas para julgar as tendências com mais precisão.

A lógica de stop loss é semelhante: vá curto quando o ADX cai rapidamente e feche posições quando o preço sobe acima das médias móveis.

Análise das vantagens

A maior vantagem aqui é a captura oportuna de tendências emergentes. A maneira convencional de olhar para os valores absolutos do ADX geralmente requer confirmação acima de 20 ou 25 para chamar uma tendência, perdendo assim o tempo de entrada ideal. Esta estratégia capta o desenvolvimento inicial da tendência rastreando o rápido aumento do ADX.

Além disso, as médias móveis ajudam a filtrar sinais falsos de forma eficaz, aumentando a estabilidade da estratégia.

Análise de riscos e otimização

O maior risco provém da natureza atrasada do próprio ADX. Apesar de alcançar a rápida subida para reduzir o atraso, ainda há algum atraso. Isso faz com que se percam alguns mercados que se revertem rapidamente.

Além disso, o ADX não julga perfeitamente as tendências e inevitavelmente as diagnostica erroneamente de tempos em tempos.

Ainda há um grande espaço para otimizar essa estratégia, principalmente melhorando a precisão do ADX na captura de tendências. Métodos como aprendizado de máquina podem ser explorados, modelos de treinamento para prever a distribuição de probabilidade com base nas mudanças do ADX. Outros aspectos como ajuste de parâmetros, indicadores adicionais etc. também podem ser testados.

Conclusão

Esta estratégia de acompanhamento da tendência ADX em ascensão dinâmica capta mudanças de tendência rapidamente, identificando aumentos acentuados da ADX, seguindo assim as tendências em tempo hábil.


/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © dhilipthegreat

//@version=4
//Rising ADX strategy

strategy(title="Rising ADX strategy", overlay=false)

adxlen = input(14, title="ADX Length", minval=1)
threshold = input(10, title="threshold", minval=5)

hline(threshold, color=color.black, linestyle=hline.style_dashed)

atype = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen=input(20, title="Moving average 1 ",minval=1, maxval=50)
avg = atype == 1 ? sma(close,malen) : atype == 2 ? ema(close,malen) : atype == 3 ? wma(close,malen) : atype == 4 ? hma(close,malen) : na

atype2 = input(2,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA")
malen2=input(20, title="Moving average 2",minval=1, maxval=200)
avg2 = atype2 == 1 ? sma(close,malen2) : atype2 == 2 ? ema(close,malen2) : atype2 == 3 ? wma(close,malen2) : atype2 == 4 ? hma(close,malen2) : na

//ADX&DI
dilen = 14
dirmov(len,_high,_low,_tr) =>
	up = change(_high)
	down = -change(_low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(_tr, len)
	
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)

	[plus, minus]

adx(dilen, adxlen,_high,_low,_tr) =>
	[plus, minus] = dirmov(dilen,_high,_low,_tr)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

[plus, minus] = dirmov(dilen,high,low,tr)
sig = adx(dilen, adxlen,high,low,tr)
prev_sig = adx(dilen, adxlen,high[1],low[1],tr)
plot(sig ? sig : na, color = rising(sig, 1) ? color.lime : falling(sig, 1) ? color.orange : color.purple, title="ADX",linewidth=2)

//////
longCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close > avg and close > avg2
barcolor(longCondition ? color.yellow: na)
Long_side = input(true, "Long side")
if Long_side
    strategy.entry(id="Long", long=true,  when= longCondition  and strategy.position_size<1)
    exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close < avg and close < avg2
    strategy.close(id="Long",comment="L exit",    qty=strategy.position_size ,   when= exitCondition)   //close all

shortCondition=  sig > threshold  and rising(sig, 1) and falling(prev_sig, 1) and close < avg and close < avg2
barcolor(shortCondition ? color.gray: na)
Short_side = input(true, "Short side")
if Short_side
    strategy.entry(id="Short", long=false,  when= shortCondition  and strategy.position_size<1)
    sell_exitCondition=  (rising(prev_sig, 1) and falling(sig, 1)) or close > avg and close > avg2
    strategy.close(id="Short",comment="S exit",    qty=strategy.position_size ,   when= sell_exitCondition)   //close all

barcolor(strategy.position_size>1 ? color.lime: na)
bgcolor(strategy.position_size>1 ? color.lime: na)

barcolor(strategy.position_size<0 ? color.orange: na)
bgcolor(strategy.position_size<0 ? color.orange: na)

Mais.