Estratégia de ruptura da banda de Bollinger baseada no VWAP

Autora:ChaoZhang, Data: 2024-02-06 14:36:26
Tags:

img

Resumo

Esta estratégia usa Bandas de Bollinger para rastrear o VWAP. Adota uma posição longa quando o VWAP quebra acima da banda média e fecha a posição quando o VWAP quebra abaixo da banda inferior.

Estratégia lógica

  1. Calcule o VWAP.
  2. Calcular as bandas de Bollinger do VWAP, incluindo as bandas superior, média e inferior.
  3. Tomar posição longa quando o VWAP ultrapassar a faixa média e o preço estiver acima do Pivot Point.
  4. Defina o stop loss em 5%.
  5. Se o VWAP quebrar abaixo da faixa inferior, feche a posição longa.

Análise das vantagens

  1. O VWAP tem uma forte capacidade de rastreamento de tendências.
  2. A adição de Pivot Point filtra falhas, evitando perdas desnecessárias.
  3. Bloques de saída parciais em alguns lucros e controlos de risco.
  4. Os backtests mostram um excelente desempenho no mercado de alta com boa estabilidade.

Análise de riscos

  1. Prensas a perdas por falsas rupturas no mercado de gama.
  2. Os Pivot Points não podem evitar completamente os falsos sinais.
  3. O aumento da frequência do comércio leva a custos de transacção mais elevados.
  4. Não tem bom desempenho no mercado de baixa, é necessário um bom controlo de riscos.

Orientações de otimização

  1. Adicione indicadores como MACD, KDJ para filtrar sinais.
  2. Otimizar os parâmetros do BB através de backtests.
  3. Usar aprendizagem de máquina para otimizar dinamicamente parâmetros BB.
  4. Teste diferentes níveis de stop loss para encontrar o ideal.
  5. Adicionar lucro adaptativo baseado na volatilidade do mercado.

Conclusão

Um sistema de breakout estável adequado para negociação por algoritmos. É necessária atenção ao controle de risco. Com mais pesquisa e otimização, pode se tornar uma excelente estratégia de breakout.


/*backtest
start: 2024-01-06 00:00:00
end: 2024-02-05 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/
// © ediks123

//@version=4
strategy("BBofVWAP with entry at Pivot Point", overlay=false, pyramiding=1,   default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000, currency=currency.USD)  //default_qty_value=10, default_qty_type=strategy.fixed,

// Function outputs 1 when it's the first bar of the D/W/M/Y
is_newbar(res) =>
    ch = 0
    if(res == 'Y')
        t  = year(time('D'))
        ch := change(t) != 0 ? 1 : 0
    else
        t = time(res)
        ch := change(t) != 0 ? 1 : 0
    ch


//variables BEGIN
//smaLength=input(200,title="Slow MA Length")

bbLength=input(50,title="BB Length")  
//bbsrc = input(close, title="BB Source")
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)

pp_period = input(title = "Pivot Period", type=input.string, defval="Week", options = ['Day', 'Week'])

pp_res = pp_period == 'Day' ? 'D' : pp_period == 'Week' ? 'W' : pp_period == 'Month' ? 'M' : 'Y' 

riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(5,title="Stop Loss",minval=1)



//sma200=sma(close,smaLength)
//plot(sma200, title="SMA 200", color=color.orange)

myVwap=vwap(hlc3)

//bollinger calculation
basis = sma(myVwap, bbLength)
dev = mult * stdev(myVwap, bbLength)
upperBand = basis + dev
lowerBand = basis - dev

//plot bb
plot(basis, "Basis", color=color.teal, style=plot.style_circles , offset = offset)
p1 = plot(upperBand, "Upper", color=color.teal, offset = offset)
p2 = plot(lowerBand, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=color.teal, transp=95)

plot(myVwap, title="VWAP", color=color.purple)


//pivot points 


// Calc High
high_cur = 0.0
high_cur := is_newbar(pp_res) ? high : max(high_cur[1], high)

phigh = 0.0
phigh := is_newbar(pp_res) ? high_cur[1] : phigh[1]

// Calc Low
low_cur = 0.0
low_cur := is_newbar(pp_res) ? low : min(low_cur[1], low)

plow = 0.0
plow := is_newbar(pp_res) ? low_cur[1] : plow[1]

// Calc Close
pclose = 0.0
pclose := is_newbar(pp_res) ? close[1] : pclose[1]


vPP = (phigh + plow + pclose) / 3

//pivot points


//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1


strategy.entry(id="BB_VWAP_PP",long=true, qty=qty1, when=   crossover(myVwap,basis)  and close>=vPP  )

bgcolor(strategy.position_size>=1?color.blue:na, transp=75)
barcolor(strategy.position_size>=1?color.green:na)

stopLossVal=  strategy.position_size>=1 ?  close * (1 - (stopLoss*0.01) ) : 0.00

//partial exit
//strategy.close(id="BBofVwap", qty=strategy.position_size/3, when=crossunder(myVwap,upperBand) and strategy.position_size>=1 )  //and close>strategy.position_avg_price)



//exit on lowerband or stoploss 
strategy.close(id="BB_VWAP_PP", comment="P" , qty=strategy.position_size/3, when= crossunder(myVwap,upperBand) and strategy.position_size>=1 and close>strategy.position_avg_price)  //
strategy.close(id="BB_VWAP_PP", comment="Exit All", when=crossunder(myVwap,lowerBand) and strategy.position_size>=1 )
//strategy.close(id="BBofVwapWithFibPivot", comment="Exit All", when=crossunder(close,vPP) and strategy.position_size>=1 )

strategy.close(id="BB_VWAP_PP", comment="Stop Loss Exit", when=crossunder(close,stopLossVal) and strategy.position_size>=1 )

Mais.