Bollinger Bands dan Strategi Dagangan Kuantitatif berasaskan VWAP

Penulis:ChaoZhang, Tarikh: 2024-01-04 15:59:46
Tag:

img

Ringkasan

Strategi ini menggabungkan Bollinger Bands (BB) dan Volume Weighted Average Price (VWAP) penunjuk untuk membuat keputusan kemasukan dan keluar.

Logika Strategi

Strategi ini terutamanya berdasarkan peraturan berikut untuk kemasukan dan keluar:

  1. Garis EMA pantas di atas garis EMA perlahan sebagai prasyarat untuk menilai trend

  2. Beli apabila harga tutup di atas VWAP menunjukkan harga menaik

  3. Masukkan panjang jika harga penutupan jatuh di bawah jalur bawah BB dalam 10 bar terakhir yang menunjukkan anomali harga

  4. Jual apabila harga penutupan melebihi jalur atas BB yang menunjukkan pembalikan harga

Secara khusus, ia pertama menilai sama ada EMA 50 hari di atas EMA 200 hari untuk menentukan trend keseluruhan. Kemudian digabungkan dengan VWAP untuk menilai sama ada harga berada dalam trend menaik jangka pendek. Akhirnya menggunakan Bollinger Bands untuk mengesan penurunan anomali jangka pendek sebagai peluang kemasukan.

Peraturan keluar adalah mudah, keluar apabila harga melebihi jalur atas BB yang menunjukkan pembalikan harga.

Analisis Kelebihan

Strategi ini menggabungkan beberapa penunjuk untuk meningkatkan kesahihan isyarat kemasukan. Menggunakan EMA untuk menilai trend keseluruhan mengelakkan perdagangan terhadap trend. VWAP menangkap momentum menaik jangka pendek. BB mengesan anomali jangka pendek sebagai masa untuk kemasukan.

Analisis Risiko

  1. Penilaian trend EMA yang tidak tepat menyebabkan perdagangan menentang trend
  2. VWAP lebih sesuai untuk data sejam atau intraday, kurang cekap dalam data harian
  3. Tetapan parameter BB yang tidak betul, jalur yang terlalu luas atau sempit, isyarat yang hilang

Untuk mengurangkan risiko, parameter EMA dan BB boleh diselaraskan. Uji penunjuk yang berbeza untuk pengesanan trend. Gunakan VWAP dalam jangka masa yang lebih rendah. Optamakan parameter BB untuk lebar jalur terbaik.

Peluang Peningkatan

  1. Uji penunjuk lain untuk pengesanan trend seperti MACD
  2. Mengoptimumkan parameter EMA dan BB
  3. Tambahkan mekanisme stop loss
  4. Tambah penapis untuk mengelakkan isyarat palsu
  5. Ujian semula pada pelbagai produk dan jangka masa

Kesimpulan

Strategi ini menggabungkan BB dan VWAP untuk mengesan anomali harga jangka pendek sebagai masa kemasukan. Menggunakan EMA untuk menentukan trend keseluruhan mengelakkan perdagangan terhadap trend. Ia dapat dengan cepat mengesan momentum jangka pendek. Sesuai untuk perdagangan intraday dan jangka pendek. Lebih meningkatkan kestabilan dan keuntungan dengan mengoptimumkan parameter dan menggabungkan lebih banyak logik.


/*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)



Lebih lanjut