MACD Moving Average Crossover Trend Seguindo uma estratégia com trailing stop loss

Autora:ChaoZhang, Data: 2023-11-06 11:56:14
Tags:

img

Resumo

Esta estratégia usa o MACD para determinar a direção da tendência, combinado com o cruzamento de EMA e SMA como confirmação. O sinal de entrada é quando o histograma do MACD cruza acima da linha do sinal e a tendência é alta. O stop loss é definido no nível de preço abaixo da parada de trail ATR flutuante. A estratégia também sai parcialmente para tirar lucro, sai mais em um aumento maior do preço e mantém alguma posição com parada de trail até que o stop loss seja atingido.

É lógica.

Sinal de entrada

Quando a EMA mais rápida cruza acima da EMA mais lenta, isso indica que a tendência de curto prazo é melhor do que a tendência de longo prazo, sinalizando uma compra. Enquanto isso, uma passagem mais rápida da SMA acima da SMA mais lenta também sugere um impulso de alta mais forte no curto prazo.

Parar de Perder

O ATR é usado para calcular o nível de stop loss. O ATR pode medir efetivamente a faixa de flutuação do preço. Quando o preço cai abaixo dessa faixa, o stop loss é acionado. O período ATR pode ser ajustado - um período menor permite uma parada mais precisa, mas mais fácil de parar, enquanto um período maior dá uma parada mais ampla, mas mais robusta. O nível de stop também segue o preço para cima, alcançando o efeito de tendência.

Sinais de saída

Sair parcialmente de um pequeno aumento de preço para obter lucro. Sair mais em um grande aumento de preço para bloquear o lucro. Mantenha alguma posição com parada de rastreamento até que o stop loss seja atingido. Isso ajuda a bloquear o lucro, enquanto ainda é capaz de manter a posição por algum período.

Vantagens

  • A tendência de avaliação do MACD combinada com o cruzamento EMA/SMA confirma o calendário de entrada
  • O ATR trailing stop permite um stop loss eficaz enquanto se segue a tendência
  • As saídas parciais ajudam a obter lucro, a bloquear o lucro e a manter a duração

Riscos e soluções

  • Risco de sinalização errada do MACD e dos indicadores de tendência.

  • Risco de que o ATR stop loss seja atingido. Pode aumentar o período ATR ou o multiplicador de stop loss.

  • Reduza o tamanho da posição e corta a perda no tempo.

Oportunidades de melhoria

  • Otimizar os parâmetros MACD para melhor julgamento da tendência

  • Otimizar o período ATR para um melhor nível de stop loss

  • Otimizar os rácios de saída e o dimensionamento das posições para reduzir o risco de ficar preso

  • Considere a adição de um índice de volatilidade para melhorar o stop loss

Resumo

A estratégia combina MACD, EMA/SMA e outros indicadores para determinar a tendência e o tempo de entrada com precisão. O ATR flutuante ajuda a bloquear o lucro enquanto segue a tendência. As saídas são escalonadas para tirar lucro, garantir ganho e manter a posição por tempo.


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// 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

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


Mais.