Estrategia de negociación cuantitativa de media móvil triple

El autor:¿ Qué pasa?, Fecha: 2024-01-23 14:20:50
Las etiquetas:

img

Esta estrategia genera señales comerciales mediante el cálculo de tres promedios móviles de diferentes períodos y la combinación de avances de precios. Pertenece a una estrategia típica de seguimiento de tendencias. La estrategia tiene como objetivo seguir las tendencias a mediano plazo en el mercado y se puede adaptar a diferentes productos y entornos comerciales mediante el ajuste dinámico de parámetros.

Principio

La estrategia contiene tres promedios móviles: MA1, MA2 y MA3.

Cuando el promedio móvil rápido MA1 cruza por encima del promedio móvil a medio plazo MA2, indica el fortalecimiento de la tendencia a corto plazo. En este momento, si el precio está por encima del promedio móvil a largo plazo MA3, se genera una señal larga; por el contrario, si el MA1 cruza por debajo del MA2 y el precio está por debajo del MA3, se genera una señal corta.

La función de MA3 es filtrar el ruido del mercado a corto plazo y generar señales solo después de determinar que la tendencia ha entrado en la etapa a medio y largo plazo.

Ventajas

  • Captura de las tendencias de los diferentes ciclos mediante múltiples medias móviles
  • El MA3 filtra las señales para evitar los azotes
  • Tipos y parámetros de medias móviles personalizables, alta adaptabilidad
  • Visualizar las cruces para identificar los puntos de señal

Los riesgos

  • Las medias móviles pueden retrasarse cuando se invierte una tendencia importante
  • Potencialmente alta frecuencia de negociación, aumento de los costes de negociación y riesgos de deslizamiento
  • Los parámetros incorrectos pueden causar señales de sobreventa o retraso

Puede optimizar los períodos de MA para diferentes productos; optimizar el stop loss para controlar pérdidas individuales; combinar otros indicadores técnicos para confirmar la validez de la señal y reducir las señales falsas.

Direcciones de optimización

  • Añadir otros indicadores para determinar las tendencias, por ejemplo, MACD, bandas de Bollinger, etc.
  • Añadir estrategias de stop loss/take profit
  • Ajuste dinámico de parámetros para encontrar combinaciones óptimas
  • Optimización de parámetros para diferentes productos
  • Considere los costos de negociación, optimice la frecuencia de negociación

Resumen de las actividades

Esta estrategia genera señales comerciales mediante el cálculo de tres promedios móviles y la observación de sus cruces. Utilizando la idea de combinar líneas rápidas, medianas y lentas para determinar tendencias, es una estrategia típica de seguimiento de tendencias. La estrategia puede adaptarse a diferentes productos a través de la optimización de parámetros, pero corre el riesgo de problemas y vueltas perdidas. Las mejoras futuras podrían introducir otros indicadores técnicos para juzgar la validez de la señal, desarrollar mecanismos dinámicos de optimización de parámetros, etc. para hacer que la estrategia sea más flexible.


/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Meesemoo

//@version=4
strategy("Custom MA Strategy Tester", overlay = true)
MA1Period = input(13, title="MA1 Period")
MA1Type = input(title="MA1 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA1Source = input(title="MA1 Source", type=input.source, defval=close)
MA1Visible = input(title="MA1 Visible", type=input.bool, defval=true)
MA2Period = input(50, title="MA2 Period")
MA2Type = input(title="MA2 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA2Source = input(title="MA2 Source", type=input.source, defval=close)
MA2Visible = input(title="MA2 Visible", type=input.bool, defval=true) 
MA3Period = input(200, title="MA3 Period")
MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "DEMA", "TEMA"])
MA3Source = input(title="MA3 Source", type=input.source, defval=close)
MA3Visible = input(title="MA3 Visible", type=input.bool, defval=true)
ShowCrosses = input(title="Show Crosses", type=input.bool, defval=true)

MA1 = if MA1Type == "SMA"
    sma(MA1Source, MA1Period)
else
    if MA1Type == "EMA"
        ema(MA1Source, MA1Period)
    else
        if MA1Type == "WMA"
            wma(MA1Source, MA1Period)
        else
            if MA1Type == "RMA"
                rma(MA1Source, MA1Period)
            else
                if MA1Type == "HMA"
                    wma(2*wma(MA1Source, MA1Period/2)-wma(MA1Source, MA1Period), round(sqrt(MA1Period)))
                else
                    if MA1Type == "DEMA"
                        e = ema(MA1Source, MA1Period)
                        2 * e - ema(e, MA1Period)
                    else
                        if MA1Type == "TEMA"
                            e = ema(MA1Source, MA1Period)
                            3 * (e - ema(e, MA1Period)) + ema(ema(e, MA1Period), MA1Period)

                    
MA2 = if MA2Type == "SMA"
    sma(MA2Source, MA2Period)
else
    if MA2Type == "EMA"
        ema(MA2Source, MA2Period)
    else
        if MA2Type == "WMA"
            wma(MA2Source, MA2Period)
        else
            if MA2Type == "RMA"
                rma(MA2Source, MA2Period)
            else
                if MA2Type == "HMA"
                    wma(2*wma(MA2Source, MA2Period/2)-wma(MA2Source, MA2Period), round(sqrt(MA2Period)))
                else
                    if MA2Type == "DEMA"
                        e = ema(MA2Source, MA2Period)
                        2 * e - ema(e, MA2Period)
                    else
                        if MA2Type == "TEMA"
                            e = ema(MA2Source, MA2Period)
                            3 * (e - ema(e, MA2Period)) + ema(ema(e, MA2Period), MA2Period)
                    
MA3 = if MA3Type == "SMA"
    sma(MA3Source, MA3Period)
else
    if MA3Type == "EMA"
        ema(MA3Source, MA3Period)
    else
        if MA3Type == "WMA"
            wma(MA3Source, MA3Period)
        else
            if MA3Type == "RMA"
                rma(MA3Source, MA3Period)
            else
                if MA3Type == "HMA"
                    wma(2*wma(MA3Source, MA3Period/2)-wma(MA3Source, MA3Period), round(sqrt(MA3Period)))
                else
                    if MA3Type == "DEMA"
                        e = ema(MA3Source, MA3Period)
                        2 * e - ema(e, MA3Period)
                    else
                        if MA3Type == "TEMA"
                            e = ema(MA3Source, MA3Period)
                            3 * (e - ema(e, MA3Period)) + ema(ema(e, MA3Period), MA3Period)
                    


p1 = plot(MA1Visible ? MA1 : na, color=color.green, linewidth=1)
p2 = plot(MA2Visible ? MA2 : na, color=color.yellow, linewidth=1)
p3 = plot(MA3Visible ? MA3 : na, color=color.red, linewidth=2)

fill(p1, p2, color.silver, transp=80, title="Fill")


start = timestamp(2019, 1, 1, 1, 0)
end = timestamp(2025, 1, 1, 1, 0)

if time >= start and time <= end
    longCondition = crossover(MA1, MA2) and close > MA3
    if (longCondition)
        strategy.entry("Long", strategy.long)
        
    shortCondition = crossunder(MA1, MA2) and close < MA3
    if (shortCondition)
        strategy.entry("Short", strategy.short)

Más.