Estratégia de rastreamento de tendência dinâmica e filtragem de volatilidade: Sistema de cruzamento de média móvel baseado em confirmação dupla de ADX e CI

ADX CI SMA DM TR ATR DI
Data de criação: 2025-02-21 09:33:38 última modificação: 2025-02-21 09:33:38
cópia: 0 Cliques: 406
2
focar em
319
Seguidores

Estratégia de rastreamento de tendência dinâmica e filtragem de volatilidade: Sistema de cruzamento de média móvel baseado em confirmação dupla de ADX e CI Estratégia de rastreamento de tendência dinâmica e filtragem de volatilidade: Sistema de cruzamento de média móvel baseado em confirmação dupla de ADX e CI

Visão geral

Esta estratégia é um sistema de negociação que combina um sinal de cruzamento de equilíbrio com um filtro de estado de mercado. Captura a tendência do mercado através da intersecção de uma média móvel simples de 9 e 21 períodos (SMA) e utiliza o índice de direção média (ADX) e o índice de caos (Choppiness Index, CI) para filtrar o ambiente de mercado, garantindo que a negociação seja feita apenas em mercados com uma tendência clara e com boas características de flutuação.

Princípio da estratégia

A lógica central da estratégia inclui três componentes-chave:

  1. Geração de sinais de tendência: usa-se o cruzamento de 9 ciclos e 21 ciclos SMA para determinar a direção da tendência, formando um sinal de negociação básico.
  2. Confirmação da força da tendência: Verifica a força da tendência com o indicador ADX (sete o limiar para 20) para garantir que a negociação ocorra apenas em um ambiente de mercado em que a tendência é clara.
  3. Filtro de volatilidade do mercado: introdução do índice de caos (termo de 50) para identificar características de volatilidade do mercado, evitando a negociação em mercados com fortes turbulências.

A estratégia usa métodos de cálculo de indicadores técnicos otimizados, incluindo funções de soma, cálculos de valores máximos e mínimos personalizados e cálculos de amplitude real padronizados (TR), garantindo a precisão e a eficiência de cálculo do sinal.

Vantagens estratégicas

  1. Mecanismo de confirmação múltipla: aumenta significativamente a confiabilidade dos sinais de negociação através da combinação de cruzamento linear, ADX e triplo filtragem CI.
  2. Adaptabilidade: Os parâmetros da estratégia podem ser ajustados de acordo com diferentes condições de mercado, com boa adaptabilidade.
  3. Controle de risco perfeito: Filtração do índice de CI durante os períodos de alta volatilidade, reduzindo efetivamente o risco de falsas rupturas.
  4. Eficiência computacional: utiliza métodos de computação otimizados e tem um bom desempenho, especialmente no tratamento de dados históricos.

Risco estratégico

  1. Sensibilidade de parâmetros: a eficácia da estratégia é altamente dependente da configuração de limites do ADX e do CI, e diferentes configurações de parâmetros podem ser necessárias em diferentes ambientes de mercado.
  2. Lagarda: Pode haver problemas com o atraso do sinal devido à utilização de vários indicadores de médias móveis.
  3. O que acontece em mercados de baixa volatilidade: é possível que você perca algumas oportunidades de negociação de curta duração em mercados de baixa volatilidade.
  4. Complexidade do cálculo: o cálculo de múltiplos indicadores aumenta a complexidade da estratégia, podendo afetar a eficiência da execução de transações em tempo real.

Direção de otimização da estratégia

  1. Ajuste de parâmetros dinâmicos: introdução de um mecanismo de ajuste de parâmetros adaptativos, ajustando os valores-limite de ADX e CI de acordo com a dinâmica do mercado.
  2. Optimização de Stop Loss: Aumento do mecanismo de Stop Loss dinâmico, que permite a criação de estratégias de Stop Loss mais flexíveis com base no ATR ou nas Bandas de Volatilidade.
  3. Reforço de confirmação de sinal: pode ser considerado o adicionamento de um mecanismo de confirmação de entrega para aumentar ainda mais a confiabilidade do sinal.
  4. Melhoria da eficiência computacional: otimização da metodologia de cálculo de indicadores, especialmente no desempenho do processamento de dados de longo período.

Resumir

