Esta estrategia utiliza el principio de doble cruce de promedios móviles, combina el indicador MACD para el juicio de tendencias y el resaltado de fondo cruzado, y confirma las entradas con puntos de patrón, con el objetivo de capturar las tendencias a medio plazo en el mercado.
La estrategia construye medias móviles duales utilizando EMA rápida y EMA lenta, y determina la dirección de la tendencia basada en el cruce entre las líneas rápidas y lentas. También calcula el MACD y la señal, y traza su diferencia como un histograma.
Según el código, la longitud de la línea rápida es de 12 y la longitud de la línea lenta es de 26, lo que representa tendencias a corto y largo plazo.
La lógica cruzada:
tendencia_superior = macd > señal: la línea rápida cruza la línea lenta, lo que indica una tendencia alcista a corto plazo
tendencia_dn = macd < señal: la línea rápida cruza por debajo de la línea lenta, lo que indica una tendencia a la baja a corto plazo
Detección de puntos cruzados:
cross_UP = señal[1] >= macd[1] y señal < macd: línea rápida cruza línea lenta desde abajo
cross_DN = señal[1] <= macd[1] y señal > macd: línea rápida cruza línea lenta desde arriba
El cambio de color del histograma determina la fuerza de impulso:
histA_IsUp = Columna del histograma creciente y superior a 0, impulso fortalecimiento en tendencia alcista
histA_IsDown = Columna del histograma en declive pero aún superior a 0, impulso debilitado en tendencia alcista
La misma lógica debajo de 0.
Las medias móviles dobles determinan la tendencia a medio plazo, evitando el ruido a corto plazo
El MACD ayuda a juzgar las tendencias a corto plazo y el impulso para una mayor rentabilidad
El cambio de color del histograma ayuda a identificar mejor el momento de entrada
El color de fondo cruzado resalta las señales
Periodos de media móvil personalizables que se adaptan a diferentes entornos de mercado
Los parámetros MACD ajustables optimizan el indicador
Proporciona múltiples confirmaciones de entrada: tendencia, cruce, ruptura de patrón
Las MAs duales, insensibles a las fluctuaciones a corto plazo, pueden perder oportunidades a corto plazo
Efecto MACD deficiente con ajustes incorrectos de parámetros, puede generar señales falsas
Las entradas basadas únicamente en los índices de crecimiento de mercado y el MACD presentan algunos puntos ciegos
No existe un mecanismo de stop loss que genere un riesgo de aumento de las pérdidas
Falta de una gestión monetaria estricta y de un tamaño de posición
Soluciones posibles:
Combinar otros indicadores para definir intervalos de oscilación a corto plazo y controlar el riesgo
Optimizar los parámetros del MACD y probar en diferentes mercados
Añadir patrón, impulso, etc. para confirmar las señales
Establecer mecanismos de detención de pérdidas para limitar el tamaño de la pérdida
Añadir un módulo de gestión de fondos al tamaño de las posiciones basado en el capital
Prueba y optimización de las combinaciones de parámetros de MA para una mayor adaptabilidad del mercado
Pruebe diferentes tipos de MA como VWAP, línea media de Bollinger, etc.
Considere el volumen de operaciones para evitar falsos breakouts
Incorporar el RSI, etc., para confirmar la sobrecompra/sobreventa
Construir mecanismos de stop loss robustos como el stop de seguimiento, el stop de volatilidad, etc.
Incorporar el tamaño de las posiciones basado en el tamaño de la cuenta
Considere el aprendizaje automático para la optimización de parámetros
Ampliar el universo estratégico para un enfoque mejorado de cartera
Esta estrategia integra el filtro de tendencia de media móvil doble y el impulso del MACD, agrega características de patrón, construyendo un sistema de negociación a medio plazo relativamente estable. La ventaja clave radica en capturar la tendencia principal evitando el ruido a corto plazo. Pero también hay áreas que podrían mejorarse, como agregar mecanismos de stop loss y gestión de riesgos. En general, esto sirve como un valioso ejemplo conceptual, pero requiere pruebas y refinamientos integrales para el comercio en vivo.
/*backtest start: 2022-11-15 00:00:00 end: 2023-11-15 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Histogram MacD MVP_V2.1", shorttitle="Histogram MacD MVP_2.1") //Plot Inputs res = input.timeframe("", "Indicator TimeFrame") fast_length = input.int(title="Fast Length", defval=12) slow_length = input.int(title="Slow Length", defval=26) src = input.source(title="Source", defval=close) signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9) sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"]) sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"]) // Show Plots T/F show_macd = input.bool(true, title="Show MACD Lines", group="Show Plots?", inline="SP10") show_macd_LW = input.int(3, minval=0, maxval=5, title = "MACD Width", group="Show Plots?", inline="SP11") show_signal_LW= input.int(2, minval=0, maxval=5, title = "Signal Width", group="Show Plots?", inline="SP11") show_Hist = input.bool(true, title="Show Histogram", group="Show Plots?", inline="SP20") show_hist_LW = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP20") show_trend = input.bool(true, title = "Show MACD Lines w/ Trend Color", group="Show Plots?", inline="SP30") show_HB = input.bool(false, title="Show Highlight Price Bars", group="Show Plots?", inline="SP40") show_cross = input.bool(false, title = "Show BackGround on Cross", group="Show Plots?", inline="SP50") show_dots = input.bool(true, title = "Show Circle on Cross", group="Show Plots?", inline="SP60") show_dots_LW = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP60") //show_trend = input(true, title = "Colors MACD Lines w/ Trend Color", group="Show Plots?", inline="SP5") // MACD Lines colors col_macd = input.color(#FF6D00, "MACD Line ", group="Color Settings", inline="CS1") col_signal = input.color(#2962FF, "Signal Line ", group="Color Settings", inline="CS1") col_trnd_Up = input.color(#4BAF4F, "Trend Up ", group="Color Settings", inline="CS2") col_trnd_Dn = input.color(#B71D1C, "Trend Down ", group="Color Settings", inline="CS2") // Histogram Colors col_grow_above = input.color(#26A69A, "Above Grow", group="Histogram Colors", inline="Hist10") col_fall_above = input.color(#FF5252, "Fall", group="Histogram Colors", inline="Hist10") col_grow_below = input.color(#FF5252, "Below Grow", group="Histogram Colors", inline="Hist20") col_fall_below = input.color(#f8f524, "Fall", group="Histogram Colors", inline="Hist20") // Alerts T/F Inputs alert_Long = input.bool(true, title = "MACD Cross Up", group = "Alerts", inline="Alert10") alert_Short = input.bool(true, title = "MACD Cross Dn", group = "Alerts", inline="Alert10") alert_Long_A = input.bool(false, title = "MACD Cross Up & > 0", group = "Alerts", inline="Alert20") alert_Short_B = input.bool(false, title = "MACD Cross Dn & < 0", group = "Alerts", inline="Alert20") // Calculating fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)) slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)) macd = fast_ma - slow_ma signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)) hist = macd - signal // MACD Trend and Cross Up/Down conditions trend_up = macd > signal trend_dn = macd < signal cross_UP = signal[1] >= macd[1] and signal < macd cross_DN = signal[1] <= macd[1] and signal > macd cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0 cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0 // Condition that changes Color of MACD Line if Show Trend is turned on.. trend_col = show_trend and trend_up ? col_trnd_Up : trend_up ? col_macd : show_trend and trend_dn ? col_trnd_Dn: trend_dn ? col_macd : na //Var Statements for Histogram Color Change var bool histA_IsUp = false var bool histA_IsDown = false var bool histB_IsDown = false var bool histB_IsUp = false histA_IsUp := hist == hist[1] ? histA_IsUp[1] : hist > hist[1] and hist > 0 histA_IsDown := hist == hist[1] ? histA_IsDown[1] : hist < hist[1] and hist > 0 histB_IsDown := hist == hist[1] ? histB_IsDown[1] : hist < hist[1] and hist <= 0 histB_IsUp := hist == hist[1] ? histB_IsUp[1] : hist > hist[1] and hist <= 0 hist_col = histA_IsUp ? col_grow_above : histA_IsDown ? col_fall_above : histB_IsDown ? col_grow_below : histB_IsUp ? col_fall_below :color.silver // Plot Statements //Background Color bgcolor(show_cross and cross_UP ? col_trnd_Up : na, editable=false) bgcolor(show_cross and cross_DN ? col_trnd_Dn : na, editable=false) //Highlight Price Bars barcolor(show_HB and trend_up ? col_trnd_Up : na, title="Trend Up", offset = 0, editable=false) barcolor(show_HB and trend_dn ? col_trnd_Dn : na, title="Trend Dn", offset = 0, editable=false) //Regular Plots plot(show_Hist and hist ? hist : na, title="Histogram", style=plot.style_columns, color=color.new(hist_col ,0),linewidth=show_hist_LW) plot(show_macd and signal ? signal : na, title="Signal", color=color.new(col_signal, 0), style=plot.style_line ,linewidth=show_signal_LW) plot(show_macd and macd ? macd : na, title="MACD", color=color.new(trend_col, 0), style=plot.style_line ,linewidth=show_macd_LW) hline(0, title="0 Line", color=color.new(color.gray, 0), linestyle=hline.style_dashed, linewidth=1, editable=false) plot(show_dots and cross_UP ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false) plot(show_dots and cross_DN ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false) //Alerts if alert_Long and cross_UP alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Up.", alert.freq_once_per_bar_close) if alert_Short and cross_DN alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Down.", alert.freq_once_per_bar_close) //Alerts - Stricter Condition - Only Alerts When MACD Crosses UP & MACD > 0 -- Crosses Down & MACD < 0 if alert_Long_A and cross_UP_A alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD > 0 And Crosses Up.", alert.freq_once_per_bar_close) if alert_Short_B and cross_DN_B alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD < 0 And Crosses Down.", alert.freq_once_per_bar_close) if (histA_IsUp) strategy.entry("buy", strategy.long, comment="buy") if (histA_IsDown) strategy.entry("sell", strategy.short, comment="sell")