Estratégia de inversão de tendência das bandas de Bollinger

Autora:ChaoZhang, Data: 2023-11-01 11:29:34
Tags:

img

Resumo

Esta estratégia utiliza Bollinger Bands e Moving Average para ir LONG ou SHORT quando o preço se aproxima das bandas superiores ou inferiores.

É lógica.

A estratégia identifica dois sinais de entrada:

  1. sinal longo: quando o preço de fechamento atinge a faixa inferior enquanto está acima da linha EMA, a vela anterior foi de baixa e a vela atual é de alta.

  2. Sinais curtos: quando o preço de fechamento atinge a faixa superior enquanto está abaixo da linha EMA, a vela anterior foi de alta e a vela atual é de baixa.

O nível de stop loss é definido no preço de entrada mais/menos relação risco/recompensa vezes a distância entre o preço de entrada e o nível de take profit.

O take profit usa o take profit dinâmico. O take profit longo é definido na faixa inferior. O take profit curto é definido na faixa superior.

Vantagens

  1. Combina os pontos fortes das estratégias de tendência e de reversão média, apresenta um bom desempenho durante os mercados de intervalo.

  2. Utiliza Bandas de Bollinger para identificar níveis de sobrecompra e sobrevenda, melhorando a precisão dos sinais de reversão.

  3. O stop loss fixo facilita a gestão do risco.

  4. A tomada dinâmica de lucro permite a maximização dos lucros.

Riscos

  1. As estratégias de fuga são suscetíveis a parar corridas.

  2. O stop loss freqüente é acionado quando o mercado está muito agitado.

  3. O stop loss fixo não se adapta à volatilidade do mercado, pode ser demasiado largo ou demasiado apertado.

  4. A má regulação dos parâmetros das Bandas de Bollinger pode conduzir a resultados medíocres.

Reforço

  1. Incorpore um indicador de RSI para filtrar os sinais de entrada. Por exemplo, só vá longo se o RSI estiver acima de 50 e só vá curto se o RSI estiver abaixo de 50.

  2. Implementar stop loss adaptativo que ajuste a distância de parada com base na volatilidade.

  3. Otimizar os parâmetros das bandas de Bollinger para encontrar as melhores combinações de parâmetros.

  4. Teste diferentes períodos de EMA para reforçar o efeito suporte/resistência da EMA.

Resumo

A estratégia combina tendência e reversão, entrando em níveis de sobrecompra / sobrevenda identificados pelas Bandas de Bollinger. Maximiza os lucros através de lucro dinâmico. Tem bom desempenho durante os mercados de faixa. Cuidado com as corridas de parada. Parâmetros de ajuste fino para otimizar o desempenho.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-31 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Welcome to yet another script. This script was a lot easier since I was stuck for so long on the Donchian Channels one and learned so much from that one that I could use in this one
// This code should be a lot cleaner compared to the Donchian Channels, but we'll leave that up to the pro's
// This strategy has two entry signals, long = when price hits lower band, while above EMA, previous candle was bearish and current candle is bullish
// Short = when price hits upper band, while below EMA, previous candle was bullish and current candle is bearish
// Take profits are the opposite side's band(lower band for long signals, upper band for short signals). This means our take profit price will change per bar
// Our stop loss doesn't change, it's the difference between entry price and the take profit target divided by the input risk reward
// At the time of writing this, I could probably calculate that much easier by simply multiplying the opposite band by the input risk reward ratio
// Since I want to get this script out and working on the next one, I won't clean that up, I'm sorry
// strategy(shorttitle="BB Trending Reverse Strategy", title="Bollinger Bands Trending Reverse Strategy", overlay=true, default_qty_type = strategy.cash, default_qty_value = 150, initial_capital = 1000, currency = currency.USD, commission_type = "percent", commission_value = 0.036)

// The built-in Bollinger Band indicator inputs and variables, added some inputs of my own and organised the code
length              = input(20, minval=1)
src                 = input(close, title="Source")
mult                = input(2.0, minval=0.001, maxval=50, title="StdDev")
emaInput            = input(title = "EMA Input", type = input.integer, defval = 200, minval = 10, maxval = 400, step = 1)
riskreward          = input(title = "Risk/Reward Ratio", type = input.float, defval = 1.50, minval = 0.01, maxval = 100, step = 0.01)
offset              = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
basis               = sma(src, length)
dev                 = mult * stdev(src, length)
upper               = basis + dev
lower               = basis - dev
ema                 = ema(close, emaInput)

// These are our conditions as explained above
entryLong           = low[1] <= lower[1] and low <= lower and low > ema
entryShort          = high[1] >= upper[1] and high >= upper and high < ema
reversecandleLong   = close > open and close[1] < open[1]
reversecandleShort  = close < open and close[1] > open[1]
var stopLong        = 0.0
var stopShort       = 0.0

// These are our entry signals, notice how the stop condition is within the if statement while the strategy.exit is outside of the if statement, this way the take profit targets trails up or down depending on what the price does
if reversecandleLong and entryLong and strategy.position_size == 0
    stopLong := (((close / upper - 1) * riskreward + 1) * close)
    strategy.entry("Long Entry", strategy.long, comment = "Long Entry")
    
strategy.exit("Exit Long", "Long Entry", limit = upper, stop = stopLong, comment = "Exit Long")

if reversecandleShort and entryShort and strategy.position_size == 0
    stopShort := (((close / lower - 1) / riskreward + 1) * close)
    strategy.entry("Short Entry", strategy.short, comment = "Short Entry")

strategy.exit("Exit Short", "Short Entry", limit = lower, stop = stopShort, comment = "Exit Short")


// The built-in Bollinger Band plots
plot(basis, "Basis", color=#872323, offset = offset)
p1 = plot(upper, "Upper", color=color.teal, offset = offset)
p2 = plot(lower, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=#198787, transp=95)
plot(ema, color=color.red)

// These plots are to check the stoplosses, they can  make a mess of your chart so only use these if you want to make sure these work
// plot(stopLong)
// plot(stopShort)

Mais.