Estrategia cuantitativa de cruce de medias móviles dinámicas de fusión de múltiples indicadores

SMA EMA WMA VWMA HMA RMA ALMA MA
Fecha de creación: 2025-01-06 13:46:47 Última modificación: 2025-01-06 13:46:47
Copiar: 1 Número de Visitas: 68
1
Seguir
1166
Seguidores

Estrategia cuantitativa de cruce de medias móviles dinámicas de fusión de múltiples indicadores

Descripción general

Esta estrategia es un sistema de trading cuantitativo basado en múltiples señales de cruce de medias móviles. Combina siete tipos diferentes de indicadores de promedio móvil, incluido el promedio móvil simple (SMA), el promedio móvil exponencial (EMA), el promedio móvil ponderado (WMA), el promedio móvil ponderado por volumen (VWMA), el promedio móvil de Hull (LME) y más. Media móvil alta (HMA), media móvil aproximada (RMA) y media móvil de Arnold-Leguise (ALMA). La estrategia admite un sistema de cruce de dos o tres líneas y puede elegir de manera flexible operar en largo o en corto según las condiciones del mercado.

Principio de estrategia

La lógica central de la estrategia es juzgar la tendencia del mercado observando la relación cruzada entre los promedios móviles de diferentes períodos. Cuando la media móvil rápida cruza la media móvil lenta hacia arriba, se genera una señal larga; de lo contrario, se genera una señal corta. El sistema proporciona dos métodos de entrada: uno se basa en el cruce directo de la media móvil y el otro se basa en la relación de posición del precio de cierre con respecto a la media móvil. El sistema de tres líneas aumenta la confiabilidad y estabilidad de la señal al introducir el promedio móvil de mediano plazo.

Ventajas estratégicas

  1. Fuerte adaptabilidad: al integrar siete promedios móviles diferentes, la estrategia puede adaptarse a diferentes entornos de mercado y productos comerciales.
  2. Señal estable: se utilizan múltiples mecanismos de confirmación para evitar señales falsas
  3. Parámetros flexibles: admite configuraciones de ciclo personalizadas, fácil de optimizar y realizar pruebas retrospectivas
  4. Riesgo controlable: proporcionar un mecanismo de venta en corto para ayudar a aprovechar las oportunidades comerciales bidireccionales
  5. Visualización clara: La estrategia proporciona una interfaz gráfica intuitiva, que incluye ayudas visuales como el llenado del área de tendencias.

Riesgo estratégico

  1. Retraso: Los promedios móviles son esencialmente indicadores rezagados y pueden perder el mejor punto de entrada en un mercado volátil.
  2. No apto para mercados volátiles: en un mercado lateral y volátil pueden generarse señales falsas frecuentes.
  3. Dependencia de parámetros: el rendimiento de diferentes combinaciones de parámetros varía mucho y debe optimizarse continuamente.
  4. Riesgo sistémico: Puede que no sea posible detener las pérdidas a tiempo cuando ocurren eventos del mercado.

Dirección de optimización de la estrategia

  1. Introducción de indicadores de volatilidad: se recomienda combinar indicadores de volatilidad como ATR para ajustar dinámicamente el tamaño de la posición.
  2. Agregar filtro de entorno de mercado: puede agregar indicadores de fuerza de tendencia para filtrar señales comerciales en mercados volátiles
  3. Optimizar el mecanismo de stop loss: se recomienda agregar una función de stop loss dinámico para mejorar las capacidades de control de riesgos.
  4. Agregar análisis de volumen: se recomienda combinar los cambios de volumen para confirmar la validez de la tendencia.

Resumir

Esta estrategia es un sistema integral de seguimiento de tendencias que proporciona a los operadores un marco comercial cuantitativo confiable mediante la integración de múltiples indicadores de promedio móvil y configuraciones de parámetros flexibles. Aunque existe un cierto retraso, la estrategia aún tiene un buen valor práctico a través de una optimización razonable de parámetros y medidas de control de riesgos. Se recomienda que los traders realicen una optimización específica en el trading real en función de las características específicas del mercado.

Código Fuente de la Estrategia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Cruce de Medias Total", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100,max_bars_back=1000)

// Parámetros de entrada
periodo_rapida = input.int(50, title="Periodos para media rápida", minval=1)
periodo_lenta = input.int(200, title="Periodos para media lenta", minval=1)

// Selección del tipo de media móvil
tipo_de_media = input.string(title="Elige el tipo de media móvil", defval="Simple sma", options=["Simple sma", "Exponencial ema", "Ponderada wma", "Volumen ponderada vwma", "Hull hma", "Media suavizada rma", "Media de Arnaud Legoux alma"])

// Posibilidad de estrategia con cruce de tres medias móviles
tres_medias = input.bool(false, title="Estrategia con cruce de 3 medias móviles")
periodo_media = input.int(100, title="Periodos para media media", minval=1)

// Opción de operar en corto
permitir_corto = input.bool(false, title="Permitir operaciones en corto")

