Estrategia de convergencia-divergencia de media móvil

SMA SQUEEZE DIVERGENCE VOLUME TRAILING
Fecha de creación: 2025-08-22 10:20:38 Última modificación: 2025-08-26 14:04:23
Copiar: 0 Número de Visitas: 242
2
Seguir
319
Seguidores

Estrategia de convergencia-divergencia de media móvil Estrategia de convergencia-divergencia de media móvil

¿Quién escucha la tormenta que se avecina cuando los mercados están en silencio?

En el mundo de las operaciones cuantitativas, hay una eterna paradoja: los momentos más tranquilos suelen engendrar los cambios más violentos. Como la calma antes de la tormenta, los mercados están acumulando una gran cantidad de energía cuando múltiples medias móviles comienzan a unirse entre sí para formar lo que se conoce como un estado de “adhesión”.

No es solo una combinación de indicadores técnicos, sino una profunda visión de la psicología de los mercados que trata de responder a una pregunta central: ¿cómo anticipar un estallido inminente en medio del silencio de los mercados?

El núcleo de la estrategia: Buscar orden en el caos

La filosofía de diseño de esta estrategia se basa en una observación clave: el mercado está en un estado crítico cuando las medias móviles simples de cuatro períodos diferentes (periodos 5, 10, 20 y 30) comienzan a converger. Este estado es similar al equilibrio final de los sistemas de puntos críticos de fases en la física antes de que se produzca un cambio de cualidad.

La estrategia para cuantificar este estado de adhesión es calcular el ancho de banda de la línea media. El sistema identifica el estado de adhesión cuando la diferencia entre el máximo y el mínimo valor de la línea media es menor que el umbral establecido (el 3% por defecto). Este umbral del 3% no es un ajuste arbitrario, sino un parámetro óptimo basado en un gran número de análisis de datos históricos.

Lo que es más ingenioso es que la estrategia requiere que el estado de adhesión dure al menos 3 ciclos para ser confirmado. Este diseño evita las falsas señales causadas por las fluctuaciones a corto plazo y asegura que el mecanismo de monitoreo posterior se active solo cuando el mercado realmente entre en un estado de ordenamiento.

Detección dispersa: las claves de giro para capturar el mercado

Cuando el estado de adhesión termina, la estrategia entra en un período de observación de 5 ciclos, que es la etapa más crítica de todo el sistema. Durante este período de ventana, la estrategia monitorea simultáneamente tres elementos clave:

La ruptura direccional de la línea mediaLas señales de múltiples cabezas requieren una perfecta alineación de MA5 > MA10 > MA20 > MA30, que representa un sentimiento de optimismo consistente desde el corto hasta el largo plazo. En cambio, las señales de cabezas vacías requieren una alineación completamente opuesta. Esta estricta alineación asegura la fiabilidad de la señal y evita falsas rupturas en el mercado horizontal.

Confirmación de la dispersión de fuerzas: Cuando la expansión de la banda de banda media supera el 5% de la barrera, indica que el mercado ha pasado de un estado de quietud a un estado activo. Este 5% de dispersión de la barrera está calibrado cuidadosamente, ya que puede capturar cambios significativos en el mercado y no ser engañado por las fluctuaciones normales del mercado.

Verificación conjunta de las entregasLa estrategia requiere que el volumen de transacciones sea superior a 1,5 veces el promedio de 20 ciclos, lo que garantiza que haya un verdadero apoyo de participación en el mercado detrás de los cambios de precios. Los brotes de precios sin confirmación de volumen de transacciones a menudo no son sostenibles, lo que es especialmente importante en el comercio cuantitativo.

Gestión de Riesgos: Buscando la certeza en la incertidumbre

Una buena estrategia de negociación no solo es capaz de identificar oportunidades, sino también de administrar los riesgos. La estrategia utiliza un mecanismo de control de riesgos en varios niveles:

Paradas fijas y paradas dinámicasLa configuración de stop loss del 2 por ciento proporciona un límite de riesgo claro para cada operación, mientras que el objetivo de stop loss del 4 por ciento asegura una buena relación de riesgo-beneficio. Más importante aún, la estrategia ofrece opciones de stop loss de seguimiento, lo que permite a las operaciones rentables continuar participando en tendencias favorables del mercado mientras protegen las ganancias ya obtenidas.

Estricto control de la administración de la ubicaciónLas estrategias para asegurar posiciones en una sola dirección en cualquier momento, evitando situaciones complejas de cobertura y potencial confusión en la administración de fondos.

Pensar en la guerra: un puente entre la teoría y la realidad

En mis años de práctica en el trading cuantitativo, he encontrado que este tipo de estrategias basadas en la adhesión a la línea de paridad funcionan especialmente bien en ciertos entornos de mercado. Especialmente en aquellos instrumentos financieros con características de tendencia evidentes, como los principales pares de divisas y los futuros de índices bursátiles.

Sin embargo, la estrategia también tiene sus limitaciones. En mercados con alta frecuencia de fluctuación, el umbral de dispersión del 5% puede ser demasiado conservador, lo que lleva a perder algunas oportunidades de negociación rápidas.

En un nivel más profundo, esta estrategia es en realidad una “cambio de estado” en el mercado de operaciones, de un estado de baja volatilidad a un estado de alta volatilidad. Esta transición suele ir acompañada de la entrada de nueva información o de un cambio en el estado de ánimo del mercado, que es el momento que los operadores de tendencias esperan capturar.

Perspectivas para el futuro: la evolución de las transacciones algorítmicas

Las estrategias tradicionales de análisis tecnológico están experimentando un profundo cambio con el desarrollo de las tecnologías de aprendizaje automático y inteligencia artificial. Estrategias de adhesión lineal como esta pueden combinarse con algoritmos de reconocimiento de patrones más complejos para formar sistemas de transacción más inteligentes.

Por ejemplo, podemos introducir datos de análisis de emociones para mejorar los mecanismos de confirmación de transacciones, o usar modelos de aprendizaje profundo para ajustar dinámicamente los parámetros de los umbrales de adherencia y dispersión. Estas mejoras permitirán que las estrategias se adapten mejor a un entorno de mercado cambiante.

En última instancia, el éxito del trading cuantitativo no es sólo una aplicación mecánica de los indicadores técnicos, sino una profunda comprensión de la naturaleza de los mercados y un temor a los riesgos. Esta estrategia de adhesión y dispersión en línea fija nos ofrece un buen punto de partida, pero el verdadero valor está en cómo continuamos perfeccionando y evolucionando en la práctica.

Código Fuente de la Estrategia
/*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="检测到强发散信号")