Estratégia de onda de Bollinger

Autora:ChaoZhang, Data: 2024-01-15 15:16:27
Tags:

img

Resumo

A estratégia de onda de Bollinger é uma estratégia quantitativa de negociação que combina Bandas de Bollinger e médias móveis.

Estratégia lógica

A estratégia primeiro calcula uma média móvel exponencial (EMA) durante um período especificado como a linha de base. A faixa superior (EMA + n vezes desvio padrão) e a faixa inferior (EMA - n vezes desvio padrão) são então calculadas com base nesta EMA. Uma quebra acima da faixa superior indica um sinal de sobrecompra, enquanto uma quebra abaixo da faixa inferior indica um sinal de sobrevenda.

Quando os preços estão entre as faixas superior e inferior, é a faixa normal de flutuação de preços do estoque.

Especificamente, as regras do sinal de negociação são:

  1. Signais longos: fechamento > banda superior e RSI ((14) > 60
  2. Sinais curtos: fechamento < Banda inferior e RSI ((14) < 40

Quando os sinais de negociação acima aparecerem, tome posições com quantidade fixa ou percentagem da conta.

Vantagens

A estratégia combina a determinação da tendência e o julgamento da sobrecompra/supervenda para evitar negociações incorretas em mercados de intervalo.

Em comparação com estratégias de média móvel simples, as Bandas de Bollinger refletem melhor a volatilidade atual do mercado e os níveis de risco. Quando a largura da banda é pequena, os sinais de negociação são mais confiáveis. Quando a largura da banda é grande, a frequência de negociação será reduzida automaticamente. Tal ajuste adaptativo pode controlar os riscos estratégicos com base em diferentes condições de mercado.

Além disso, a dupla confirmação do RSI e de outros indicadores ajuda a filtrar alguns sinais falsos e evitar transações incorretas em torno dos pontos de virada da tendência.

Análise de riscos

Os principais riscos desta estratégia são:

  1. Risco de otimização de parâmetros. Se os parâmetros de média móvel ou desvio padrão forem definidos de forma inadequada, isso pode gerar negociações mais barulhentas ou perder oportunidades de negociação. Estes parâmetros precisam de testes e otimização iterativos.

  2. Risco de sinal de ruptura falsa. Quando os preços quebram brevemente acima ou abaixo das faixas e depois revertem rapidamente, pode gerar sinais incorretos. Negociar cegamente com esses aumentaria as perdas. Isso pode ser controlado aumentando o período médio móvel ou definindo stop loss.

  3. Risco de alta frequência de negociação. Se as faixas tiverem lacunas muito estreitas, pode aumentar o número de negociações e as comissões pagas, afetando assim a rentabilidade final. Isto pode ser mitigado aumentando moderadamente o período da média móvel.

Orientações de otimização

A estratégia pode ser ainda melhorada:

  1. Adicionar o mecanismo de stop loss. Usando o trailing stop loss ou time stop loss ajuda a perceber as perdas no tempo e controlar a quantidade de perda de uma única negociação.

  2. Adicionar regras de dimensionamento de posições, por exemplo, piramidizar em negócios vencedores e reduzir perdedores, pode melhorar o retorno da estratégia.

  3. Combinar com outros indicadores para filtragem de sinais. Indicadores como KDJ e MACD podem servir como ferramentas de julgamento auxiliares. Isso ajuda a melhorar ainda mais a lucratividade da estratégia.

  4. Os métodos mais sistemáticos, como algoritmos genéticos, podem ser usados para testar diferentes combinações de parâmetros e encontrar melhores configurações.

Conclusão

A estratégia de onda de Bollinger integra a determinação de tendências de médias móveis e o julgamento de sobrecompra / sobrevenda. Ajusta a frequência de negociação com base em mudanças de largura de banda para se adaptar a diferentes condições de mercado. Enquanto isso, a filtragem de sinal por RSI e outros indicadores evita negociações incorretas. A estratégia considera tanto o rastreamento de tendências de mercado quanto o controle de riscos. Com otimização contínua, pode se tornar uma estratégia de negociação quantitativa lucrativa constante.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@FiboBuLL

strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

src = input(close, title='Source')
length = input.int(55, minval=1, title='EMA length')  // 20 for classis Bollinger Bands SMA line (basis)


mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation')  //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)

Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type')
CC = input(true, 'Color Bars')

upper = basis + dev
lower = basis - dev

//Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc.

short = src < lower  // and rsi(close,14)<40
long = src > upper  // and rsi(close,14)>60

L1 = ta.barssince(long)
S1 = ta.barssince(short)

longSignal = L1 < S1 and not (L1 < S1)[1]
shortSignal = S1 < L1 and not (S1 < L1)[1]

//Plots and Fills


////Long/Short shapes with text
// plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true)
// plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true)  

// plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true)
// plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true)  


p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band')
p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band')

p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis')

fill(p, p1, color=color.new(color.teal, 85), title='Top Fill')  //fill for basis-upper
fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85)  //fill for basis-lower

//Barcolor

bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na

barcolor(CC ? bcol : na, editable=false, title='Color Bars')


// //Alerts ----  // Use 'Once per bar close'

// alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close'
// alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}')  // Use 'Once per bar close'

Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗')

// === INPUT BACKTEST RANGE ===
FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=2018, title='From Year', minval=2015)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(defval=9999, title='To Year', minval=2010)

// === FUNCTION EXAMPLE === 
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() =>
    time >= start and time <= finish ? true : false

if window() and (Show == 'Longs Only' or Show == 'Both')
    strategy.entry('AL', direction=strategy.long, when=longSignal)
    strategy.close('LongAL', when=shortSignal, comment='AL KAPA')

if window() and (Show == 'Shorts Only' or Show == 'Both')
    strategy.entry('SAT', direction=strategy.short, when=shortSignal)
    strategy.close('SAT', when=longSignal, comment='SAT KAPA')














Mais.