Estratégia de negociação de tendências ADX

Autora:ChaoZhang, Data: 2023-12-08 15:49:12
Tags:

img

Resumo

Esta estratégia combina índice de movimento direcional (ADX), indicador direcional mais (DI +) e médias móveis rápidas e lentas para determinar a direção do mercado e período de detenção.

Princípios

A lógica central desta estratégia é gerar sinais de compra quando a linha +DI cruza acima da linha ADX de baixo para cima, e gerar sinais de venda quando a linha +DI cruza abaixo da linha ADX de cima para baixo. Portanto, esta estratégia depende do cruzamento entre DI e ADX para determinar tendências de mercado e pontos de reversão. Ao mesmo tempo, a relação entre médias rápidas e lentas é usada para determinar a tendência geral do mercado. Os sinais de negociação só serão considerados quando a EMA rápida está acima da EMA lenta.

Especificamente, um sinal de compra será acionado quando estiverem preenchidas as seguintes condições:

  1. A EMA rápida está acima da EMA lenta
  2. A linha +DI cruza a linha ADX para cima
  3. Valor ADX inferior ao limiar de 30

Um sinal de venda será acionado quando estiverem preenchidas as seguintes condições:

  1. Valor ADX superior ao limiar 30
  2. A linha +DI cruza a linha ADX para baixo

A estratégia também incorpora uma lógica de stop loss para sair de todas as posições quando o preço cair abaixo do nível de stop loss.

Vantagens

A estratégia combina os indicadores DI, ADX e média móvel para determinar eficazmente as mudanças nas tendências do mercado.

  1. Utilize os cruzamento DI e ADX para determinar com precisão os pontos de entrada e saída
  2. Sistema de filtro EMA rápido e lento para determinar a tendência geral do mercado, evitando maus negócios
  3. Utilize os valores do ADX para determinar a força da tendência, negociando apenas quando a tendência é fraca, evitando falhas de ruptura
  4. Incorporar um mecanismo de stop loss para controlar o risco de queda
  5. Condições de entrada rígidas evitar a compra de tops e venda de fundos
  6. Regras de saída claras permitem a suspensão oportuna das perdas e a captação de lucros

Riscos

Há alguns riscos a ter em conta com esta estratégia:

  1. Indicador ADX tem efeito de atraso, pode perder o melhor momento para reversões de preços
  2. Podem ocorrer mais sinais falsos quando a volatilidade do mercado é elevada
  3. As configurações EMA rápidas e lentas incorretas podem levar a operações perdidas ou a filtragem de sinais válidos
  4. Nível de stop loss demasiado elevado não permite controlar eficazmente o risco

Estes riscos podem ser abordados através da otimização dos parâmetros ADX e média móvel, ajustando o nível de stop loss, adicionando filtros para confirmação, etc.

Oportunidades de melhoria

Há espaço para melhorias adicionais:

  1. Ensaiar o ADX de períodos de comprimento diferentes para encontrar combinações ideais
  2. Adicionar outros indicadores como RSI, Bollinger Bands para confirmação de sinal
  3. Utilize algoritmos de aprendizagem de máquina para otimizar automaticamente parâmetros e regras
  4. Ajustar dinamicamente os níveis de stop loss para mitigar os riscos em estágio tardio
  5. Construir um modelo de pontuação multifatorial para tornar os critérios de entrada e saída mais robustos

Conclusão

Em geral, esta estratégia de tendência de cruzamento do ADX é bastante estável, capaz de capturar efetivamente reversões desde o início, mas o controle de risco é crítico.


/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
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/
// © mohanee

//@version=4
//ADX strategy
SmoothedTrueRange=0.00
SmoothedDirectionalMovementPlus=0.00
SmoothedDirectionalMovementMinus=0.00


strategy(title="ADX strategy", overlay=false,pyramiding=3, default_qty_type=strategy.fixed, default_qty_value=3,    initial_capital=10000, currency=currency.USD)

len = input(11, title="ADX Length", minval=1)
threshold = input(30, title="threshold", minval=5)

fastEma=input(13, title="Fast EMA",minval=1, maxval=50)
slowEma=input(55, title="Slow EMA",minval=10, maxval=200)
stopLoss =input(8, title="Stop Loss",minval=1)   //


TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0


SmoothedTrueRange:= nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange

SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus:= nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

plot(DIPlus, color=color.green, title="DI+")
//plot(DIMinus, color=color.red, title="DI-")
plot(ADX, color=color.black, title="ADX")
hline(threshold, color=color.black, linestyle=hline.style_dashed)

fastEmaVal=ema(close,fastEma)
slowEmaVal=ema(close,slowEma)




//long condition
longCondition=  ADX < threshold  and crossover(DIPlus,ADX)  and fastEmaVal > slowEmaVal


barcolor(longCondition ? color.yellow: na)

strategy.entry(id="ADXLE", long=true,  when= longCondition  and strategy.position_size<1) 

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



//Add
strategy.entry(id="ADXLE", comment="Add", long=true,  when= strategy.position_size>1 and close<strategy.position_avg_price and crossover(DIPlus,ADX) ) 


//calculate stop Loss
stopLossVal =  strategy.position_avg_price -  (strategy.position_avg_price*stopLoss*0.01)

strategy.close(id="ADXLE",comment="SL Exit",    when=close<stopLossVal)   //close all on stop loss


//exit condition
exitCondition=  ADX > threshold  and crossunder(DIPlus,ADX) // and fastEmaVal > slowEmaVal
strategy.close(id="ADXLE",comment="TPExitAll",    qty=strategy.position_size ,   when= exitCondition)   //close all     

Mais.