Este artículo explica en detalle una estrategia de negociación cuantitativa basada en el indicador MACD normalizado.
I. Lógica de la estrategia
La idea central de esta estrategia es normalizar el indicador MACD tradicional para reducir las tasas de error.
Calcular los promedios móviles de Hull a corto y largo plazo y utilizar su cruce para determinar la dirección de la tendencia.
Calcule la diferencia del MACD.
Normaliza el MACD durante un cierto período.
Calcular la media móvil del MACD normalizado como el disparador.
Ir largo cuando el MACD normalizado cruza por encima del gatillo, y ir corto cuando cruza por debajo.
Agregue el filtrado de tendencias para evitar perderse los movimientos más importantes.
Configure stop loss y take profit para controlar el riesgo por operación.
La normalización reduce la magnitud absoluta de las diferencias del MACD, reduciendo el ruido para una mayor calidad de señal.
II. Ventajas de la Estrategia
En comparación con las estrategias simples del MACD, la mayor ventaja es la normalización, que puede reducir eficazmente los errores del MACD y mejorar la precisión de la señal.
Otra ventaja es la adición de filtros de tendencia para evitar falsas reversiones, lo que aumenta la estabilidad de la estrategia.
Por último, los ajustes de stop loss y take profit también garantizan una rentabilidad del riesgo controlada por operación para una gestión prudente del dinero.
III. Posibles debilidades
A pesar de las optimizaciones, en la práctica hay que tener en cuenta los siguientes riesgos:
En primer lugar, la gran dificultad de optimización de parámetros puede conducir a un sobreajuste si se establece de manera inadecuada.
En segundo lugar, si el stop loss se establece demasiado cerca, se corre el riesgo de que se detenga prematuramente.
Por último, las señales pueden retrasarse durante las transiciones de tendencia, no reaccionando a tiempo.
IV. Resumen
En resumen, este artículo ha explicado una estrategia comercial cuantitativa que normaliza el indicador MACD. Mejora la estrategia MACD clásica para mejorar efectivamente la calidad de la señal e incorpora mecanismos de gestión de riesgos. Pero la dificultad de optimización de parámetros y la configuración de stop loss aún deben manejarse con prudencia. En general, proporciona un enfoque viable para optimizar las estrategias MACD.
/*backtest start: 2023-08-14 00:00:00 end: 2023-09-13 00:00:00 period: 6h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 // Normalized MACD but heavily modified by SeaSide420. Normalized MACD v420 strategy("Normalized MACD (v420)",shorttitle="NmacD(v420)",overlay=true, default_qty_type=strategy.percent_of_equity, max_bars_back=1440, default_qty_value=100, calc_on_order_fills= true, calc_on_every_tick=true, pyramiding=0) p=input(ohlc4) jah=input(title="HullMA cross",defval=21) tsp = input(34,title='Trigger') np = input(50,title='Normalize') SL = input(defval=-420.00, title="Stop Loss in $", step=1) TP = input(defval=31.00, title="Target Point in $", step=1) ot=1 n2ma=2*wma(p,round(jah/2)) nma=wma(p,jah) diff=n2ma-nma sqn=round(sqrt(jah)) n2ma1=2*wma(p[2],round(jah/2)) nma1=wma(p[2],jah) diff1=n2ma1-nma1 sqn1=round(sqrt(jah)) n1=wma(diff,sqn) n2=wma(diff1,sqn) sh=n1 lon=n2 ratio = min(sh,lon)/max(sh,lon) Mac = (iff(sh>lon,2-ratio,ratio)-1) MacNorm = ((Mac-lowest(Mac, np)) /(highest(Mac, np)-lowest(Mac, np)+.000001)*2)- 1 MacNorm2 = iff(np<2,Mac,MacNorm) Trigger = wma(MacNorm2, tsp) Hist =(MacNorm2-Trigger) Hist2= Hist>1?1:Hist<-1?-1:Hist teh=MacNorm2+MacNorm2[2]-MacNorm2[1] closelong = strategy.openprofit<SL or strategy.openprofit>TP or teh[1]<Trigger[1] and n1<n2[1] if (closelong) strategy.close("Long") closeshort = strategy.openprofit<SL or strategy.openprofit>TP or teh[1]>Trigger[1] and n1>n2[1] if (closeshort) strategy.close("Short") longCondition = Trigger<0 and teh>Trigger and MacNorm>Trigger and strategy.opentrades<ot if (longCondition) strategy.entry("Long",strategy.long) shortCondition = Trigger>0 and teh<Trigger and MacNorm<Trigger and strategy.opentrades<ot if (shortCondition) strategy.entry("Short",strategy.short)