Estrategia de impulso de cruce de media móvil doble

El autor:¿ Qué pasa?, Fecha: 2023-11-16 17:25:13
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Ventajas

  1. Las medias móviles dobles determinan la tendencia a medio plazo, evitando el ruido a corto plazo

  2. El MACD ayuda a juzgar las tendencias a corto plazo y el impulso para una mayor rentabilidad

  3. El cambio de color del histograma ayuda a identificar mejor el momento de entrada

  4. El color de fondo cruzado resalta las señales

  5. Periodos de media móvil personalizables que se adaptan a diferentes entornos de mercado

  6. Los parámetros MACD ajustables optimizan el indicador

  7. Proporciona múltiples confirmaciones de entrada: tendencia, cruce, ruptura de patrón

Los riesgos

  1. Las MAs duales, insensibles a las fluctuaciones a corto plazo, pueden perder oportunidades a corto plazo

  2. Efecto MACD deficiente con ajustes incorrectos de parámetros, puede generar señales falsas

  3. Las entradas basadas únicamente en los índices de crecimiento de mercado y el MACD presentan algunos puntos ciegos

  4. No existe un mecanismo de stop loss que genere un riesgo de aumento de las pérdidas

  5. Falta de una gestión monetaria estricta y de un tamaño de posición

Soluciones posibles:

  1. Combinar otros indicadores para definir intervalos de oscilación a corto plazo y controlar el riesgo

  2. Optimizar los parámetros del MACD y probar en diferentes mercados

  3. Añadir patrón, impulso, etc. para confirmar las señales

  4. Establecer mecanismos de detención de pérdidas para limitar el tamaño de la pérdida

  5. Añadir un módulo de gestión de fondos al tamaño de las posiciones basado en el capital

Direcciones de optimización

  1. Prueba y optimización de las combinaciones de parámetros de MA para una mayor adaptabilidad del mercado

  2. Pruebe diferentes tipos de MA como VWAP, línea media de Bollinger, etc.

  3. Considere el volumen de operaciones para evitar falsos breakouts

  4. Incorporar el RSI, etc., para confirmar la sobrecompra/sobreventa

  5. Construir mecanismos de stop loss robustos como el stop de seguimiento, el stop de volatilidad, etc.

  6. Incorporar el tamaño de las posiciones basado en el tamaño de la cuenta

  7. Considere el aprendizaje automático para la optimización de parámetros

  8. Ampliar el universo estratégico para un enfoque mejorado de cartera

Conclusión

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")


Más.