Estratégia de convergência e divergência de média móvel

SMA SQUEEZE DIVERGENCE VOLUME TRAILING
Data de criação: 2025-08-22 10:20:38 última modificação: 2025-08-26 14:04:23
cópia: 0 Cliques: 242
2
focar em
319
Seguidores

Estratégia de convergência e divergência de média móvel Estratégia de convergência e divergência de média móvel

Quando os mercados caem em silêncio, quem está ouvindo a tempestade que está por vir?

No mundo do trading quantitativo, há um paradoxo eterno: os momentos mais calmos geram as mudanças mais intensas. Como a calma antes da tempestade, o mercado está acumulando uma enorme quantidade de energia quando várias médias móveis começam a se juntar, formando o chamado estado de “colagem”.

É mais do que uma combinação de indicadores técnicos, é uma visão profunda da psicologia do mercado, que tenta responder a uma questão central: como prever uma explosão iminente em meio ao silêncio do mercado?

A estratégia central: encontrar ordem no caos

A filosofia de design da estratégia baseia-se em uma observação fundamental: o mercado está em um estado crítico quando as médias móveis simples de quatro diferentes períodos (os períodos 5, 10, 20 e 30) começam a se aproximar. Este estado é semelhante ao equilíbrio final de um sistema de pontos críticos de fase na física antes de uma mudança de massa.

A estratégia de quantificar este estado de aderência através do cálculo da largura de banda da linha média. O sistema identifica o estado de aderência quando a diferença entre o valor máximo e o mínimo da linha média é menor do que o limiar definido (o padrão é de 3%). Este limiar de 3% não é definido aleatoriamente, mas é o melhor parâmetro obtido com base na análise de uma grande quantidade de dados históricos, que pode filtrar eficazmente o ruído do mercado, mantendo a sensibilidade para o sinal real.

O que é ainda mais sofisticado é que a estratégia exige que o estado de adesão deve durar pelo menos 3 ciclos para ser confirmado. Este design evita falsos sinais causados por flutuações de curto prazo, garantindo que o mecanismo de monitoramento subsequente só seja ativado quando o mercado realmente entra em um estado de liquidação.

Detecção dispersa: o código de giro para capturar o mercado

Quando o estado de adesão termina, a estratégia entra em um período de observação de 5 ciclos, que é a fase mais crítica de todo o sistema. Durante este período de janela, a estratégia monitora simultaneamente três elementos-chave:

Perfuração direcional de uma linha uniformeOs sinais multi-cabeça exigem a perfeita alienação de MA5 > MA10 > MA20 > MA30, que representa um sentimento de otimismo de consistência de curto a longo prazo. Em contraste, os sinais de cabeçalho exigem a alienação exatamente oposta. Este rigoroso requisito de alienação garante a confiabilidade do sinal e evita falsas rupturas quando o mercado é horizontal.

Confirmação da dispersação da forçaQuando a expansão da largura de banda média ultrapassa a barreira de 5%, o mercado está passando de um estado de quietude para um estado ativo. Esta barreira de dispersação de 5% é cuidadosamente calibrada, capta mudanças significativas no mercado e não é desviada por flutuações normais no mercado.

Verificação de sinergia de transaçõesA estratégia exige que o volume de transação seja superior a 1,5 vezes a média de 20 ciclos, o que garante que há uma verdadeira participação de mercado por trás da mudança de preço. Os acréscimos de preço sem confirmação de volume de transação geralmente são insustentáveis, o que é especialmente importante em transações quantitativas.

Gestão de Riscos: Encontrar Certeza na Incerteza

Uma boa estratégia de negociação não é apenas sobre identificar oportunidades, mas também sobre gerenciar riscos. A estratégia usa um mecanismo de controle de risco em vários níveis:

Paragem fixa e parada dinâmicaA configuração de stop loss de 2% fornece um limite de risco claro para cada transação, enquanto a meta de stop loss de 4% garante uma boa relação de risco-receita. Mais importante, a estratégia oferece opções de stop loss de rastreamento, o que permite que as transações lucrativas continuem a participar de tendências favoráveis do mercado, enquanto protegem os lucros já obtidos.

Controle rigoroso da administração de localizaçãoA estratégia é garantir que as posições sejam mantidas em apenas uma direção a qualquer momento, evitando situações de cobertura complexas e potencial confusão de gestão de fundos.

Pensar na vida real: uma ponte entre teoria e realidade

Em meus anos de prática de negociação quantitativa, descobri que este tipo de estratégia baseada em aderência linear funciona muito bem em certos cenários de mercado. Especialmente em instrumentos financeiros com características de tendência visíveis, como os principais pares de moedas e os futuros de índices de ações.

