Estrategia de trading cuantitativo con tres promedios móviles


Fecha de creación: 2024-01-23 14:20:50 Última modificación: 2024-01-23 14:20:50
Copiar: 0 Número de Visitas: 624
1
Seguir
1617
Seguidores

Estrategia de trading cuantitativo con tres promedios móviles

Esta estrategia es una estrategia típica de seguimiento de tendencias mediante el cálculo de promedios móviles de tres períodos diferentes, y en combinación con la ruptura de precios para formar una señal de negociación. La estrategia está diseñada para seguir las tendencias a medio plazo del mercado, y se puede aplicar a diferentes variedades y entornos de negociación mediante el ajuste dinámico de los parámetros.

El principio

La estrategia contiene tres medias móviles: MA1, MA2 y MA3 entre MA1 y MA2 se forman canales de negociación, cuya intersección da una señal de negociación; MA3 se utiliza para filtrar señales .

Cuando el promedio rápido MA1 atraviesa el promedio medio MA2, indica que la tendencia a corto plazo se fortalece, en este caso se produce una señal de más si el precio es superior al promedio largo MA3; por el contrario, si el MA1 atraviesa MA2 y el precio es inferior a MA3, se produce una señal de más.

El MA3 filtra el ruido de los mercados a corto plazo y sólo emite señales cuando se determina que la tendencia está en la fase de mediano y largo plazo. La estrategia ajusta dinámicamente los parámetros de las tres medias móviles para encontrar la combinación óptima de parámetros en diferentes mercados.

Las ventajas

  • Capturar diferentes tendencias periódicas a través de múltiples grupos de medias móviles
  • MA3 filtra las señales para evitar el arbitraje
  • Tipo de promedio y parámetros personalizables, de gran adaptabilidad
  • Cruzarse visualmente para identificar puntos de señal

El riesgo

  • Los promedios móviles se cruzan en retraso cuando se produce una reversión de la tendencia macrorrecurricular
  • La frecuencia de las transacciones puede ser excesiva, aumentando los costos de las transacciones y el riesgo de deslizamiento
  • Los parámetros incorrectos pueden causar exceso de transacciones o retrasos en las indicaciones de la señal

Se puede ajustar el ciclo MA, optimizar los parámetros para seleccionar diferentes variedades; optimizar la estrategia de parada de pérdidas, controlar la pérdida individual; en combinación con otros indicadores técnicos para confirmar la eficacia de la señal y reducir la probabilidad de señales erróneas.

Dirección de optimización

  • Añadir otros indicadores para juzgar las tendencias, como el MACD, el Blink, etc.
  • Aumentar las estrategias de stop loss
  • Ajuste dinámico de los parámetros para encontrar la combinación óptima de parámetros
  • Optimización de parámetros para diferentes variedades
  • Tener en cuenta los costos de las transacciones y optimizar la frecuencia de las transacciones

Resumir

Esta estrategia es una estrategia típica de seguimiento de tendencias. La estrategia se puede aplicar a diferentes variedades mediante optimización de parámetros, pero existe el riesgo de que se encuentre en una posición equivocada y se pierda el punto de inflexión. En el futuro, la estrategia se puede optimizar mediante la introducción de otros indicadores técnicos para determinar la efectividad de la señal, desarrollar mecanismos de optimización de parámetros dinámicos, etc.

Código Fuente de la Estrategia
/*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)