Joanne on Crypto - Média Movel Dupla com Estratégia de Scalping MACD

Autora:ChaoZhang, Data: 2023-11-02 16:09:08
Tags:

img

Resumo

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.

Estratégia lógica

  1. Calcular a EMA rápida (12 dias), a EMA lenta (26 dias) e a EMA de sinal (9 dias) do MACD.

  2. Calcular o histograma MACD (EMA rápida - EMA lenta) e a linha de sinal MACD (EMA de 9 dias do histograma MACD).

  3. Calcular os MAs de 50 dias e de 200 dias como tendências.

  4. O cruzamento do histograma MACD acima de 0 é o sinal de alta e o cruzamento abaixo de 0 é o sinal de baixa.

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

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

  7. Número máximo de transações após cada cruzamento MA utilizando o parâmetro cruzado EMA.

  8. Use stop loss e take profit para sair das negociações.

Vantagens

  1. Os MAs duplos determinam a tendência geral para evitar operações contrárias à tendência.

  2. O MACD identifica os pontos de entrada e saída para capturar as mudanças de tendência.

  3. A combinação fornece um bom momento para entradas na direção da tendência.

  4. Limita o número de transacções após o cruzamento para evitar a perseguição de tendências.

  5. Parar de perder e assumir o risco de controlar o lucro.

  6. Os parâmetros podem ser otimizados para um melhor desempenho.

Riscos

  1. Determinação de tendência errada leva a perda de tendência contrária.

  2. Os sinais MACD atrasam a ação do preço, resultando em entradas prematuras ou tardias.

  3. Os níveis inadequados de stop loss e take profit levam a paradas excessivas ou lucros insuficientes.

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

Oportunidades de melhoria

  1. Teste outros indicadores como KD para determinar a tendência.

  2. Adicione outros indicadores para filtrar os sinais MACD, como Bandas de Bollinger, ATR paradas.

  3. Otimizar o stop loss e tirar lucro para cada produto.

  4. Utilize o walkforward e otimização aleatória para encontrar melhores parâmetros.

  5. Adicionar mecanismos para reduzir a frequência de negociação, como zona MACD em torno de 0.

  6. Automatizar a otimização de parâmetros e combinações em vários produtos.

Resumo

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



Mais.