Estrategia de la cinta de promedio móvil

El autor:¿ Qué pasa?, Fecha: 2023-12-18 12:29:19
Las etiquetas:

img

Resumen general

La Moving Average Ribbon es una estrategia de seguimiento de tendencias basada en múltiples promedios móviles. Monitoriza promedios móviles rápidos y lentos simultáneamente, y genera señales comerciales cuando los precios rompen la cinta de la media móvil. La estrategia combina la determinación de tendencias e indicadores de sobrecompra / sobreventa, que pueden capturar efectivamente las tendencias a medio y largo plazo.

Estrategia lógica

La estrategia utiliza 5 promedios móviles rápidos (líneas de 5-, 8-, 13-, 20 y 30 días) y 4 promedios móviles lentos (líneas de 45-, 70-, 105 y 150 días). Las líneas rápidas forman una cinta de promedio móvil interna y las líneas lentas forman una cinta de promedio móvil externa. Se genera una señal de compra cuando los precios se rompen por encima de la cinta interna, y se genera una señal de venta cuando los precios se rompen por debajo de la cinta interna. Para filtrar las roturas falsas, se requiere que los precios rompan la cinta interna durante 3 velas consecutivas, y la mayoría de las promedias móviles rápidas también se rompen sincrónicamente antes de generar señales comerciales.

Además, la estrategia también juzga las tendencias a largo plazo. Solo considera la generación de señales de compra cuando los precios están por encima del promedio móvil de 200 días. Por el contrario, solo considera la generación de señales de venta cuando los precios se rompen por debajo del promedio móvil de 200 días. Al determinar las tendencias a largo plazo, evita quedar atrapado durante las consolidaciones.

Análisis de ventajas

La estrategia tiene las siguientes ventajas:

  1. La combinación de cintas de promedio móvil internas y externas con líneas rápidas y lentas funciona bien para identificar tendencias a medio y largo plazo.

  2. El mecanismo de ruptura consecutiva puede filtrar eficazmente las rupturas falsas. Mientras tanto, requerir que la mayoría de los promedios móviles rápidos se rompan asegura que la tendencia esté cambiando.

  3. El uso de la línea de 200 días para determinar permite abrir posiciones solo cuando las tendencias comienzan a revertirse.

  4. Las medias móviles tienen tendencia y capacidad, mientras que la combinación de indicadores de sobrecompra y sobreventa para establecer puntos de stop loss garantiza un buen control del riesgo.

Análisis de riesgos

Los principales riesgos de esta estrategia incluyen:

  1. Cuando se producen fallas, la estrategia no puede evitar completamente las pérdidas.

  2. Riesgo de pérdida durante las tendencias de los rangos: cuando el mercado varía durante largos períodos, los puntos de parada de pérdidas pueden alcanzarse con frecuencia, lo que lleva a pérdidas más grandes.

  3. El riesgo de optimización de parámetros: la configuración incorrecta de los parámetros de la media móvil también puede conducir a errores en las señales de negociación, lo que resulta en mayores pérdidas.

Las soluciones correspondientes son:

  1. Ampliar adecuadamente los puntos de stop loss para dar a los precios suficiente espacio para moverse o adoptar un método de stop loss para permitir que la línea de stop loss siga los precios.

  2. Añadir indicadores de tendencia para evitar el establecimiento de posiciones sin dirección durante las consolidaciones, como el filtrado con DMI, MACD y otros indicadores.

  3. Utilice métodos de backtesting histórico y optimización de parámetros para seleccionar las mejores combinaciones de parámetros. También realice un seguimiento de la efectividad de los parámetros en el comercio real y haga optimizaciones dinámicas.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Optimizar los parámetros de promedio móvil para seleccionar los mejores números de ciclo. Ejecutar pruebas de retroceso de promedios móviles con diferentes números de ciclo para encontrar la combinación óptima de parámetros.

  2. Añadir indicadores de evaluación de tendencias para filtrar, como el índice de rendimiento por sobrecompra/sobreventa, las bandas de Bollinger por ruptura de canal, etc. Evite establecer posiciones ciegamente cuando las tendencias no sean claras.

  3. Adoptar promedios móviles adaptativos y optimizar dinámicamente los parámetros de los promedios móviles de acuerdo con las condiciones cambiantes del mercado y la volatilidad, de modo que se adapten mejor a los estados actuales del mercado.

  4. Combinar modelos de aprendizaje automático para juzgar las probabilidades de tendencia. Establecer modelos de probabilidad para evaluar las posibilidades de una ruptura exitosa, ayudando al sistema de decisión a juzgar el momento de entrada ideal.

  5. Optimice las estrategias de stop loss para un mejor seguimiento de los precios, como el trailing stop loss o el dimensionamiento dinámico de posiciones para hacer que la línea de stop loss sea más inteligente.

Resumen de las actividades

La estrategia de la cinta de promedio móvil es una de las estrategias de seguimiento de tendencias más comunes. Combina líneas rápidas y lentas para juzgar las tendencias a mediano y largo plazo, y establece mecanismos de ruptura consecutivos para decidir entradas. La estrategia equilibra las condiciones de tendencia y sobrecompra / sobreventa. Con la optimización de parámetros y la mejora del indicador, su rendimiento puede mejorarse aún más.


//@version=4
strategy(title="Moving Average Ribbon", shorttitle="MA Ribbon", overlay=true)
src = input(close, type=input.source, title="Source")
matype = input(title="Input one in lowercase: sma, ema, wma, trima, zlema, dema, tema, or hma", type=input.string, defval="trima")
// possible values: sma, ema, wma, trima, zlema, dema, tema, hma (hull ma)



trima(_src, _len) =>
    sma(sma(_src, _len), _len)
