Estrategia cuantitativa MACD de doble media móvil cruzada

El autor:¿ Qué pasa?, Fecha: 2024-02-22 15:32:42
Las etiquetas:

img

Resumen general

Esta estrategia genera el indicador MACD mediante el cálculo de la diferencia entre las líneas de promedio móvil rápido y lento, y juzga la tendencia y las áreas de sobrecompra / sobreventa de los mercados financieros junto con la línea de señal.

Estrategia lógica

La lógica básica es usar el indicador MACD generado a partir de la diferencia de MA rápida y lenta para determinar la dirección de la tendencia del mercado, y la línea de señal para juzgar los niveles de sobrecompra / sobreventa. Cuando el MACD y la línea de señal forman una cruz de oro, es una señal larga para ir largo. Cuando se forma una cruz muerta, es una señal corta para ir corto. Mientras tanto, utiliza la relación del precio con el MA de 200 días para filtrar las señales, tomando solo señales largas cuando el precio está por encima de la MA de 200 días y señales cortas cuando el precio está por debajo de la MA de 200 días, para evitar golpes durante las tendencias fuertes.

El método específico de cálculo es el siguiente:

  1. Promedio móvil rápido (EMA de 12 días) menos promedio móvil lento (EMA de 26 días) para obtener el MACD
  2. La EMA de 9 días del MACD para obtener la línea de señal
  3. MACD menos línea de señal para obtener el histograma MACD

Cuando el MACD cruza por encima de la línea de señal mientras ambos están por debajo de 0, es una señal larga de cruz dorada. Cuando el MACD cruza por debajo de la línea de señal mientras ambos están por encima de 0, es una señal corta de cruz muerta. Mientras tanto, solo toma mucho tiempo cuando el precio está por encima del MA de 200 días, y corto cuando el precio está por debajo del MA de 200 días.

Ventajas

  1. El uso de un sistema de indicadores duales evita las limitaciones de un solo indicador y mejora la precisión
  2. La combinación de los filtros dobles de acción de precios y MA evita problemas durante las tendencias fuertes
  3. Gran espacio de optimización de parámetros para adaptarse a diferentes entornos de mercado
  4. La configuración conservadora de los parámetros conduce a una menor cantidad de señales, pero de mayor calidad
  5. Lógica estratégica sencilla y fácil de aplicar

Los riesgos

  1. La volatilidad del mercado puede provocar errores en el cálculo de los indicadores
  2. El retraso de las medidas de financiación afecta a la puntualidad de la estrategia
  3. Menos señales pueden perder oportunidades de tendencia
  4. Riesgos de sobreoptimización en la optimización de parámetros
  5. Falta de control de extracción y mecanismos de detención de pérdidas

Los riesgos pueden reducirse acortando los períodos de MA, añadiendo otros indicadores y añadiendo stop loss.

Direcciones de optimización

1.Probados en diferentes plazos de tiempo, desde 15m hasta 1D, resultados óptimos en 4H en rendimientos ajustados al riesgo

2.Optimizar el MA rápido y lento para que el MACD capte ciclos, 7-21 bueno para 15m

3.La media global del MACD ha dado buenos resultados

4.La reducción de las pérdidas de seguimiento mejora la gestión del riesgo

Conclusión

Esta es en general una estrategia muy simple y práctica, generando señales de comercio de alta probabilidad a través de un sistema de indicadores duales y filtrado de precios. Tiene un margen de ganancia relativamente alto, utiliza la combinación de parámetros MACD clásicos para evitar la sobre-optimización. Todavía hay un gran espacio para la optimización ajustando los parámetros MA, agregando otros indicadores y mecanismos de stop loss para mejorar aún más el rendimiento. En general, es una estrategia cuantitativa típica basada en los fundamentos.


/*backtest
start: 2024-02-14 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © Hurmun

//@version=4
strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100)


fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


movinga2 = input(title="movinga 2", type=input.integer, defval=200)

movinga200 = sma(close, movinga2)

plot(movinga200, "MA", color.orange)
longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
    
shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
    
stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100

longStoploss = strategy.position_avg_price * (1 - stoploss)
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStoploss = strategy.position_avg_price * (1 + stoploss)
    
if (strategy.position_size > 0 )
    strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss)






if (strategy.position_size < 0 )
    strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)

Más.