Estratégia de equilíbrio da tendência do MACD

Autora:ChaoZhang, Data: 2023-10-17 16:15:53
Tags:

img

Resumo

Esta é uma estratégia de seguimento de tendência que identifica direções de alta e baixa usando o indicador MACD. Ela gera a linha principal do MACD calculando a diferença entre as médias rápidas e lentas.

Estratégia lógica

O código define primeiro o prazo de backtesting para testar o desempenho histórico da estratégia.

O indicador MACD é então calculado, incluindo as configurações de comprimento para a média móvel rápida, média móvel lenta e média móvel MACD. A linha rápida reage de forma mais sensível e a linha lenta reage de forma mais constante. Sua diferença forma a linha principal MACD, que é então suavizada por uma média móvel para formar a linha de sinal MACD. Quando a diferença cruza acima da linha zero, um sinal de alta é gerado. Quando cruza abaixo, um sinal de baixa é gerado.

Quando as linhas rápidas e lentas se cruzarem, confirmar e registrar os sinais de compra/venda, então uma posição pode ser aberta.

Depois de entrar em uma posição, acompanhe continuamente o preço mais alto e o mais baixo da posição.

Vantagens

  1. O indicador MACD pode identificar de forma eficaz as tendências e é um dos indicadores técnicos clássicos.

  2. A diferença entre as médias móveis rápidas e lentas pode capturar precocemente o ímpeto do preço e as mudanças de direção.

  3. O efeito de filtragem das médias móveis ajuda a filtrar alguns sinais falsos.

  4. A estratégia incorpora um mecanismo de stop loss para controlar os riscos.

Riscos

  1. O MACD é propenso a gerar sinais falsos com espaço de otimização limitado.

  2. A colocação incorreta de stop loss pode ser muito ativa ou conservadora, exigindo otimização individual entre produtos.

  3. O dimensionamento das posições fixas pode facilmente conduzir a uma alavancagem excessiva, considerando o dimensionamento das posições com base no tamanho da conta.

  4. A justificação para os prazos de backtest precisa ser validada para evitar o sobreajuste.

Optimização

  1. Otimizar as combinações de médias móveis rápidas e lentas para encontrar os melhores parâmetros para diferentes produtos.

  2. Adicione outros indicadores como velas, Bandas de Bollinger, RSI para filtrar sinais.

  3. Avaliação dos diferentes níveis de stop loss com base no drawdown, na taxa Sharpe.

  4. Explorar técnicas de stop loss como trailing stop loss, ordens limitadas.

  5. Teste o dimensionamento dinâmico das posições com base no capital próprio e na volatilidade.

Conclusão

A estratégia de equilíbrio de tendência do MACD é baseada no indicador MACD clássico. Ele tem a capacidade de capturar sensivelmente o impulso do preço e pode ser bem adaptado a diferentes produtos através da otimização de parâmetros.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
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)

/////////////// Component Code Start ///////////////
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)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

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

long = crossover(delta, 0) 
short = crossunder(delta, 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 = 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 = 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 = 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])

sl_inp = input(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)

Mais.