Bollinger Bands e estratégia quantitativa de negociação baseada no VWAP

Autora:ChaoZhang, Data: 2024-01-04 15:59:46
Tags:

img

Resumo

Esta estratégia combina os indicadores Bollinger Bands (BB) e Volume Weighted Average Price (VWAP) para tomar decisões de entrada e saída.

Estratégia lógica

A estratégia baseia-se principalmente nas seguintes regras de entrada e saída:

  1. Linha EMA rápida acima da linha EMA lenta como pré-requisito para julgar a tendência

  2. Comprar quando o preço de fechamento estiver acima do VWAP indicando preço ascendente

  3. Insira longo se o preço de fechamento tiver caído abaixo da faixa inferior BB nas últimas 10 barras, indicando anomalia de preço

  4. Vender quando o preço de fechamento ultrapassar a faixa superior BB indicando a inversão do preço

Especificamente, primeiro julga se a EMA de 50 dias está acima da EMA de 200 dias para determinar a tendência geral. Em seguida, combinado com o VWAP para julgar se o preço está em uma tendência de alta de curto prazo. Finalmente, usando Bandas de Bollinger para detectar queda de anomalia de curto prazo como oportunidade de entrada.

A regra de saída é simples, saída quando o preço ultrapassa a faixa superior BB indicando a reversão do preço.

Análise das vantagens

A estratégia combina vários indicadores para aumentar a validade dos sinais de entrada. Usando EMAs para julgar a tendência geral evita a negociação contra a tendência.

Análise de riscos

  1. Julgamento inexacto da tendência da EMA que provoca negociações contra tendência
  2. VWAP mais adequado para dados horários ou intradiários, menos eficiente em dados diários
  3. Configuração incorreta do parâmetro BB, bandas demasiado largas ou estreitas sem sinais

Para mitigar os riscos, os parâmetros da EMA e BB podem ser ajustados. Teste diferentes indicadores para detecção de tendência. Use VWAP em menor prazo. Otimize o parâmetro BB para melhor largura de banda.

Oportunidades de melhoria

  1. Teste outros indicadores para detecção de tendências como o MACD
  2. Otimizar os parâmetros EMA e BB
  3. Adicionar mecanismo de stop loss
  4. Adicionar filtros para evitar sinais falsos
  5. Testes de retrospectiva em vários produtos e prazos

Conclusão

A estratégia combina BB e VWAP para detectar anomalias de preços de curto prazo como tempo de entrada. Usando EMAs para determinar a tendência geral evita a negociação contra a tendência. Pode detectar rapidamente o impulso de curto prazo. Adequado para negociação intradiária e de curto prazo. Melhora ainda mais a estabilidade e a lucratividade, otimizando parâmetros e incorporando mais lógica.


/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 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/
// © mohanee

//@version=4
strategy(title="VWAP and BB strategy [EEMANI]", overlay=true,pyramiding=2, default_qty_value=3, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)
//This strategy combines VWAP and BB indicators
//BUY RULE
//1. EMA50 > EMA 200
//2. if current close > vwap session  value 
//3. check if  price dipped BB lower band for any of last 10 candles
//EXIT RULE
//1. price closes above BB upper band   
//STOP LOSS EXIT
//1. As configured --- default is set to 5%

is_price_dipped_bb(pds,source1) =>
    t_bbDipped=false
    for i=1 to pds
        t_bbDipped:=  (t_bbDipped   or  close[i]<source1) ? true : false
        if t_bbDipped==true
            break
        else
            continue
            
    t_bbDipped
    
// variables  BEGIN
shortEMA = input(50, title="fast EMA", minval=1)
longEMA = input(200, title="slow EMA", minval=1)

//BB

smaLength = input(20, title="BB SMA Length", minval=1)
bbsrc = input(close, title="BB Source")



//addOnDivergence = input(true,title="Add to existing on Divergence")
//exitOption = input(title="exit on RSI or BB", type=input.string, options=["RSI", "BB"],      defval="BB")

//bbSource = input(title="BB  source", type=input.string, options=["close", "vwap"],      defval="close")
     
//vwap_res = input(title="VWAP Resolution", type=input.resolution, defval="session")
stopLoss = input(title="Stop Loss%", defval=5, minval=1)

//variables  END




longEMAval= ema(close, longEMA)
shortEMAval= ema(close, shortEMA)


vwapVal=vwap(close)



// Drawings

//plot emas
plot(longEMAval, color = color.orange, linewidth = 1, transp=0)
plot(shortEMAval, color = color.green, linewidth = 1, transp=0)


//bollinger calculation 
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(bbsrc, smaLength)
dev = mult * stdev(bbsrc, smaLength)
upperBand = basis + dev
lowerBand = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
//bollinger calculation 

//plot bb
//plot(basis, "Basis", color=#872323, 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=#198787, transp=95)


plot(vwapVal, color = color.purple, linewidth = 1, transp=0)


// Colour background

barcolor(shortEMAval>longEMAval and close<=lowerBand ? color.yellow: na)
  

//longCondition=  shortEMAval > longEMAval and  close>open and  close>vwapVal
longCondition= shortEMAval >= longEMAval  and  close>=vwapVal and close>open  //      close>vwapVal   and   



//Entry
strategy.entry(id="VWAP_BB LE", comment="VB LE" , long=true,  when= longCondition and  is_price_dipped_bb(10,lowerBand) )  //and strategy.position_size<1 

//add to the existing position
//strategy.entry(id="VWAP_RSI LE", comment="VR LE Add" , long=true,  when= addOnDivergence==true and strategy.position_size>=1 and close<strategy.position_avg_price   and (close<lowerBand or  low<lowerBand) and rsiVal>rsi_buy_line)

barcolor(strategy.position_size>=1  ? color.blue: na)



strategy.close(id="VWAP_BB LE", comment="TP Exit VB LE",   when=crossover(close,upperBand) )

//stoploss
stopLossVal =   strategy.position_avg_price * (1-(stopLoss*0.01) )
strategy.close(id="VB LE", comment="SL Exit",   when= close < stopLossVal)



Mais.