A ideia central desta estratégia é combinar médias móveis duplas e indicador MACD para determinar a direção da tendência após a negociação. Quando o MA rápido cruza acima do MA lento, ele sinaliza uma oportunidade de tendência de alta. Quando o MA rápido cruza abaixo do MA lento, ele sinaliza uma oportunidade de tendência de queda. O histograma MACD é usado para determinar pontos de entrada e saída específicos, indo longo quando cruza acima de 0 e indo curto quando cruza abaixo de 0.
Calcular a EMA rápida (12 dias), a EMA lenta (26 dias) e a EMA de sinal (9 dias) do MACD.
Calcular o histograma MACD (EMA rápida - EMA lenta) e a linha de sinal MACD (EMA de 9 dias do histograma MACD).
Calcular os MAs de 50 dias e de 200 dias como tendências.
O cruzamento do histograma MACD acima de 0 é o sinal de alta e o cruzamento abaixo de 0 é o sinal de baixa.
O cruzamento rápido da EMA acima da EMA lenta combinado com o cruzamento curto da MA acima da MA longa dá sinais de alta.
O cruzamento rápido da EMA abaixo da EMA lenta combinado com o cruzamento curto da MA abaixo da MA longa dá sinais de baixa.
Número máximo de transações após cada cruzamento MA utilizando o parâmetro cruzado EMA.
Use stop loss e take profit para sair das negociações.
Os MAs duplos determinam a tendência geral para evitar operações contrárias à tendência.
O MACD identifica os pontos de entrada e saída para capturar as mudanças de tendência.
A combinação fornece um bom momento para entradas na direção da tendência.
Limita o número de transacções após o cruzamento para evitar a perseguição de tendências.
Parar de perder e assumir o risco de controlar o lucro.
Os parâmetros podem ser otimizados para um melhor desempenho.
Determinação de tendência errada leva a perda de tendência contrária.
Os sinais MACD atrasam a ação do preço, resultando em entradas prematuras ou tardias.
Os níveis inadequados de stop loss e take profit levam a paradas excessivas ou lucros insuficientes.
A otimização de parâmetros é difícil. Diferentes combinações de parâmetros necessárias para diferentes produtos e prazos. Requer testes iniciais extensos.
Teste outros indicadores como KD para determinar a tendência.
Adicione outros indicadores para filtrar os sinais MACD, como Bandas de Bollinger, ATR paradas.
Otimizar o stop loss e tirar lucro para cada produto.
Utilize o walkforward e otimização aleatória para encontrar melhores parâmetros.
Adicionar mecanismos para reduzir a frequência de negociação, como zona MACD em torno de 0.
Automatizar a otimização de parâmetros e combinações em vários produtos.
Esta estratégia combina os pontos fortes de MAs duplos para a direção da tendência e MACD para o tempo de entrada para criar um sistema robusto de tendência seguinte. Ganhos de desempenho adicionais são possíveis através da otimização de parâmetros e combinação 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')