Indicador de Momento MACD Estratégia de teste de retorno

Autora:ChaoZhang, Data: 23 de janeiro de 2023
Tags:

Resumo

Esta estratégia combina o indicador de impulso MACD com o indicador de sobrecompra / sobrevenda RSI. Quando o MACD cruza para cima ou para baixo, verifica se o RSI também completa a reversão inferior/superior correspondente durante o período de retrospectiva para gerar sinais de negociação mais confiáveis.

Estratégia lógica

  1. Calcule o MACD DIFF, DEA e histograma. O cruzamento do DIFF acima do DEA dá sinal de cruzamento de alta e o cruzamento abaixo dá sinal de cruzamento de morte.

  2. Calcule o RSI para identificar rebotes de sobrevenda e vendas de sobrecompra.

  3. Quando ocorre um cruzamento de alta do MACD, se o RSI se recuperou de uma sobrevenda dentro da janela de retrocesso, é gerado um sinal longo.

  4. O valor da posição em risco deve ser definido como o valor da posição em risco.

Vantagens

  1. O MACD identifica de forma sensível as mudanças de tendência.

  2. Requerendo ambos os sinais MACD e RSI filtra sinais falsos.

  3. A janela de retrospecção melhora a fiabilidade do sinal.

  4. O stop loss ajuda na gestão de riscos.

Riscos

  1. O atraso do MACD e do RSI pode causar entradas ótimas perdidas.

  2. Menor probabilidade de sinal de indicador duplo significa menos negociações.

  3. Não considerar uma direcção de tendência mais ampla corre o risco de ficar preso.

  4. A regulação da perda de parada pode ser demasiado larga ou demasiado apertada.

Soluções possíveis:

  1. Ajustar os parâmetros MACD e RSI para reduzir o atraso.

  2. Ampliar os intervalos de limiar do indicador para fornecer mais sinais.

  3. Adicionar um filtro de tendência para evitar entradas contra tendência.

  4. Teste diferentes parâmetros de stop loss para níveis ideais.

Orientações de otimização

  1. Teste a SMA e outras médias móveis.

  2. Adicione stop loss para paradas flexíveis.

  3. Incorporar a força da tendência para julgar a qualidade da entrada.

  4. Usar aprendizagem de máquina para prever os movimentos dos indicadores.

  5. Combine mais fatores para otimizar o tempo de entrada.

Resumo

Esta estratégia filtra sinais de reversão confiáveis usando MACD e RSI coordenados. A lógica é clara e os parâmetros flexíveis para melhorias como seleção de indicadores, filtros de tendência, técnicas de stop loss etc. para adquirir mais negócios mantendo a estabilidade, mas os riscos de otimização excessiva precisam ser evitados.


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

Mais.