Estratégia de negociação MACD com ATR Stop Loss adaptativo

Autora:ChaoZhang, Data: 2023-09-20 15:23:00
Tags:

Resumo

Esta estratégia utiliza o indicador MACD para gerar sinais de negociação e stop loss adaptativos baseados em ATR para controlar riscos.

Estratégia lógica

  1. O cruzamento da linha delta do MACD 0 produz sinais de compra e venda.

  2. O valor da posição em risco deve ser calculado em função do valor da posição em risco.

  3. O stop loss se ajusta de forma adaptativa às alterações da volatilidade, ampliando-se quando a volatilidade aumenta.

  4. Atualizar o stop loss em tempo real quando em posições, para bloquear lucros e controlar riscos.

  5. Posições de saída quando o stop loss for acionado para gerir riscos.

Vantagens

  1. O MACD é sensível ao acompanhamento de tendências.

  2. As paradas adaptáveis se adaptam a diferentes ambientes de mercado, evitando paradas muito apertadas ou soltas.

  3. As linhas de parada visuais refletem intuitivamente o estado de risco.

  4. Regras de estratégia simples e claras, fáceis de compreender e implementar.

  5. Utilizações controladas e gestão eficaz dos riscos.

Riscos

  1. O MACD pode gerar sinais falsos, causando perdas desnecessárias.

  2. Parâmetros ATR inadequados levam a paradas muito apertadas ou soltas.

  3. Risco de paralisação provocada com demasiada frequência.

  4. É difícil parar a tempo quando a tendência se inverte.

  5. Risco de sobreajuste na otimização de parâmetros.

Reforço

  1. Teste os parâmetros MACD para uma combinação ideal.

  2. Tente outros métodos de paragem, como paradas traseiras.

  3. Otimizar as paradas para equilibrar a frequência e o controlo dos riscos.

  4. Adicionar filtro de tendência para evitar paradas de inversão.

  5. Considerar o impacto dos custos de negociação para evitar excesso de negociação.

  6. Usar deslizamento ou paradas reforçadas para garantir paradas desencadeadas.

Conclusão

Esta estratégia negocia sinais MACD com paradas dinâmicas de ATR adaptativas. Ele apresenta riscos e simplicidade controláveis. Mas os sinais MACD podem ser falsos e as paradas precisam de otimização contínua.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MACD BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

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

testPeriod() =>  true

///////////////  MACD  /////////////// 
fastLength = input(13) 
slowlength = input(30) 
MACDLength = input(12) 

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

///////////////  Strategy  /////////////// 
long = crossover(delta, 0)
short = crossunder(delta, 0)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(2, minval=1, title='ATR Stop Period')
atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long", strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
barcolor(long ? color.lime : short ? color.red : na)
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

Mais.