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

Estratégia de tendência dinâmica do ADX

Autora:ChaoZhang, Data: 2024-01-15 15:32:45
Tags:

img

Resumo

A estratégia de tendência dinâmica do ADX é uma estratégia de negociação quantitativa que utiliza o indicador ADX para determinar a força e a direção das tendências do mercado.

Lógica de negociação

A estratégia usa primeiro o indicador ADX para determinar se existe uma tendência no mercado. Quando o ADX está acima de um nível chave definido pelo usuário (padrão 23), ele sinaliza que a tendência do mercado é relativamente forte. Quando o valor atual do ADX é maior do que o valor do ADX há n dias (n é o período de retrospectiva definido pelo usuário, padrão 3 dias), ele sinaliza que o ADX está subindo e uma tendência está se formando no mercado.

A estratégia então utiliza DI+ e DI- para determinar a direção da tendência do mercado. Quando o DI+ é maior que o DI-, ele sinaliza uma tendência de alta no mercado. Quando o DI+ é menor que o DI-, ele sinaliza uma tendência de queda no mercado.

Por último, a estratégia combina a análise ADX e DI para gerar sinais específicos de compra e venda:

  1. Quando o ADX sobe e está acima do nível chave e o DI+ é superior ao DI-, é gerado um sinal de compra
  2. Quando o ADX sobe e está acima do nível chave e o DI+ está abaixo do DI-, é gerado um sinal de venda
  3. Quando o ADX vira para diminuir, um sinal de posição plana é gerado

A estratégia também fornece recursos como filtragem de média móvel e intervalo de tempo de backtesting personalizável.

Análise das vantagens

A estratégia de tendência dinâmica do ADX tem as seguintes vantagens:

  1. Detectar automaticamente a existência de tendências de mercado, evitando negociações ineficazes
  2. Determinar automaticamente a direcção das tendências do mercado para a tendência seguinte
  3. Lógica clara de compra na existência da tendência e achatamento no desaparecimento da tendência
  4. Filtragem da média móvel configurável evita falsas rupturas
  5. Intervalo de tempo de backtesting personalizável para testes históricos
  6. Parâmetros de indicador ajustáveis para otimização em diferentes produtos

Análise de riscos

A estratégia apresenta também alguns riscos:

  1. O indicador ADX tem um efeito de atraso, possivelmente perdendo oportunidades de tendência iniciais
  2. A dependência da direcção da tendência no DI pode produzir sinais falsos, uma vez que o DI é sensível
  3. O filtro da média móvel pode perder oportunidades de curto prazo
  4. Um prazo de backtesting inadequado pode causar sobreajuste
  5. Parâmetros de indicadores inadequados podem afetar o desempenho da estratégia

Para mitigar os riscos, podem ser tidos em conta os seguintes aspectos:

  1. Redução dos parâmetros ADX para reduzir o atraso
  2. Remover ou ajustar o filtro DI para evitar sinais falsos
  3. Redução do período da média móvel
  4. Expandir o prazo de backtesting para testes completos de amostra
  5. Otimize os parâmetros para encontrar as melhores configurações

Oportunidades de melhoria

A estratégia pode ser reforçada pelos seguintes aspectos:

  1. Testes de carteira em múltiplas ações para diversificar o risco de uma única ação
  2. Adicionar lógica de stop loss ao controle por perda de negociação
  3. Combinar com outros indicadores para verificação do sinal para melhorar a precisão
  4. Introduzir algoritmos de aprendizagem de máquina para geração de sinais de compra/venda
  5. Adicionar módulo de ajuste automático de parâmetros para ajuste dinâmico

Conclusão

A ADX Dynamic Trend Strategy utiliza o ADX para determinar a existência da tendência e o DI para a direção da tendência. Ele gera sinais de negociação quando existe uma tendência e aplanam posições quando a tendência desaparece. A lógica é clara. Ao detectar e rastrear automaticamente tendências, a negociação ineficaz pode ser evitada até certo ponto em mercados não-trending. Com o aprimoramento adequado, essa estratégia pode se tornar uma ferramenta poderosa para negociação quantitativa de médio a longo prazo.


/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')

Mais.