A estratégia combina a estratégia clássica de equilíbrio de cruzamentos com indicadores tecnológicos modernos, construindo um sistema de negociação completo. Não se concentra apenas na captura de tendências, mas também na adequação ao ambiente de mercado, aumentando a estabilidade das negociações por meio de mecanismos de filtragem múltiplos. Apesar de existirem alguns problemas de sensibilidade a parâmetros e atraso, a estratégia ainda tem muito espaço para melhorias através da direção de otimização proposta.

Código-fonte da estratégia
/*backtest
start: 2024-02-22 00:00:00
end: 2024-12-06 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("MA9/MA21 Cross with ADX & CHOP Filter", overlay=true, initial_capital=10000, currency=currency.USD)

// ─── CUSTOM FUNCTIONS ──────────────────────────────────────────────────────
// Custom function to compute the sum over the last 'len' bars.
f_sum(src, len) =>
    s = 0.0
    for i = 0 to len - 1
        s += src[i]
    s

// Custom function to compute the highest value over the last 'len' bars.
f_highest(src, len) =>
    h = src[0]
    for i = 1 to len - 1
        h := math.max(h, src[i])
    h

// Custom function to compute the lowest value over the last 'len' bars.
f_lowest(src, len) =>
    l = src[0]
    for i = 1 to len - 1
        l := math.min(l, src[i])
    l

// ─── INPUTS ──────────────────────────────────────────────────────────────
ma9Period   = input.int(9, title="MA 9 Period", minval=1)
ma21Period  = input.int(21, title="MA 21 Period", minval=1)
adxLength   = input.int(7, title="ADX Smoothing / DI Length", minval=1)
adxThresh   = input.float(20.0, title="ADX Threshold", step=0.1)
chopLen     = input.int(7, title="CHOP Length", minval=1)
chopOff     = input.int(0, title="CHOP Offset", minval=0)  // Not applied in calculation
chopThresh  = input.float(50.0, title="CHOP Maximum (do not trade if above)", step=0.1)

// ─── CALCULATE INDICATORS ────────────────────────────────────────────────────
// Moving Averages
ma9  = ta.sma(close, ma9Period)
ma21 = ta.sma(close, ma21Period)

// --- True Range Calculation ---
// Manual implementation of true range (tr)
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))), math.abs(low - nz(close[1])))

// --- ADX Calculation (Manual Implementation) ---
// Calculate directional movements
upMove   = high - nz(high[1])
downMove = nz(low[1]) - low
plusDM   = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM  = (downMove > upMove and downMove > 0) ? downMove : 0.0

// Smooth the values using the built-in rma function
atr      = ta.rma(tr, adxLength)
plusDI   = 100 * ta.rma(plusDM, adxLength) / atr
minusDI  = 100 * ta.rma(minusDM, adxLength) / atr
dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
adxValue = ta.rma(dx, adxLength)

// --- Choppiness Index Calculation ---
// Compute the sum of true range over chopLen periods
atrSum      = f_sum(tr, chopLen)
// Compute highest high and lowest low over chopLen periods using custom functions
highestHigh = f_highest(high, chopLen)
lowestLow   = f_lowest(low, chopLen)
priceRange  = highestHigh - lowestLow
chop        = priceRange != 0 ? 100 * math.log(atrSum / priceRange) / math.log(chopLen) : 0

// ─── STRATEGY CONDITIONS ─────────────────────────────────────────────────────
// MA Crossover Signals
longCond  = ta.crossover(ma9, ma21)
shortCond = ta.crossunder(ma9, ma21)

// Filter: Only trade if ADX > threshold and CHOP ≤ threshold.
filterCond = (adxValue > adxThresh) and (chop <= chopThresh)

// Entries and Exits
if longCond and filterCond
    strategy.entry("Long", strategy.long)
if shortCond and filterCond
    strategy.entry("Short", strategy.short)
if shortCond
    strategy.close("Long")
if longCond
    strategy.close("Short")

// ─── PLOTTING ──────────────────────────────────────────────────────────────
plot(ma9, color=color.red, title="MA 9")
plot(ma21, color=color.blue, title="MA 21")
plot(adxValue, title="ADX", color=color.purple)
hline(adxThresh, title="ADX Threshold", color=color.purple, linestyle=hline.style_dotted)
plot(chop, title="CHOP", color=color.orange)
hline(chopThresh, title="CHOP Threshold", color=color.orange, linestyle=hline.style_dotted)