hma(_src, _len) =>
    wma(2 * wma(_src, _len / 2) - wma(_src, _len), round(sqrt(_len)))
dema(_src, _len) =>
    2 * ema(_src, _len) - ema(ema(_src, _len), _len)
tema(_src, _len) =>
    3 * ema(_src, _len) - 3 * ema(ema(_src, _len), _len) + 
       ema(ema(ema(_src, _len), _len), _len)
zlema(_src, _len) =>
    ema(_src, _len) + ema(_src, _len) - ema(ema(_src, _len), _len)

ma(_src, _len) =>
    hma__1 = hma(_src, _len)
    ema_1 = ema(_src, _len)
    sma_1 = sma(_src, _len)
    wma_1 = wma(_src, _len)
    trima__1 = trima(_src, _len)
    zlema__1 = zlema(_src, _len)
    dema__1 = dema(_src, _len)
    tema__1 = tema(_src, _len)
    matype == "hma" ? hma__1 : matype == "ema" ? ema_1 : matype == "sma" ? sma_1 : 
       matype == "wma" ? wma_1 : matype == "trima" ? trima__1 : 
       matype == "zlema" ? zlema__1 : matype == "dema" ? dema__1 : tema__1

ma05 = ma(src, 5)
ma08 = ma(src, 8)
ma13 = ma(src, 13)
ma20 = ma(src, 20)
ma30 = ma(src, 30)
ma45 = ma(src, 45)
ma70 = ma(src, 70)
ma105 = ma(src, 105)
ma150 = ma(src, 150)
ma200 = ma(src, 200)




maColor(ma, maRef) =>
    if change(ma) <= 0 and ma05 < maRef
        color.new(color.red, 20)
    else
        if change(ma) >= 0 and ma05 > maRef
            color.new(color.navy, 20)
        else
            if change(ma) < 0 and ma05 > maRef
                color.new(color.red, 20)
            else
                if change(ma) >= 0 and ma05 < maRef
                    color.new(color.navy, 20)
                else
                    color.gray


aboveConfirmed(x,maRef)=>
    above=true
    for i=1 to x
        if close[i]<maRef[i] and not (close[i]>ma200[i]*1.01) and not (ma05[i]>ma105[i]*1.015)
            above:=false
    above


aboveMost(x,len)=>
    above=0
    boolean=false
    if close[len]>ma05[len]
        above:=above+1
    if close[len]>ma08[len]
        above:=above+1
    if close[len]>ma13[len]
        above:=above+1
    if close[len]>ma20[len]
        above:=above+1
    if close[len]>ma30[len]
        above:=above+1
    if close[len]>ma45[len]
        above:=above+1
    if close[len]>ma70[len]
        above:=above+1
    if close[len]>ma105[len]
        above:=above+1
    if close[len]>ma150[len]
        above:=above+1
    if close[len]>ma200[len]
        above:=above+1
    if(above>=x)
        boolean:=true
    boolean
    
belowMost(x,len)=>
    above=0
    boolean=false
    if close[len]<ma05[len]
        above:=above+1
    if close[len]<ma08[len]
        above:=above+1
    if close[len]<ma13[len]
        above:=above+1
    if close[len]<ma20[len]
        above:=above+1
    if close[len]<ma30[len]
        above:=above+1
    if close[len]<ma45[len]
        above:=above+1
    if close[len]<ma70[len]
        above:=above+1
    if close[len]<ma105[len]
        above:=above+1
    if close[len]<ma150[len]
        above:=above+1
    if close[len]<ma200[len]
        above:=above+1
    if(above>=x)
        boolean:=true
    boolean
        
        
belowConfirmed(x,maRef)=>
    below=true
    for i=1 to x
        if close[i]>maRef[i] and not (close[i]<maRef[i]*0.99) and not (ma05[i]<ma105[i]*0.985)
            below:=false
    below
            
            
//plotshape(aboveConfirmed(5,ma150),color=color.navy,location=location.abovebar,style=shape.triangleup,size=size.large,title="above",text="above")
            
plot(ma05, color=maColor(ma05, ma150), style=plot.style_line, title="MMA05", linewidth=2)
plot(ma08, color=maColor(ma08, ma150), style=plot.style_line, title="MMA08", linewidth=1)
plot(ma13, color=maColor(ma13, ma150), style=plot.style_line, title="MMA13", linewidth=1)
plot(ma20, color=maColor(ma20, ma150), style=plot.style_line, title="MMA20", linewidth=1)
plot(ma30, color=maColor(ma30, ma150), style=plot.style_line, title="MMA30", linewidth=1)
plot(ma45, color=maColor(ma45, ma200), style=plot.style_line, title="MMA45", linewidth=1)
plot(ma70, color=maColor(ma70, ma200), style=plot.style_line, title="MMA70", linewidth=2)
plot(ma105, color=maColor(ma105, ma200), style=plot.style_line, title="MMA105", linewidth=2)
plot(ma150, color=maColor(ma150, ma200), style=plot.style_line, title="MMA150", linewidth=3)
plot(ma200, color=maColor(ma200, ma200), style=plot.style_line, title="MM200", linewidth=3)


closeLong=belowMost(6,1) and belowMost(6,2) and belowMost(6,3)
closeShort=aboveMost(6,1) and aboveMost(6,2) and aboveMost(6,3)

isAbove=aboveConfirmed(5,ma200)
strategy.entry("short", false, when=belowConfirmed(3,ma200) and belowMost(8,1) and belowMost(8,2) and belowMost(8,3))
strategy.entry("long", true, when=aboveConfirmed(3,ma200) and aboveMost(8,1) and aboveMost(8,2) and aboveMost(8,3))




strategy.close("long",when=closeLong)
strategy.close("short",when=closeShort)



Más.