La idea central de esta estrategia es combinar dos promedios móviles e indicador MACD para determinar la dirección de la tendencia después de la negociación. Cuando el MA rápido cruza por encima del MA lento, indica una oportunidad de tendencia alcista. Cuando el MA rápido cruza por debajo del MA lento, indica una oportunidad de tendencia bajista. El histograma MACD se utiliza para determinar puntos de entrada y salida específicos al ir largo cuando cruza por encima de 0 y ir corto cuando cruza por debajo de 0.
Calcular la EMA rápida (12 días), la EMA lenta (26 días) y la EMA de señal (9 días) del MACD.
Calcular el histograma MACD (EMA rápida - EMA lenta) y la línea de señal MACD (EMA de 9 días del histograma MACD).
Calcular las MAs de 50 días y 200 días como tendencias.
El cruce del histograma MACD por encima de 0 es la señal alcista y el cruce por debajo de 0 es la señal bajista.
El cruce rápido de la EMA por encima de la EMA lenta combinado con el cruce corto de la MA por encima de la MA larga da señales alcistas.
El cruce rápido de la EMA por debajo de la EMA lenta combinado con el cruce corto de la MA por debajo de la MA larga da señales bajistas.
Número máximo de operaciones después de cada cruce MA utilizando el parámetro cruzado de operaciones Max después de EMA.
Utilice stop loss y take profit para salir de las operaciones.
Las operaciones con doble MAs determinan la tendencia general para evitar operaciones contrarias a la tendencia.
El MACD identifica los puntos de entrada y salida para capturar los cambios de tendencia.
La combinación proporciona un buen momento para las entradas en la dirección de la tendencia.
Limita el número de operaciones después del cruce para evitar perseguir tendencias.
Detener pérdidas y tomar el riesgo de control de ganancias.
Los parámetros se pueden optimizar para un mejor rendimiento.
La determinación errónea de la tendencia conduce a la pérdida de la tendencia contraria.
Las señales del MACD retrasan la acción del precio, lo que resulta en entradas prematuras o tardías.
Los niveles inadecuados de stop loss y take profit conducen a paradas excesivas o ganancias insuficientes.
La optimización de parámetros es difícil. Se necesitan diferentes combinaciones de parámetros para diferentes productos y plazos. Requiere pruebas iniciales extensas.
Prueba otros indicadores como KD para determinar la tendencia.
Agregue otros indicadores para filtrar las señales MACD, como bandas de Bollinger, paradas ATR.
Optimice el stop loss y tome ganancias para cada producto.
Utilice la optimización aleatoria para encontrar mejores parámetros.
Añadir mecanismos para reducir la frecuencia de las operaciones, como la zona MACD alrededor de 0.
Automatizar la optimización de parámetros y combinaciones en múltiples productos.
Esta estrategia combina las fortalezas de dos MAs para la dirección de la tendencia y MACD para el tiempo de entrada para crear un sistema de seguimiento de tendencia robusto. Las ganancias de rendimiento adicionales son posibles a través de la optimización de parámetros y la combinación de indicadores.
/*backtest start: 2023-10-02 00:00:00 end: 2023-11-01 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="ComiCo - Joel on Crypto - MACD Scalping", shorttitle="ComiCo - Joel on Crypto - MACD Scalping") // Getting inputs slow_length1 = input(title="EMA Trend 1", defval=50) slow_length2 = input(title="EMA Trend 2 ", defval=200) fast_length = input(title="MACD Fast Length", defval=12) slow_length = input(title="MACD Slow Length", defval=26) signal_length = input.int(title="MACD Signal Smoothing", minval = 1, maxval = 50, defval = 9) src = input(title="MACD Source", defval=close) i_switch = input.string(title="Tick Highlight", defval="Moving average" ,options=["Moving average","Fixed value" ]) i_switch2 = input.string(title="Tick Source", defval="Highest bar" ,options=["Highest bar","Average","Last bar"]) signal_lengthup = input.int(title="Upticks Avg. Length", minval = 1, maxval = 5000, defval = 72) signal_lengthdown = input.int(title="Downticks Avg. Length", minval = 1, maxval = 5000, defval = 72) signal_lengthMA = input.float(title="Ticks Avg. Multiplier", minval = 0, maxval = 5000, defval = 2, step = 0.1) sma_source = "EMA" sma_signal = "EMA" // Plot colors col_grow_above = #26A69A col_fall_above =#B2DFDB col_grow_below = #FFCDD2 col_fall_below = #FF5252 // Calculating fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length) slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length) time_macd=timeframe.period=="1"?"1": timeframe.period=="3"?"1": timeframe.period=="5"?"1": timeframe.period=="15"?"3":timeframe.period=="30"?"5":timeframe.period=="60"?"15":timeframe.period=="120"?"30":timeframe.period=="240"?"60":timeframe.period=="D"?"240":timeframe.period=="W"?"D":timeframe.period=="M"?"W":timeframe.period=="12M"?"M":timeframe.period macd = fast_ma - slow_ma macd1=request.security(syminfo.tickerid, time_macd, macd) signal = sma_signal == "SMA" ? ta.sma(macd1, signal_length) : ta.ema(macd1, signal_length) ema50=ta.ema(close,slow_length1) ema200=ta.ema(close ,slow_length2) var TradeCounter = 0 MaxCount = input.int(title = "Max trades after EMA cross", minval = 0, maxval = 1000, defval = 3) bull = ema50>ema200 if bull != bull[1] TradeCounter := 0 hist = request.security(syminfo.tickerid, time_macd, macd1 - signal) f() => [hist[4],hist[3],hist[2],hist[1], hist] ss=request.security(syminfo.tickerid, time_macd, hist, barmerge.gaps_on,barmerge.lookahead_off) [ss5,ss4,ss3,ss2,ss1]=request.security(syminfo.tickerid, time_macd, f(), barmerge.gaps_on,barmerge.lookahead_off) a = array.from(ss5,ss4,ss3,ss2,ss1) s3=i_switch2=="Highest bar"?(ss>0? array.max(a, 0) : array.min(a, 0)):i_switch2=="Average"?array.avg(a):i_switch2=="Last bar"?ss1:0 saa=timeframe.period == '1'? ss:s3 saa2=timeframe.period == '1'? ss:s3*signal_lengthMA colorss=(s3>=0 ? (s3[1] < s3 ? col_grow_above : col_fall_above) : (s3[1] < s3 ? col_grow_below : col_fall_below)) saadown = saa2 saaup = saa2 saadown:=saa>=0? saa2:saadown[1] saaup:=saa<0? saa2:saaup[1] verr=ta.ema(saadown,signal_lengthup) dowww=ta.ema(saaup,signal_lengthdown) ss22=plot(verr, title="Avg. Cloud Upper 1", color=color.new(color.white, 100)) ss33=plot(dowww, title="Avg. Cloud Lower 1", color=color.new(color.white, 100)) fill(ss22, ss33, color.new(color.white, 93), title="Avg. Cloud Background") fixeduptick = input(title="Fixed Uptick Value", defval=30) fixeddowntick = input(title="Fixed Downtick Value", defval=-30) minl = i_switch=="Fixed value"? fixeduptick : verr maxl = i_switch=="Fixed value"? fixeddowntick : dowww plot(minl, title="Avg. Cloud Upper 2", color=color.new(color.white, 81)) plot(maxl, title="Avg. Cloud Lower 2", color=color.new(color.white, 81)) colors2= s3<=minl and s3>=maxl ? #2a2e39 : colorss coro2=s3>0? ema50>ema200 ? #2a2e39 : colors2 : ema50<ema200 ? #2a2e39: colors2 plot(saa, title="Histogram", style=plot.style_columns, color=coro2) LimitDiff = input.float(title="Limit Price Difference", minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005) TP = input.float(title="Take Profit", minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005) SL = input.float(title="Stop Loss", minval = 0, maxval = 0.1, defval = 0.004, step = 0.0005) minEMAdiff = input.float(title = "Min EMA difference", defval = 100, step = 10) if #2a2e39 != coro2 a22 = 0 if ema50<ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff LimitPrice = close * (1 + LimitDiff) strategy.entry("enter short", strategy.short, limit = LimitPrice) strategy.exit("exit short", "enter short", limit = LimitPrice * (1 - TP), stop = LimitPrice * (1 + SL)) TradeCounter := TradeCounter + 1 if ema50>ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff LimitPrice = close * (1 - LimitDiff) strategy.entry("enter long", strategy.long, limit = LimitPrice) strategy.exit("exit long", "enter long", limit = LimitPrice * (1 + TP), stop = LimitPrice * (1 - SL)) TradeCounter := TradeCounter + 1 //alertcondition(#2a2e39 != coro2 , title='MACD Tick Alert', message='Joel on Crypto - MACD Tick Alert')