A Estratégia de Bandas de Bollinger é uma estratégia clássica que utiliza Bandas de Bollinger para rastreamento de tendências e sinais de sobrecompra / sobrevenda.
A estratégia julga as condições de sobrecompra/supervenda através de cruzamento dourado/mortos das Bandas de Bollinger superiores/inferiores para estabelecer posições. A área entre as bandas reflete a faixa de volatilidade atual do mercado. As bandas consistem em bandas médias, superiores e inferiores, onde a faixa média é a média móvel simples de N dias e as bandas superiores/inferiores são a faixa média +/- K desvios padrão.
As bandas de Bollinger refletem a volatilidade do mercado e a faixa de oscilação. Tocar a faixa inferior significa status quo de sobrevenda - as lacunas têm maior probabilidade de serem preenchidas. Assim, as posições longas devem ser consideradas com base no princípio de reversão média. Da mesma forma, tocar a faixa superior representa condições potenciais de sobrecompra e prováveis reversões de preços, por isso as posições curtas podem ser estabelecidas para lucrar com os movimentos descendentes.
Esta estratégia combina os sinais de sobrecompra/supervenda das Bandas de Bollinger para entradas de rastreamento de tendências.
Quando o preço cruza acima da faixa inferior, o mercado sai da área de sobrevenda em uma faixa razoável. As posições longas podem ser abertas. Quando o preço cruza abaixo da faixa superior, o mercado se torna sobrecomprado.
Após as ordens serem preenchidas, os níveis de stop loss porcentual fixos são definidos para gerenciar os riscos.
Identificar os níveis de sobrecompra/supervenda com Bandas de Bollinger para configurações de baixa compra-alta venda, julgando por cruzamento de bandas.
Capturar tendências através da propriedade de volatilidade das Bandas de Bollinger.
O mecanismo de stop loss limita efetivamente a perda máxima por negociação.
Combinar rastreamento de tendências e stop loss leva a ganhos constantes.
As definições dos parâmetros afetam a qualidade do sinal. O comprimento da banda média N e o multiplicador de desvio padrão K devem ser definidos racionalmente para diferentes mercados, ou a precisão sofrerá.
Percentagem excessiva ou subdimensionada de stop loss prejudica a estabilidade do retorno. Percentagem excessivamente grande arrisca perdas mais pesadas por comércio, enquanto risco de porcentagem subdimensionada desencadeia stop loss prematuro. Percentagem razoável deve ser definida com base em diferentes produtos.
Os filtros adicionais com outros indicadores podem melhorar a precisão do sinal.
Podem ser testadas diferentes configurações de períodos de detenção, como a combinação de bandas horárias ou de períodos mais curtos para melhorias na eficiência da negociação de maior frequência e da utilização do capital.
Esta estratégia utiliza Bandas de Bollinger para sinais de sobrecompra/supervenda e incorpora stop loss para controle de risco.
/*backtest start: 2023-11-15 00:00:00 end: 2023-11-22 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="Bollinger Bands Strategy", overlay=false, shorttitle="BBS", pyramiding=0, currency=currency.USD, commission_type=strategy.commission.percent, commission_value=0.03, initial_capital=1000) source = input(close, "Source") length = input.int(20, minval=1) mult = input.float(2.0, minval=0.001, maxval=50, step=0.001) stopLossFactor = input.float(1, "Stop Loss Percent", maxval = 100, minval = 0, step=0.1) basis = ta.sma(source, length) dev = mult * ta.stdev(source, length) upper = basis + dev lower = basis - dev var float lastTradePrice = na var float stopLossLow = na var float stopLossHigh = na var bool currentIsLong = na var bool nextExpectedIsLong = true var bool existedLong = false var bool existedShort = false buyEntry = ta.crossover(source, lower) sellEntry = ta.crossunder(source, upper) if (buyEntry and nextExpectedIsLong == true) strategy.entry("BBandLE", strategy.long, comment="BBandLE") nextExpectedIsLong := false if(nz(strategy.position_size[1], 0) < 0) // new position detected lastTradePrice := close stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100)) stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100)) else strategy.cancel("BBandLE") if (sellEntry and nextExpectedIsLong == false) strategy.entry("BBandSE", strategy.short, comment="BBandSE") nextExpectedIsLong := true if(nz(strategy.position_size[1], 0) > 0) // new position detected lastTradePrice := close stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100)) stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100)) else strategy.cancel("BBandSE") strategy.close("BBandLE", close < stopLossLow) strategy.close("BBandSE", close > stopLossHigh) // if(nz(strategy.position_size[1], 0) < 0 and close > stopLossHigh) // strategy.entry("BBandLE", strategy.long, comment="BBandLE") // lastTradePrice := close // stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100)) // stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100)) // if(nz(strategy.position_size[1], 0) > 0 and close < stopLossLow) // strategy.exit("BBandSE", strategy.short, comment="BBandSE") // lastTradePrice := close // stopLossLow := lastTradePrice * (1 - (stopLossFactor / 100)) // stopLossHigh := lastTradePrice * (1 + (stopLossFactor / 100)) plot(source, "close", color.blue) plot(lower, "lower", color.red) plot(upper, "upper", color.red) plot(stopLossLow, "StopLossLow", color.black) plot(stopLossHigh, "StopLossHigh", color.black) plot(lastTradePrice, "lastTradePrice", color.green) plotchar(strategy.position_size > 0, char="-", size=size.tiny, location=location.bottom, color=color.green) plotchar(strategy.position_size < 0, char="-", size=size.tiny, location=location.bottom, color=color.red)