Estratégia de Backtesting do Indicador de Momentum MACD


Data de criação: 2023-09-24 13:21:54 última modificação: 2023-09-24 13:21:54
cópia: 1 Cliques: 796
1
focar em
1617
Seguidores

Visão geral

Esta estratégia combina o MACD Momentum Indicator com o RSI Overbought/Overbought Indicator para verificar se o RSI também completou a correspondente reversão de toque de fundo/toque de topo no momento em que o MACD ocorreu, produzindo assim um sinal de negociação mais confiável.

Princípio da estratégia

  1. Calcule o DIFF, o DEA e o MACD do indicador MACD. Quando o DIFF atravessa o DEA, gera um sinal de garfo de ouro e, quando o DIFF atravessa o garfo de morte.

  2. Calcule o indicador RSI para determinar se o fundo rebotou ou o topo recuou. E configure a janela de retrospectiva para determinar se um fundo ou um topo ocorreu na fase mais recente.

  3. Quando o MACD forca o ouro, se o RSI completar a reversão de ponta dentro da janela de retrospectiva, um sinal de olhar para cima será gerado. Quando o MACD forca o ouro, se o RSI completar a reversão de ponta, um sinal de olhar para baixo será gerado.

  4. O ponto de paragem após a entrada é definido para controlar o risco.

Vantagens estratégicas

  1. O MACD é sensível ao momento de uma reviravolta de tendência. O RSI é sensível ao momento de uma sobrevenda ou sobrevenda.

  2. Ao mesmo tempo, verifica os tokens MACD e RSI e filtra os sinais falsos.

  3. A partir daí, a janela de avaliação aumenta a confiabilidade do sinal.

  4. A configuração de stop loss ajuda na gestão de risco.

Risco estratégico

  1. O MACD e o RSI estão atrasados e podem ter perdido os melhores pontos de entrada.

  2. A menor probabilidade de ocorrência de dois sinais de indicadores ao mesmo tempo, menor sinal.

  3. O blogueiro diz que o governo não tem em conta as tendências globais e é fácil de ser enganado.

  4. A configuração de parada de prejuízos pode ser excessivamente relaxada ou rígida.

Resolução:

  1. Ajustar os parâmetros MACD e RSI para reduzir a probabilidade de atraso.

  2. Ampliar adequadamente o intervalo de eficácia do indicador para fornecer mais sinais.

  3. Aumentar a filtragem de tendências e evitar a entrada de reversão.

  4. Teste diferentes configurações de parâmetros de parada para encontrar o melhor.

Direção de otimização da estratégia

  1. Teste a eficácia de outros equilíbrios, como o SMA.

  2. Aumentar o Stop Loss móvel para tornar o Stop Loss mais flexível.

  3. Adicionar indicadores de tendência para avaliar os avanços e desvantagens.

  4. Introdução ao aprendizado de máquina para a previsão de indicadores.

  5. A escolha do momento da admissão, combinada com outros fatores, foi otimizada.

Resumir

A estratégia usa a combinação de MACD e RSI para entrar em jogo depois de selecionar um sinal de reversão confiável. A estratégia é clara, o ajuste de parâmetros é flexível e pode ser ampliada em termos de seleção de indicadores, julgamento de tendências, parada de perdas, entre outros, para obter mais oportunidades de negociação, mantendo uma base estável.

Código-fonte da estratégia
/*backtest
start: 2023-08-24 00:00:00
end: 2023-09-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//based on Range Strat - MACD/RSI 
// strategy("MACD/RSI - edited", 
//      overlay=true,
//      default_qty_type=strategy.percent_of_equity,
//      default_qty_value=10, precision=2, initial_capital=100000,
//      pyramiding=2,
//      commission_value=0.05)

//Backtest date range
StartDate = input(timestamp("13 Jun 2022"), title="Start Date")
EndDate = input(timestamp("13 Jun 2024"), title="Start Date")
inDateRange = true

// RSI Input Settings
rsisrc = input(title="RSI Source", defval=close, group="RSI Settings")
length = input(title="Length", defval=14, group="RSI Settings" )
overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" )
overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" )
rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings")

// Calculating RSI
vrsi = ta.rsi(rsisrc, length)
co = ta.crossover(vrsi, overSold)
cu = ta.crossunder(vrsi, overBought)

// Function looking for a happened condition during lookback period
f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed


coCheck = f_somethingHappened(co, rsi_lookback)
cuCheck = f_somethingHappened(cu, rsi_lookback)

// MACD Input Settings
macdsrc = input(title="MACD Source", defval=close, group="MACD Settings")
fast_length = input(title="Fast Length", defval=12, group="MACD Settings")
slow_length = input(title="Slow Length", defval=26, group="MACD Settings")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD Settings")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD Settings")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings")


// Calculating MACD
fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
delta = macd - signal

MACDcrossover = ta.crossover(delta, 0)
MACDcrossunder = ta.crossunder(delta, 0)

// Stop Loss Input Settings
longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01
shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01

// Calculating Stop Loss
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



// Strategy Entry
if (not na(vrsi))
	if (inDateRange and MACDcrossover and coCheck)
		strategy.entry("LONG", strategy.long, comment="LONG")
	if (inDateRange and MACDcrossunder and cuCheck)
		strategy.entry("SHORT", strategy.short, comment="SHORT")

// Submit exit orders based on calculated stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="LONG STOP", stop=longStopPrice)
if (strategy.position_size < 0)
    strategy.exit(id="SHORT STOP", stop=shortStopPrice)