Joanne sobre Crypto - Media móvil doble con estrategia de scalping MACD

El autor:¿ Qué pasa?, Fecha: 2023-11-02 16:09:08
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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

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

  3. Calcular las MAs de 50 días y 200 días como tendencias.

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

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

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

  7. Número máximo de operaciones después de cada cruce MA utilizando el parámetro cruzado de operaciones Max después de EMA.

  8. Utilice stop loss y take profit para salir de las operaciones.

Ventajas

  1. Las operaciones con doble MAs determinan la tendencia general para evitar operaciones contrarias a la tendencia.

  2. El MACD identifica los puntos de entrada y salida para capturar los cambios de tendencia.

  3. La combinación proporciona un buen momento para las entradas en la dirección de la tendencia.

  4. Limita el número de operaciones después del cruce para evitar perseguir tendencias.

  5. Detener pérdidas y tomar el riesgo de control de ganancias.

  6. Los parámetros se pueden optimizar para un mejor rendimiento.

Los riesgos

  1. La determinación errónea de la tendencia conduce a la pérdida de la tendencia contraria.

  2. Las señales del MACD retrasan la acción del precio, lo que resulta en entradas prematuras o tardías.

  3. Los niveles inadecuados de stop loss y take profit conducen a paradas excesivas o ganancias insuficientes.

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

Oportunidades de mejora

  1. Prueba otros indicadores como KD para determinar la tendencia.

  2. Agregue otros indicadores para filtrar las señales MACD, como bandas de Bollinger, paradas ATR.

  3. Optimice el stop loss y tome ganancias para cada producto.

  4. Utilice la optimización aleatoria para encontrar mejores parámetros.

  5. Añadir mecanismos para reducir la frecuencia de las operaciones, como la zona MACD alrededor de 0.

  6. Automatizar la optimización de parámetros y combinaciones en múltiples productos.

Resumen de las actividades

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



Más.