
A estratégia permite o acompanhamento atempado da tendência, através do acompanhamento das mudanças dinâmicas nos indicadores do ADX, capturando mudanças iniciais nas tendências do mercado. Quando o ADX sobe rapidamente a partir de níveis baixos, indica que a tendência está se formando, que é um ótimo momento para entrar. Combinado com a ajuda da média móvel, pode efetivamente ignorar o diagnóstico de falhas.
A estratégia baseia-se principalmente na mudança dinâmica do indicador ADX para julgar o desenvolvimento da tendência. Quando o indicador ADX está em baixa, representa pouca mudança de tendência; Quando o ADX sobe rapidamente do baixo, indica que a tendência está se formando. A estratégia capta o desenvolvimento da tendência monitorando a rápida ascensão do ADX.
Em particular, o critério de admissão para a estratégia inclui os seguintes critérios:
Quando as condições acima são simultaneamente preenchidas, representa que a tendência está se formando, fazendo mais; quando o movimento atravessa a média móvel no momento, a posição está em equilíbrio. Usando duas médias móveis, pode-se julgar com mais precisão o desenvolvimento da tendência.
As condições de stop loss são semelhantes: quando o ADX desce rapidamente para baixo, ele fica em aberto; quando o preço atravessa a média móvel abaixo, ele fica em posição de equilíbrio.
A maior vantagem da estratégia é capturar a evolução da tendência em tempo hábil. A abordagem tradicional de apenas olhar para o valor do ADX, muitas vezes é preciso esperar que o ADX suba para 20 ou 25 para confirmar a tendência, o que perdeu o melhor momento de entrada.
Além disso, a estratégia também introduziu uma média móvel para auxiliar a filtragem de erros de diagnóstico e melhorar a estabilidade da estratégia.
O maior risco dessa estratégia é a própria atraso do indicador ADX. Embora seja possível reduzir o atraso por meio do rastreamento de ascensões rápidas, há um certo atraso. Isso pode levar a que alguns mercados que se revertem rapidamente não sejam capturados.
Além disso, o indicador ADX não é 100% preciso para avaliar as tendências, e é inevitável que ocorra algum tipo de diagnóstico errado. Embora a introdução da média móvel possa filtrar parte do ruído, ainda é necessário otimizar ainda mais.
A estratégia ainda tem muito espaço para otimização, a chave é melhorar ainda mais a precisão de captura dos indicadores de ADX. Pode-se considerar a introdução de métodos como aprendizado de máquina, modelos de treinamento para determinar a distribuição de probabilidade após a alteração do ADX. Também pode-se tentar diferentes combinações de parâmetros e outros indicadores auxiliares para otimização de testes.
A estratégia de acompanhamento de tendências de ADX ascendentes dinâmicas permite o acompanhamento atempado das tendências, capturando pontos de mudança de mercado em ascensão rápida do ADX. A maior vantagem é que a tendência é extremamente ágil em termos de tempo e pode ser efetivamente capturada no início da tendência.
/*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)