Multi-Filter Bollinger Band Trading Strategy adalah strategi perdagangan kuantitatif yang menggabungkan indikator Bollinger Band, indikator moving average, indikator RSI dan fitur grafis K-line untuk skrining multi-kondisi untuk menghasilkan sinyal perdagangan ketika kondisi terpenuhi.
Strategi ini terutama menggunakan tiga indikator: Bollinger Bands, moving average dan RSI. Di antara mereka, rel tengah Bollinger Bands adalah rata-rata pergerakan harga sederhana n hari, dan rel atas dan bawah adalah rel tengah +2 standar deviasi dan rel tengah -2 standar deviasi masing-masing. Indikator RSI adalah nilai antara 0 dan 100 yang dihitung berdasarkan kisaran naik / turun selama periode waktu tertentu.
Strategi menghasilkan sinyal perdagangan melalui tiga kondisi utama berikut:
(1) Bollinger lower-band breakout & K-line body contradiction. Ketika harga penutupan menembus band bawah ke atas dan warna K-line body bertentangan dengan arah tren saat ini, pergi panjang.
(2) Bollinger upper-band breakout & K-line body contradiction Ketika harga penutupan menembus band atas ke bawah dan warna tubuh K-line bertentangan dengan arah tren saat ini, pergi short.
(3) K-line body reversal Jika arah posisi konsisten dengan K-line body color reversal, tutup posisi.
Selain itu, strategi ini juga menetapkan filter rata-rata bergerak, filter bodi garis K, filter RSI dan kondisi tambahan lainnya untuk mengontrol masuknya secara ketat.
Risiko dapat dikurangi dengan menyesuaikan parameter Bollinger dan mengontrol stop secara ketat.
Secara keseluruhan, strategi ini adalah strategi trend berikut jangka menengah hingga panjang yang khas. Dengan skrining multi-kondisi dan mengontrol waktu masuk dan keluar dengan ketat dengan pendekatan perdagangan tren, dapat mengurangi perdagangan yang tidak perlu dan menangkap tren pasar jangka menengah hingga panjang. Masih ada ruang besar untuk mengoptimalkan strategi ini dengan menyesuaikan parameter, menambahkan lebih banyak alat bantu dan sebagainya, untuk lebih meningkatkan stabilitas dan profitabilitas strategi.
/*backtest start: 2023-12-17 00:00:00 end: 2024-01-16 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=3 strategy("Noro's Bollinger Strategy v1.4", shorttitle = "Bollinger str 1.4", overlay = true ) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(false, defval = false, title = "Short") length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length") mult = input(1, defval = 1, minval = 0.001, maxval = 50, title = "Bollinger Mult") source = input(ohlc4, defval = ohlc4, title = "Bollinger Source") usebf = input(true, defval = true, title = "Use body-filter") usecf = input(true, defval = true, title = "Use color-filter") userf = input(true, defval = true, title = "Use RSI-filter") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") showbands = input(true, defval = true, title = "Show Bollinger Bands") //Bollinger Bands basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Lines col = showbands ? black : na plot(upper, linewidth = 1, color = col) plot(basis, linewidth = 1, color = col) plot(lower, linewidth = 1, color = col) //Body filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 2 or usebf == false //Color filter bar = close > open ? 1 : close < open ? -1 : 0 gb = bar == 1 or usecf == false rb = bar == -1 or usecf == false //RSI Filter fastup = rma(max(change(close), 0), 7) fastdown = rma(-min(change(close), 0), 7) rsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) ursi = rsi > 70 or userf == false drsi = rsi < 30 or userf == false //Signals up = close <= lower and rb and body and drsi and (close < strategy.position_avg_price or strategy.position_size == 0) dn = close >= upper and gb and body and ursi and (close > strategy.position_avg_price or strategy.position_size == 0) exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //Trading if up strategy.entry("Long", strategy.long, needlong == false ? 0 : na) if dn strategy.entry("Short", strategy.short, needshort == false ? 0 : na) if exit strategy.close_all()