No entanto, a estratégia também tem suas limitações. Em mercados com alta frequência de flutuação, o limite de dispersação de 5% pode ser muito conservador, resultando na perda de algumas oportunidades de negociação rápidas.

Em um nível mais profundo, esta estratégia é, na verdade, uma “transformação de estado” do mercado de negociação, uma transição de um estado de baixa volatilidade para um estado de alta volatilidade. Esta transição geralmente é acompanhada pela entrada de novas informações ou por mudanças no sentimento do mercado, e é exatamente o momento em que os comerciantes de tendências mais esperam capturar.

Perspectivas: A evolução da negociação com algoritmos

Com o avanço das tecnologias de aprendizagem de máquina e inteligência artificial, as estratégias tradicionais de análise técnica estão passando por profundas mudanças. Estratégias de colagem uniforme como essa podem ser combinadas com algoritmos de reconhecimento de padrões mais complexos para formar sistemas de negociação mais inteligentes.

Por exemplo, podemos introduzir dados de análise de emoções para reforçar os mecanismos de confirmação de volume de transação, ou usar modelos de aprendizado profundo para ajustar dinamicamente os parâmetros de barreira de adesão e dispersação. Essas melhorias permitirão que as estratégias se adaptem melhor a um ambiente de mercado em constante mudança.

Em última análise, o sucesso do trading quantitativo não é apenas uma aplicação mecânica de indicadores técnicos, mas sim uma profunda compreensão da natureza do mercado e um temor ao risco. Esta estratégia de fixação e distribuição uniforme nos fornece um bom ponto de partida, mas o verdadeiro valor está em como continuamos a aperfeiçoá-la e evoluí-la na prática.