// Opción de cuando comprar
cuando_comprar = input.string(title="Cuando comprar", defval="Cruce de medias", options=["Vela anterior cierra por encima de las medias", "Cruce de medias"])
// Opción de cuando vender
cuando_vender = input.string(title="Cuando vender", defval="Cruce de medias", options=["Vela anterior cierra por debajo de las medias", "Cruce de medias"])

float media_mov_rapida = na
float media_mov_media = na
float media_mov_lenta = na

// Definición de las medias móviles
if tipo_de_media == "Simple sma"
    media_mov_rapida := ta.sma(close, periodo_rapida)
    media_mov_media := ta.sma(close, periodo_media)
    media_mov_lenta := ta.sma(close, periodo_lenta)
else if tipo_de_media == "Exponencial ema"
    media_mov_rapida := ta.ema(close, periodo_rapida)
    media_mov_media := ta.ema(close, periodo_media)
    media_mov_lenta := ta.ema(close, periodo_lenta)
else if tipo_de_media == "Ponderada wma"
    media_mov_rapida := ta.wma(close, periodo_rapida)
    media_mov_media := ta.wma(close, periodo_media)
    media_mov_lenta := ta.wma(close, periodo_lenta)
else if tipo_de_media == "Volumen ponderada vwma"
    media_mov_rapida := ta.vwma(close, periodo_rapida)
    media_mov_media := ta.vwma(close, periodo_media)
    media_mov_lenta := ta.vwma(close, periodo_lenta)
else if tipo_de_media == "Hull hma"
    media_mov_rapida := ta.hma(close, periodo_rapida)
    media_mov_media := ta.hma(close, periodo_media)
    media_mov_lenta := ta.hma(close, periodo_lenta)
else if tipo_de_media == "Media suavizada rma"
    media_mov_rapida := ta.rma(close, periodo_rapida)
    media_mov_media := ta.rma(close, periodo_media)
    media_mov_lenta := ta.rma(close, periodo_lenta)
else if tipo_de_media == "Media de Arnaud Legoux alma"
    offset = input.int(0, title="Desfase para ALMA", minval=-100, maxval=100)
    sigma = input.float(6, title="Sigma para ALMA", minval=0.1, maxval=10)
    media_mov_rapida := ta.alma(close, periodo_rapida, offset, sigma)
    media_mov_media := ta.alma(close, periodo_media, offset, sigma)
    media_mov_lenta := ta.alma(close, periodo_lenta, offset, sigma)

// Graficar las medias móviles en el gráfico
plot_rapida = plot(media_mov_rapida, color=color.green, linewidth=2, title="Media Móvil Rápida")
plot_media = plot(tres_medias ? media_mov_media : na, color=color.blue, linewidth=2, title="Media Móvil Media")
plot_lenta = plot(media_mov_lenta, color=color.red, linewidth=2, title="Media Móvil Lenta")

// Rellenar el área entre las medias móviles con color condicionado
fill(plot_rapida, plot_lenta, media_mov_rapida > media_mov_lenta ? color.new(color.green, 90) : color.new(color.red, 90), title="Relleno entre Medias")

// Lógica de la estrategia para cruce de medias
comprado = strategy.position_size > 0  // Verifica si ya hay una posición abierta
vendido = strategy.position_size < 0 

if not comprado  // Solo compra si no hay una posición abierta
    if tres_medias and cuando_comprar == "Cruce de medias"
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Cruce de medias"
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_media and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)
    else if not tres_medias and cuando_comprar == "Vela anterior cierra por encima de las medias"
        if close[1] > media_mov_rapida and close[1] > media_mov_lenta
            strategy.entry("Largo", strategy.long)
            label.new(bar_index, low, "Largo", style=label.style_label_up, color=color.green, textcolor=color.white)

// Condición de cierre de la posición
if comprado
    if tres_medias and cuando_vender == "Cruce de medias"
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Cruce de medias"
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_media and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)
    else if not tres_medias and cuando_vender == "Vela anterior cierra por debajo de las medias"
        if close[1] < media_mov_rapida and close[1] < media_mov_lenta
            strategy.close("Largo")
            label.new(bar_index, high, "Cierre Largo", style=label.style_label_down, color=color.red, textcolor=color.white)

// Condición de entrar en corto
if not vendido and permitir_corto
    if tres_medias
        if media_mov_rapida < media_mov_media and media_mov_media < media_mov_lenta
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)
    else
        if ta.crossunder(media_mov_rapida, media_mov_lenta)
            strategy.entry("Short", strategy.short)
            label.new(bar_index, low, "Short", style=label.style_label_up, color=color.blue, textcolor=color.white)

// Condición de cierre de posición corta
if vendido
    if tres_medias
        if media_mov_rapida > media_mov_media and media_mov_media > media_mov_lenta
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)
    else
        if ta.crossover(media_mov_rapida, media_mov_lenta)
            strategy.close("Short")
            label.new(bar_index, high, "Cierre Short", style=label.style_label_down, color=color.purple, textcolor=color.white)