Estratégia do Indicador de Tendência Média Dinâmica ADX


Data de criação: 2024-01-15 15:32:45 última modificação: 2024-01-15 15:32:45
cópia: 0 Cliques: 584
1
focar em
1617
Seguidores

Estratégia do Indicador de Tendência Média Dinâmica ADX

Visão geral

A estratégia de indicador de tendência de média dinâmica do ADX é uma estratégia de negociação quantitativa que usa o indicador do ADX para determinar a força da tendência do mercado e a direção da tendência. A estratégia determina se há uma tendência no mercado através da computação do indicador de direção média ((ADX) e determina a direção da tendência através da computação do indicador positivo ((DI +) e do indicador negativo ((DI -)) para gerar sinais de compra e venda.

Princípio da estratégia

A estratégia usa primeiro o indicador ADX para determinar se há uma tendência no mercado. Quando o ADX está acima do valor-chave definido pelo usuário (default 23), indica que a tendência do mercado é forte. Quando o valor atual do ADX está acima do valor n dias antes do ADX (default 3), indica que o ADX está subindo e a tendência do mercado está se formando.

A estratégia usa o DI+ e o DI- para determinar a direção da tendência do mercado. Quando o DI+ é superior ao DI-, o mercado está em alta tendência; quando o DI+ é inferior ao DI-, o mercado está em baixa tendência.

Por fim, a análise estratégica da situação do ADX e do DI, produzindo sinais específicos de compra e venda:

  1. Quando o ADX sobe, acima do valor crítico e o DI+ está acima do DI-, um sinal de compra é gerado
  2. Quando o ADX sobe, acima do valor crítico, e o DI+ é menor que o DI-, um sinal de venda é gerado
  3. Quando o ADX vira para baixo, gera um sinal de equilíbrio

A estratégia também oferece recursos como filtros de média móvel e intervalos de tempo de retorno personalizados, que podem ser configurados conforme necessário.

Análise de vantagens

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

  1. A capacidade de determinar automaticamente se há uma tendência de mercado e evitar transações inválidas
  2. A capacidade de avaliar automaticamente a direção das tendências do mercado e de acompanhar as tendências
  3. Fornecer uma lógica clara para comprar quando há uma tendência / liquidar quando a tendência desaparece
  4. Media móvel configurável para filtragem e prevenção de false breaks
  5. Tempo de retorno configurável para testes de histórico
  6. Indicadores e parâmetros são ajustáveis e podem ser otimizados para diferentes variedades

Análise de Riscos

A estratégia também apresenta alguns riscos:

  1. Indicador ADX está atrasado e pode ter perdido uma oportunidade no início da tendência
  2. O julgamento de múltiplos espaços depende do indicador DI, que é sensível e pode gerar sinais errados.
  3. Filtros de média móvel podem perder oportunidades de curto prazo
  4. O intervalo de tempo de detecção incorreto pode ter causado um excesso de ajuste
  5. Parâmetros de indicador mal definidos podem afetar a eficácia da estratégia

Para reduzir o risco, considere:

  1. Encurtar adequadamente os parâmetros ADX para reduzir o atraso
  2. Ajustar ou remover o filtro DI para evitar sinais errados
  3. Reduzir adequadamente o ciclo da média móvel
  4. Ampliação do tempo de resposta para testes em toda a amostra
  5. Optimizar os parâmetros do indicador para encontrar a melhor configuração

Direção de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. Combinação de várias ações para testes de portfólio, dispersando o risco de uma única ação
  2. Aumentar a lógica de stop loss para controlar a perda individual
  3. Verificação de combinação com outros indicadores para melhorar a precisão do sinal
  4. Introdução de algoritmos de aprendizagem de máquina para avaliar os sinais de compra e venda
  5. Adição de módulo de otimização de parâmetros automáticos para ajustes de parâmetros dinâmicos

Resumir

A estratégia do indicador de tendência da média dinâmica ADX usa a presença de tendências de ADX e a direção de tendências de DI para gerar sinais de negociação quando há uma tendência, a estratégia é clara. A estratégia pode julgar a tendência automaticamente, acompanhar a tendência e, até certo ponto, evitar negociações ineficazes em mercados não tendenciais. Com uma certa otimização, a estratégia pode ser uma ferramenta poderosa para quantificar as negociações de linha média e longa.

Código-fonte da estratégia
/*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')