Estratégia de negociação baseada em bandas de Bollinger e MACD

Autora:ChaoZhang, Data: 2023-12-20 15:55:18
Tags:

img

Resumo

Esta estratégia combina as Bandas de Bollinger e o indicador MACD para identificar oportunidades de sobrevenda e inversões de tendência para negociação quantitativa.

Estratégia lógica

A estratégia primeiro calcula as Bandas de Bollinger de 20 dias, incluindo a faixa média, a faixa superior e a faixa inferior. Quando o preço toca a faixa inferior, considera o mercado sobrevendido. Neste ponto, combine com o indicador MACD para julgar se a tendência está se revertendo. Se o histograma MACD cruzar acima da linha de sinal positivamente, determina o fim desta rodada de declínio, que corresponde ao sinal de compra.

Especificamente, tocar a faixa inferior de Bollinger e a linha de sinal de cruzamento do histograma MACD aciona positivamente o sinal de compra simultaneamente.

Análise das vantagens

A estratégia integra Bandas de Bollinger para julgar a zona de sobrevenda e MACD para determinar sinais de reversão de tendência, realizando um preço de entrada relativamente menor.

As vantagens são, em especial:

  1. Combinação da zona de sobrevenda das bandas de Bollinger e do indicador MACD para alcançar melhores pontos de entrada
  2. Utilização do indicador MACD para determinar pontos de reversão da tendência, reduzindo as probabilidades de falha de ruptura
  3. Adotar métodos de stop loss/take profit para controlar eficazmente os riscos

Análise de riscos

Ainda existem alguns riscos, principalmente nos seguintes aspectos:

  1. Existe a probabilidade de ruptura das bandas de Bollinger, o que pode causar falha no julgamento da zona de sobrevenda
  2. O cruzamento do histograma MACD também pode ser falso, com probabilidade de erro de julgamento.
  3. A definição da posição stop loss pode ser inadequada, demasiado frouxa ou estrita, levando a uma defesa insuficiente ou a uma stop loss prematura

Para proteger-nos dos riscos acima mencionados, podemos tomar as seguintes medidas:

  1. Combinar com outros indicadores para verificar a validade dos sinais de ruptura das bandas de Bollinger
  2. Adicionar indicadores de momento, etc. como filtros para evitar o falso cruzamento do MACD
  3. Otimizar e testar diferentes parâmetros de stop loss

Orientações de otimização

Ainda há espaço para uma maior otimização, nomeadamente:

  1. Otimizar os parâmetros das bandas de Bollinger para encontrar melhores esquemas de julgamento de sobrevenda
  2. Adicionar filtros de indicadores de ímpeto para melhorar a validade do julgamento do MACD
  3. Métodos de teste de perda de parada como ATR para encontrar melhores parâmetros
  4. Adicionar módulo de avaliação de tendências para evitar a negociação contra tendências
  5. Combinar métodos de aprendizagem de máquina para treinar modelos de julgamento e melhorar o desempenho geral da estratégia

Conclusão

A estratégia integra o julgamento da zona de sobrevenda das bandas de Bollinger e o indicador de reversão de tendência do MACD para alcançar pontos de entrada relativamente melhores. Também estabelece métodos de stop loss / take profit para controlar riscos. Esta é uma estratégia de venda alta de baixa compra para referência e otimização. Combinado com mais filtros de indicadores e métodos de aprendizado de máquina, ainda há espaço para melhorar ainda mais seu desempenho.


/*backtest
start: 2023-11-19 00:00:00
end: 2023-12-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji

//@version=4
strategy("[KL] BOLL + MACD Strategy v2 (published)",overlay=true)

// BOLL bands {
BOLL_length = 20
BOLL_src = close
BOLL_mult = 2.0
BOLL_basis = sma(BOLL_src, BOLL_length)
BOLL_dev = BOLL_mult * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_basis + BOLL_dev
BOLL_lower = BOLL_basis - BOLL_dev
BOLL_offset = 0
plot(BOLL_basis, "Basis", color=#872323, offset = BOLL_offset)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = BOLL_offset, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = BOLL_offset, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// MACD signals {
MACD_fastLen = 12
MACD_slowLen = 26
MACD_Len = 9
MACD = ema(close, MACD_fastLen) - ema(close, MACD_slowLen)
aMACD = ema(MACD, MACD_Len)
MACD_delta = MACD - aMACD
// }
backtest_timeframe_start = input(defval = timestamp("01 Nov 2010 13:30 +0000"), title = "Backtest Start Time", type = input.time)
//backtest_timeframe_end = input(defval = timestamp("05 Mar 2021 19:30 +0000"), title = "Backtest End Time", type = input.time)
TARGET_PROFIT_MODE = input(false,title="Exit when Risk:Reward met")
REWARD_RATIO = input(3,title="Risk:[Reward] (i.e. 3) for exit")
// Trailing stop loss {
var entry_price = float(0)
ATR_multi_len = 26
ATR_multi = input(2, "ATR multiplier for stop loss")
ATR_buffer = atr(ATR_multi_len) * ATR_multi
risk_reward_buffer = (atr(ATR_multi_len) * ATR_multi) * REWARD_RATIO
take_profit_long = low > entry_price + risk_reward_buffer
take_profit_short = low < entry_price - risk_reward_buffer
var bar_count = 0 //number of bars since entry 
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
stop_loss_price := max(stop_loss_price, close - trailing_SL_buffer)
// plot TSL line
trail_profit_line_color = color.green
if strategy.position_size == 0
    trail_profit_line_color := color.blue
    stop_loss_price := low
plot(stop_loss_price,color=trail_profit_line_color)
// } 

var touched_lower_bb = false

if true// and time <= backtest_timeframe_end
    if low <= BOLL_lower
        touched_lower_bb := true
    else if strategy.position_size > 0
        touched_lower_bb := false//reset state
    expected_rebound = MACD > MACD[1] and abs(MACD - aMACD) < abs(MACD[1] - aMACD[1])
    buy_condition = touched_lower_bb and MACD > aMACD or expected_rebound

    //ENTRY:
    if strategy.position_size == 0 and buy_condition
        entry_price := close
        trailing_SL_buffer := ATR_buffer
        stop_loss_price := close - ATR_buffer
        strategy.entry("Long",strategy.long, comment="buy")
        bar_count := 0
    else if strategy.position_size > 0
        bar_count := bar_count + 1

    //EXIT: 
    // Case (A) hits trailing stop
    if strategy.position_size > 0 and close <= stop_loss_price
        if close > entry_price
            strategy.close("Long", comment="take profit [trailing]")
            stop_loss_price := 0
        else if close <= entry_price and bar_count
            strategy.close("Long", comment="stop loss")
            stop_loss_price := 0
        bar_count := 0
    // Case (B) take targeted profit relative to risk 
    if strategy.position_size > 0 and TARGET_PROFIT_MODE
        if take_profit_long
            strategy.close("Long", comment="take profits [risk:reward]")
            stop_loss_price := 0
        bar_count := 0

Mais.