Oscilador MACD con estrategia de cruce de la EMA

El autor:¿ Qué pasa?, Fecha: 2023-09-23 15:24:12
Las etiquetas:

Resumen general

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.

Estrategia lógica

Los componentes clave son:

  1. MACD: Juzgar los cambios en el impulso del precio.

  2. EMA: determina la dirección de la tendencia de los precios.

  3. Condición de tiempo: Definir el período de la estrategia válida.

  4. Opción larga/corta: elegir la dirección larga o corta.

Las reglas del comercio son:

  1. 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.

  2. 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.

Ventajas

En comparación con los indicadores únicos, las principales ventajas son:

  1. El MACD juzga el impulso a corto plazo, el EMA determina la dirección de la tendencia.

  2. Reglas simples y claras, fáciles de entender y aplicar.

  3. Ajuste flexible de parámetros para diferentes productos y plazos.

  4. Opción de negociación solo larga/corta o bidireccional.

  5. Puede definir un período de estrategia válido para evitar operaciones innecesarias.

  6. Desempleo estable durante años.

  7. El riesgo controlado por operación.

  8. Potencial para optimizar aún más con el aprendizaje automático.

Los riesgos

A pesar de los méritos, los riesgos a considerar:

  1. El ajuste de parámetros amplios corre el riesgo de sobreajuste.

  2. Sin paradas en el lugar, se arriesga a pérdidas ilimitadas.

  3. Sin filtro de volumen, el riesgo de fallas.

  4. El retraso en la captura de los giros de tendencia, no puede evitar todas las pérdidas.

  5. Deterioro del rendimiento por cambios en los regímenes de mercado.

  6. Basado únicamente en datos históricos, la robustez del modelo es clave.

  7. La alta frecuencia del comercio aumenta los costos de transacción.

  8. Necesidad de monitorear las relaciones de rentabilidad/riesgo y las curvas de rentabilidad.

Mejoras

La estrategia puede reforzarse mediante:

  1. Añadiendo un filtro de volumen para evitar falsos brotes.

  2. Implementación de paradas para controlar las pérdidas por operación.

  3. Evaluación de la eficacia de los parámetros a través de períodos de tiempo.

  4. Incorporar aprendizaje automático para optimizaciones dinámicas.

  5. Pruebas de robustez en todos los mercados.

  6. Ajustar el tamaño de la posición para reducir la frecuencia.

  7. Optimización de las estrategias de gestión de riesgos.

  8. Prueba de instrumentos de propagación para aumentar la frecuencia.

  9. Pruebas posteriores continuas para evitar el sobreajuste.

Conclusión

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)



Más.