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.
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.
O indicador MACD pode identificar de forma eficaz as tendências e é um dos indicadores técnicos clássicos.
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.
O efeito de filtragem das médias móveis ajuda a filtrar alguns sinais falsos.
A estratégia incorpora um mecanismo de stop loss para controlar os riscos.
O MACD é propenso a gerar sinais falsos com espaço de otimização limitado.
A colocação incorreta de stop loss pode ser muito ativa ou conservadora, exigindo otimização individual entre produtos.
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.
A justificação para os prazos de backtest precisa ser validada para evitar o sobreajuste.
Otimizar as combinações de médias móveis rápidas e lentas para encontrar os melhores parâmetros para diferentes produtos.
Adicione outros indicadores como velas, Bandas de Bollinger, RSI para filtrar sinais.
Avaliação dos diferentes níveis de stop loss com base no drawdown, na taxa Sharpe.
Explorar técnicas de stop loss como trailing stop loss, ordens limitadas.
Teste o dimensionamento dinâmico das posições com base no capital próprio e na volatilidade.
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)