Esta es una estrategia de negociación simple pero eficiente que combina el oscilador MACD y el cruce EMA. Actualmente está configurado para velas de 4h pero adaptable a otros marcos de tiempo. Ha tenido un buen desempeño en BTC y ETH en los últimos 3 años, superando a buy and hold. Con optimizaciones se puede adaptar para futuros, índices, forex, acciones, etc.
Los componentes clave son:
MACD: Juzgar los cambios en el impulso del precio.
EMA: determina la dirección de la tendencia de los precios.
Condición de tiempo: Definir el período de la estrategia válida.
Opción larga/corta: elegir la dirección larga o corta.
Las reglas del comercio son:
Largo / salida corta: Cuando se cierra por encima de la EMA, el histograma MACD es positivo y la vela actual es más alta que la vela anterior.
Corto/salida larga: Cuando se cierra por debajo de la EMA, el histograma MACD es negativo y la vela actual es inferior a la anterior.
La estrategia combina la tendencia y el impulso en un sistema simple y eficiente.
En comparación con los indicadores únicos, las principales ventajas son:
El MACD juzga el impulso a corto plazo, el EMA determina la dirección de la tendencia.
Reglas simples y claras, fáciles de entender y aplicar.
Ajuste flexible de parámetros para diferentes productos y plazos.
Opción de negociación solo larga/corta o bidireccional.
Puede definir un período de estrategia válido para evitar operaciones innecesarias.
Desempleo estable durante años.
El riesgo controlado por operación.
Potencial para optimizar aún más con el aprendizaje automático.
A pesar de los méritos, los riesgos a considerar:
El ajuste de parámetros amplios corre el riesgo de sobreajuste.
Sin paradas en el lugar, se arriesga a pérdidas ilimitadas.
Sin filtro de volumen, el riesgo de fallas.
El retraso en la captura de los giros de tendencia, no puede evitar todas las pérdidas.
Deterioro del rendimiento por cambios en los regímenes de mercado.
Basado únicamente en datos históricos, la robustez del modelo es clave.
La alta frecuencia del comercio aumenta los costos de transacción.
Necesidad de monitorear las relaciones de rentabilidad/riesgo y las curvas de rentabilidad.
La estrategia puede reforzarse mediante:
Añadiendo un filtro de volumen para evitar falsos brotes.
Implementación de paradas para controlar las pérdidas por operación.
Evaluación de la eficacia de los parámetros a través de períodos de tiempo.
Incorporar aprendizaje automático para optimizaciones dinámicas.
Pruebas de robustez en todos los mercados.
Ajustar el tamaño de la posición para reducir la frecuencia.
Optimización de las estrategias de gestión de riesgos.
Prueba de instrumentos de propagación para aumentar la frecuencia.
Pruebas posteriores continuas para evitar el sobreajuste.
En resumen, la estrategia forma un sistema simple pero poderoso a partir de la combinación MACD y EMA. Pero las optimizaciones continuas y las pruebas de robustez son fundamentales para que cualquier estrategia se adapte a las condiciones cambiantes del mercado.
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © SoftKill21 //@version=4 strategy("My Script", overlay=true) //heiking ashi calculation UseHAcandles = input(false, title="Use Heikin Ashi Candles in Algo Calculations") // // === /INPUTS === // === BASE FUNCTIONS === haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close haOpen = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open haHigh = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high haLow = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low //timecondition fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", minval = 1970) //monday and session // To Date Inputs toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2021, title = "To Year", minval = 1970) startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true //ema data -- moving average len = input(9, minval=1, title="Length") src = input(hl2, title="Source") out = ema(src, len) //plot(out, title="EMA", color=color.blue) //histogram fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) 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) // 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 //main variables to apply conditions are going to be out(moving avg) and hist(macd) long = haClose > out and haClose > haClose[1] and out > out[1] and hist> 0 and hist[1] < 0 and time_cond short = haClose < out and haClose < haClose[1] and out < out[1] and hist < 0 and hist[1] > 0 and time_cond //limit to 1 entry var longOpeneda = false var shortOpeneda = false var int timeOfBuya = na longCondition= long and not longOpeneda if longCondition longOpeneda := true timeOfBuya := time longExitSignala = short exitLongCondition = longOpeneda[1] and longExitSignala if exitLongCondition longOpeneda := false timeOfBuya := na plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.white) plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.white) //automatization longEntry= input(true) shortEntry=input(false) if(longEntry) strategy.entry("long",strategy.long,when=longCondition) strategy.close("long",when=exitLongCondition) if(shortEntry) strategy.entry("short",strategy.short,when=exitLongCondition) strategy.close("short",when=longCondition)