Strategi Trading Multi-Timeframe dengan Bollinger Bands

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

Gambaran umum

Strategi ini menggunakan adaptif Bollinger Bands untuk merancang dua jenis strategi trailing stop dan backtest mereka secara sistematis di seluruh kerangka waktu.

Logika Strategi

  1. Menghitung band atas dan bawah adaptif Bollinger Bands, dengan lebar saluran yang dapat disesuaikan.

  2. Strategi pelacakan breakout untuk membuka posisi pada breakout band dan berhenti ketika harga kembali ke dalam band.

  3. Strategi pembalikan untuk membuka posisi ketika harga mencapai band dan berhenti ketika harga kembali ke dalam band.

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

  5. Backtest di beberapa kerangka waktu untuk memverifikasi kelayakan kedua strategi.

Keuntungan

  1. Bollinger Bands intuitif dalam menangkap tren harga.

  2. Kedua strategi cocok dengan kondisi pasar yang berbeda untuk ketahanan.

  3. CCI membantu menentukan arah panjang/pendek.

  4. Multi-frame waktu backtesting membuat hasil lebih meyakinkan.

  5. Aturan strategi yang sederhana dan jelas mudah diterapkan.

Risiko

  1. Bollinger Bands bisa gagal dalam situasi tertentu.

  2. Risiko berhenti prematur atau terlambat dalam kedua strategi.

  3. CCI dapat menghasilkan sinyal yang salah.

  4. Berurusan dengan bias backtest dengan hati-hati.

  5. Optimasi berisiko terlalu pas.

Peningkatan

  1. Uji parameter untuk menemukan kombinasi optimal.

  2. Evaluasi menambahkan filter dengan indikator lain.

  3. Mengoptimalkan pemberhentian untuk mengurangi risiko.

  4. Penelitian metode adaptif untuk lebar saluran.

  5. Verifikasi dengan simbol dan kerangka waktu yang lebih.

  6. Gunakan pembelajaran mesin untuk mengoptimalkan parameter secara dinamis.

Kesimpulan

Strategi ini mendesain dua strategi trailing stop berdasarkan Bollinger Bands dan backtest mereka di beberapa timeframe.


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