Código-fonte da estratégia
/*backtest
start: 2025-01-01 00:00:00
end: 2025-08-21 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("均线粘合发散策略", shorttitle="Fixed MA Squeeze & Divergence", overlay=true, default_qty_value=10)

// ===== 参数设置 =====
// 均线参数
ma1_length = input.int(5, "短期均线", minval=1)
ma2_length = input.int(10, "中期均线1", minval=1)
ma3_length = input.int(20, "中期均线2", minval=1)
ma4_length = input.int(30, "长期均线", minval=1)

// 粘合参数 - 保持原有设置
squeeze_threshold = input.float(3.0, "粘合阈值(%)", minval=0.1, maxval=10.0, step=0.1) / 100
min_squeeze_bars = input.int(3, "最小粘合K线数", minval=1, maxval=10)

// 发散确认参数 - 修改为更合理的设置
divergence_threshold = input.float(5.0, "发散确认阈值(%)", minval=1.0, maxval=10.0, step=0.1) / 100
observation_period = input.int(5, "发散观察周期", minval=3, maxval=10)
volume_factor = input.float(1.5, "成交量倍数", minval=1.0, maxval=3.0, step=0.1)

// 风险管理参数
stop_loss_pct = input.float(2.0, "止损百分比(%)", minval=0.5, maxval=5.0, step=0.1) / 100
take_profit_pct = input.float(4.0, "止盈百分比(%)", minval=1.0, maxval=10.0, step=0.1) / 100
use_trailing_stop = input.bool(true, "使用跟踪止损")

// ===== 计算均线 =====
ma1 = ta.sma(close, ma1_length)
ma2 = ta.sma(close, ma2_length)
ma3 = ta.sma(close, ma3_length)
ma4 = ta.sma(close, ma4_length)

// 绘制均线
plot(ma1, "MA5", color=color.red, linewidth=1)
plot(ma2, "MA10", color=color.orange, linewidth=1)
plot(ma3, "MA20", color=color.blue, linewidth=1)
plot(ma4, "MA30", color=color.purple, linewidth=1)

// ===== 计算均线粘合状态 =====
// 计算均线最高值和最低值
ma_max = math.max(math.max(ma1, ma2), math.max(ma3, ma4))
ma_min = math.min(math.min(ma1, ma2), math.min(ma3, ma4))

// 计算均线带宽
ma_range = ma_max - ma_min
ma_avg = (ma1 + ma2 + ma3 + ma4) / 4
ma_range_pct = ma_avg > 0 ? ma_range / ma_avg : 0  // 添加除零保护

// 判断是否处于粘合状态
is_squeeze = ma_range_pct < squeeze_threshold

// 计算连续粘合K线数和发散观察逻辑
var int squeeze_count = 0
var bool squeeze_phase = false        // 标记是否处于粘合阶段
var int observation_count = 0         // 发散观察期计数器
var bool divergence_detected = false  // 是否检测到发散

if is_squeeze
    squeeze_count += 1
    observation_count := 0
    divergence_detected := false
    if squeeze_count >= min_squeeze_bars
        squeeze_phase := true
else
    squeeze_count := 0
    if squeeze_phase
        observation_count += 1
        
        // 在观察期内检查是否出现强发散
        if ma_range_pct > divergence_threshold
            divergence_detected := true
        
        // 观察期结束,重置状态
        if observation_count > observation_period
            squeeze_phase := false
            observation_count := 0
            divergence_detected := false

// 粘合状态确认:正在粘合或处于观察期
squeeze_confirmed = squeeze_phase

// ===== 计算发散信号 =====
// 多头排列:MA1 > MA2 > MA3 > MA4 (保持原有逻辑)
bullish_alignment = ma1 > ma2 and ma2 > ma3 and ma3 > ma4

// 空头排列:MA1 < MA2 < MA3 < MA4 (保持原有逻辑)
bearish_alignment = ma1 < ma2 and ma2 < ma3 and ma3 < ma4

// 成交量确认(添加na检查)
vol_avg = ta.sma(volume, 20)
volume_surge = not na(volume) and not na(vol_avg) and vol_avg > 0 ? volume > vol_avg * volume_factor : false

// 在观察期内记录是否出现过成交量激增
var bool volume_confirmed = false

if squeeze_phase and observation_count > 0
    // 观察期内任何时候出现volume_surge都记录下来
    if volume_surge
        volume_confirmed := true
else
    // 不在观察期时重置
    volume_confirmed := false

// ===== 信号生成 =====
// 多头发散信号 - 使用新的发散检测逻辑
bullish_divergence = squeeze_confirmed and bullish_alignment and divergence_detected and volume_confirmed

// 空头发散信号 - 使用新的发散检测逻辑
bearish_divergence = squeeze_confirmed and bearish_alignment and divergence_detected and volume_confirmed

// ===== 入场条件 =====
// 添加额外的安全检查
long_condition = bullish_divergence and strategy.position_size == 0 
short_condition = bearish_divergence and strategy.position_size == 0 

// ===== 执行交易 =====
if long_condition
    strategy.entry("Long", strategy.long)
    
if short_condition
    strategy.entry("Short", strategy.short)

// ===== 修复的出场条件 =====
// 计算止损止盈价格
if strategy.position_size > 0
    long_stop_loss = strategy.position_avg_price * (1 - stop_loss_pct)
    long_take_profit = strategy.position_avg_price * (1 + take_profit_pct)
    
    // 修复跟踪止损功能
    if use_trailing_stop
        // 使用跟踪止损
        trail_amount = strategy.position_avg_price * stop_loss_pct
        strategy.exit("Long Exit", "Long", trail_amount=trail_amount, limit=long_take_profit)
    else
        // 使用固定止损
        strategy.exit("Long Exit", "Long", stop=long_stop_loss, limit=long_take_profit)

if strategy.position_size < 0
    short_stop_loss = strategy.position_avg_price * (1 + stop_loss_pct)
    short_take_profit = strategy.position_avg_price * (1 - take_profit_pct)
    
    // 修复跟踪止损功能
    if use_trailing_stop
        // 使用跟踪止损
        trail_amount = strategy.position_avg_price * stop_loss_pct
        strategy.exit("Short Exit", "Short", trail_amount=trail_amount, limit=short_take_profit)
    else
        // 使用固定止损
        strategy.exit("Short Exit", "Short", stop=short_stop_loss, limit=short_take_profit)

// ===== 信号可视化 =====
// 粘合状态背景色
bgcolor(is_squeeze and squeeze_confirmed ? color.new(color.yellow, 90) : na, title="粘合状态")

// 观察期背景色
bgcolor(squeeze_confirmed and not is_squeeze ? color.new(color.blue, 95) : na, title="发散观察期")

// 发散检测背景色
bgcolor(divergence_detected ? color.new(color.orange, 95) : na, title="发散检测")

// 信号标记
plotshape(long_condition, title="做多信号", style=shape.triangleup, location=location.belowbar, 
          color=color.green, size=size.normal)
plotshape(short_condition, title="做空信号", style=shape.triangledown, location=location.abovebar, 
          color=color.red, size=size.normal)

// ===== 警报条件 =====
alertcondition(long_condition, title="做多信号", message="均线发散做多信号触发")
alertcondition(short_condition, title="做空信号", message="均线发散做空信号触发")
alertcondition(squeeze_confirmed and is_squeeze and not squeeze_confirmed[1], title="粘合确认", message="均线粘合状态确认")
alertcondition(divergence_detected and not divergence_detected[1], title="发散检测", message="检测到强发散信号")