Estratégia de negociação de prazo múltiplo com bandas de Bollinger

Autora:ChaoZhang, Data: 2023-09-20 15:47:46
Tags:

Resumo

Esta estratégia usa Bandas de Bollinger adaptativas para projetar dois tipos de estratégias de trailing stop e testá-las sistematicamente em intervalos de tempo.

Estratégia lógica

  1. Calcular as faixas superior e inferior das faixas de Bollinger adaptativas, com largura de canal ajustável.

  2. Estratégia de rastreamento de breakout para abrir posições em breakouts de faixa e parar quando o preço reverte dentro das faixas.

  3. Reversão estratégia de reversão para abrir posições quando o preço atinge faixas e parar quando o preço reverte de volta dentro de faixas.

  4. Utilize o indicador CCI para ajudar a determinar o lado longo/curto.

  5. Testes de retrocesso em vários prazos para verificar a viabilidade de ambas as estratégias.

Vantagens

  1. As Bandas de Bollinger são intuitivas para capturar tendências de preços.

  2. As duas estratégias se adequam a diferentes condições de mercado de robustez.

  3. O CCI ajuda a determinar a direcção longa/curta.

  4. O backtesting em vários prazos torna os resultados mais convincentes.

  5. Regras de estratégia simples e claras, fáceis de aplicar.

Riscos

  1. As Bandas de Bollinger podem falhar em certas situações.

  2. Riscos de interrupção prematura ou tardia em ambas as estratégias.

  3. A CCI pode gerar sinais incorretos.

  4. Manuseie os preconceitos dos backtests com cuidado.

  5. A otimização corre o risco de ser excessivamente adequada.

Reforço

  1. Parâmetros de ensaio para encontrar combinações ideais.

  2. Avaliar a adição de filtros com outros indicadores.

  3. Otimizar as paradas para reduzir os riscos.

  4. Pesquisa de métodos adaptativos para a largura do canal.

  5. Verifique com mais símbolos e prazos.

  6. Usar machine learning para otimizar dinamicamente parâmetros.

Conclusão

Esta estratégia projeta duas estratégias de trailing stop baseadas em Bandas de Bollinger e as testa em vários prazos.


/*backtest
start: 2022-09-13 00:00:00
end: 2023-09-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title = "Underworld Hunter", overlay=true)

len = input(75, minval=1, title="Length")
src = input(close, title="Source")
basis = 0.0
basis := na(basis[1]) ? sma(src, len) : ema(ema(ema(src,len),len),len)

mult = input(1.9, minval=0.001, maxval=50, title="Deviation")
dev = mult * stdev(src, len)
upper = basis + dev
lower = basis - dev

//CCI calculation and inputs

lengthcci = input(20, minval=1, title="Period for CCI")
ma = sma(close, lengthcci)
ccivalue = (src - ma) / (0.015 * dev(src, lengthcci))

//CCI plotting

cciover0 = ccivalue >= 100 and ccivalue <= 120
cciover1 = ccivalue > 120 and ccivalue <= 140
cciover2 = ccivalue > 140 and ccivalue <= 160
cciover3 = ccivalue > 160 and ccivalue <= 180
cciover4 = ccivalue > 180

cciunder0 = ccivalue <= -100 and ccivalue >= -120
cciunder1 = ccivalue <= -120 and ccivalue > -140
cciunder2 = ccivalue <= -140 and ccivalue > -160
cciunder3 = ccivalue <= -160 and ccivalue > -180
cciunder4 = ccivalue <= -180

plotshape(cciover0, title="CCIO0", location=location.abovebar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder0, title="CCIU0", location=location.belowbar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover1, title="CCIO1", location=location.abovebar, color=#ffff00, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder1, title="CCIU1", location=location.belowbar, color=#ffff00, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover2, title="CCIO2", location=location.abovebar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder2, title="CCIU2", location=location.belowbar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover3, title="CCIO3", location=location.abovebar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder3, title="CCIU3", location=location.belowbar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover4, title="CCIO4", location=location.abovebar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder4, title="CCIU4", location=location.belowbar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)

//plotting

plot(upper, title="Upper shadow", color=color.black, transp = 30, linewidth = 4)
plot(upper, title="Upper line", color=#FF2E00, transp = 0, linewidth = 2)
plot(lower, title="Lower shadow", color=color.black, transp = 30, linewidth = 4)
plot(lower, title="Lower line", color=#FF2E00, transp = 0, linewidth = 2)
plot(basis, title="Basic line", color=color.red, transp = 50, linewidth = 2)

mean = input(title="Test Reverse to the Mean instead", type=input.bool, defval=false)
test = input(title="Enable testing", type=input.bool, defval=true)

ordersize=floor(50000/close)

if(close>upper and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Up", strategy.long, ordersize)
if (close<upper and close[1]<upper and close[2]<upper)
    strategy.close("Hunt Up", qty_percent = 100, comment = "Hunt End")

if(close<lower and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Down", strategy.short, ordersize)
if (close>lower and close[1]>lower and close[2]>lower)
    strategy.close("Hunt Down", qty_percent = 100, comment = "Hunt End")

//bounce of bands

if(close>upper and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Down", strategy.short, ordersize)
if (close<upper and close[1]<upper and close[2]<upper and close>high[1])
    strategy.close("Sneak Down", qty_percent = 100, comment = "SneakEnd")

if(close<lower and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Up", strategy.long, ordersize)
if (close>lower and close[1]>lower and close[2]>lower and close<low[1])
    strategy.close("Sneak Up", qty_percent = 100, comment = "Sneak End")




Mais.