Estratégia quantitativa de cruzamento de média móvel dinâmica de fusão multiindicador

SMA EMA WMA VWMA HMA RMA ALMA MA
Data de criação: 2025-01-06 13:46:47 última modificação: 2025-01-06 13:46:47
cópia: 1 Cliques: 110
1
focar em
1235
Seguidores

Estratégia quantitativa de cruzamento de média móvel dinâmica de fusão multiindicador

Visão geral

Esta estratégia é um sistema de negociação quantitativa baseado em múltiplos sinais de cruzamento de médias móveis. Ele combina sete tipos diferentes de indicadores de média móvel, incluindo média móvel simples (SMA), média móvel exponencial (EMA), média móvel ponderada (WMA), média móvel ponderada por volume (VWMA), média móvel de Hull (LME) e muito mais. Média Móvel Alta (HMA), Média Móvel Baixa (RMA) e Média Móvel de Arnold-Leguise (ALMA). A estratégia oferece suporte a um sistema de crossover de duas ou três linhas e permite escolher com flexibilidade entre posições compradas ou vendidas, de acordo com as condições de mercado.

Princípio da estratégia

A lógica central da estratégia é julgar a tendência do mercado observando a relação cruzada entre médias móveis de diferentes períodos. Quando a média móvel rápida cruza a média móvel lenta para cima, um sinal longo é gerado; caso contrário, um sinal curto é gerado. O sistema fornece dois métodos de entrada: um é baseado no cruzamento direto da média móvel e o outro é baseado na relação de posição do preço de fechamento em relação à média móvel. O sistema de três linhas aumenta a confiabilidade e a estabilidade do sinal ao introduzir a média móvel de médio prazo.

Vantagens estratégicas

  1. Forte adaptabilidade: Ao integrar sete médias móveis com características diferentes, a estratégia pode se adaptar a diferentes ambientes de mercado e produtos de negociação
  2. Sinal estável: múltiplos mecanismos de confirmação são usados ​​para evitar sinais falsos
  3. Parâmetros flexíveis: suporta configurações de ciclo personalizadas, fácil de otimizar e fazer backtest
  4. Risco controlável: Fornecer mecanismo de venda a descoberto para ajudar a aproveitar oportunidades de negociação bidirecionais
  5. Visualização clara: A estratégia fornece uma interface gráfica intuitiva, incluindo recursos visuais, como preenchimento de área de tendência

Risco estratégico

  1. Atraso: As médias móveis são essencialmente indicadores de atraso e podem perder o melhor ponto de entrada em um mercado volátil.
  2. Não é adequado para mercados voláteis: Sinais falsos frequentes podem ser gerados em um mercado lateral e volátil
  3. Dependência de parâmetros: O desempenho de diferentes combinações de parâmetros varia muito e precisa ser continuamente otimizado
  4. Risco sistêmico: pode não ser possível interromper perdas a tempo quando ocorrem eventos de mercado.

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

  1. Introdução de indicadores de volatilidade: É recomendável combinar indicadores de volatilidade como o ATR para ajustar dinamicamente o tamanho da posição
  2. Adicionar filtro de ambiente de mercado: você pode adicionar indicadores de força de tendência para filtrar sinais de negociação em mercados voláteis
  3. Otimizar o mecanismo de stop loss: Recomenda-se adicionar uma função de trailing stop loss para melhorar as capacidades de controle de risco
  4. Adicionar análise de volume: é recomendável combinar as alterações de volume para confirmar a validade da tendência

Resumir

Esta estratégia é um sistema abrangente de monitoramento de tendências que fornece aos traders uma estrutura de negociação quantitativa confiável ao integrar vários indicadores de média móvel e configurações de parâmetros flexíveis. Embora haja um certo atraso, a estratégia ainda tem um bom valor prático por meio de otimização razoável de parâmetros e medidas de controle de risco. É recomendável que os traders realizem otimizações direcionadas em negociações reais com base em características específicas do mercado.

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