Strategi Dagangan Berbilang Jangka Masa dengan Bollinger Bands

Penulis:ChaoZhang, Tarikh: 2023-09-20 15:47:46
Tag:

Ringkasan

Strategi ini menggunakan Bollinger Bands adaptif untuk merancang dua jenis strategi hentian dan menguji mereka secara sistematik merentasi jangka masa.

Logika Strategi

  1. Mengira jalur atas dan bawah Bollinger Band adaptif, dengan lebar saluran yang boleh diselaraskan.

  2. Strategi pengesanan pecah untuk membuka kedudukan pada pecah band dan berhenti apabila harga kembali dalam band.

  3. Strategi pembalikan untuk membuka kedudukan apabila harga mencapai jalur dan berhenti apabila harga kembali ke dalam jalur.

  4. Gunakan penunjuk CCI untuk membantu menentukan sisi panjang/pendek.

  5. Ujian semula dalam pelbagai jangka masa untuk mengesahkan daya maju kedua-dua strategi.

Kelebihan

  1. Bollinger Bands intuitif dalam menangkap trend harga.

  2. Kedua-dua strategi ini sesuai dengan keadaan pasaran yang berbeza untuk ketahanan.

  3. CCI membantu menentukan arah panjang/pendek.

  4. Pengujian belakang pelbagai jangka masa menjadikan keputusan lebih meyakinkan.

  5. Peraturan strategi yang mudah dan mudah dilaksanakan.

Risiko

  1. Bollinger Bands boleh gagal dalam situasi tertentu.

  2. Risiko berhenti awal atau tertunda dalam kedua-dua strategi.

  3. CCI boleh menghasilkan isyarat yang salah.

  4. Kawal bias backtest dengan berhati-hati.

  5. Pengoptimuman berisiko terlalu sesuai.

Peningkatan

  1. Uji parameter untuk mencari kombinasi yang optimum.

  2. Menilai penambahan penapis dengan penunjuk lain.

  3. Mengoptimumkan perhentian untuk mengurangkan risiko.

  4. Penyelidikan kaedah penyesuaian untuk lebar saluran.

  5. Periksa dengan lebih banyak simbol dan jangka masa.

  6. Gunakan pembelajaran mesin untuk mengoptimumkan parameter secara dinamik.

Kesimpulan

Strategi ini merancang dua strategi hentian berdasarkan Bollinger Bands dan mengujinya di pelbagai jangka masa.


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




Lebih lanjut