Strategi Bollinger Wave adalah strategi perdagangan kuantitatif yang menggabungkan Bollinger Bands dan moving average. Strategi ini menghasilkan sinyal perdagangan dengan menghitung standar deviasi Bollinger Bands dan crossover moving average untuk menentukan tren pasar dan area overbought/oversold.
Strategi ini pertama-tama menghitung rata-rata bergerak eksponensial (EMA) selama periode yang ditentukan sebagai garis dasar. Band atas (EMA + n kali standar deviasi) dan band bawah (EMA - n kali standar deviasi) kemudian dihitung berdasarkan EMA ini. Pemecahan di atas band atas menunjukkan sinyal overbought, sementara pemecahan di bawah band bawah menunjukkan sinyal oversold.
Ketika harga berada di antara band atas dan bawah, ini adalah rentang fluktuasi harga normal saham. Selain itu, strategi menggabungkan indikator lain seperti RSI untuk menyaring sinyal perdagangan dan mengurangi frekuensi perdagangan untuk meminimalkan kerugian yang tidak perlu.
Secara khusus, aturan sinyal perdagangan adalah:
Ketika sinyal perdagangan di atas muncul, mengambil posisi dengan jumlah tetap atau persentase akun. Posisi keluar ketika harga bergerak kembali ke band atau sinyal yang berlawanan muncul.
Strategi ini menggabungkan penentuan tren dan penilaian overbought / oversold untuk menghindari perdagangan yang salah di pasar yang terikat rentang.
Dibandingkan dengan strategi rata-rata bergerak sederhana, Bollinger Bands lebih mencerminkan volatilitas pasar saat ini dan tingkat risiko. Ketika lebar band kecil, sinyal perdagangan lebih dapat diandalkan. Ketika lebar band besar, frekuensi perdagangan akan berkurang secara otomatis. Penyesuaian adaptif semacam itu dapat mengendalikan risiko strategi berdasarkan kondisi pasar yang berbeda.
Selain itu, konfirmasi ganda dari RSI dan indikator lain membantu menyaring beberapa sinyal palsu dan menghindari perdagangan yang salah di sekitar titik balik tren.
Risiko utama dari strategi ini adalah:
Risiko optimasi parameter. Jika parameter rata-rata bergerak atau standar deviasi ditetapkan secara tidak tepat, hal ini dapat menghasilkan perdagangan yang lebih bising atau kehilangan peluang perdagangan. Parameter ini membutuhkan pengujian dan optimasi iteratif.
Risiko sinyal breakout palsu. Ketika harga secara singkat melanggar di atas atau di bawah band kemudian dengan cepat berbalik, itu dapat menghasilkan sinyal yang salah. Berdagang secara membabi buta akan meningkatkan kerugian. Hal ini dapat dikendalikan dengan meningkatkan periode moving average atau mengatur stop loss.
Risiko frekuensi perdagangan yang tinggi. Jika band memiliki kesenjangan yang sangat sempit, hal itu dapat meningkatkan jumlah perdagangan dan komisi yang dibayarkan, sehingga mempengaruhi profitabilitas akhir. Hal ini dapat dikurangi dengan meningkatkan periode rata-rata bergerak secara moderat.
Ada ruang untuk optimalisasi strategi lebih lanjut:
Menambahkan mekanisme stop loss. Menggunakan trailing stop loss atau time stop loss membantu mewujudkan kerugian dalam waktu dan mengontrol jumlah kerugian perdagangan tunggal.
Tambahkan aturan ukuran posisi. Misalnya, piramida dalam perdagangan yang menang dan mengurangi pecundang. Ini dapat meningkatkan pengembalian strategi.
Kombinasi dengan indikator lain untuk penyaringan sinyal. Indikator seperti KDJ dan MACD dapat berfungsi sebagai alat penilaian tambahan. Ini membantu meningkatkan keuntungan strategi lebih lanjut.
Metode yang lebih sistematis seperti algoritma genetik dapat digunakan untuk menguji kombinasi parameter yang berbeda dan menemukan pengaturan yang lebih baik.
Strategi Bollinger Wave mengintegrasikan penentuan tren rata-rata bergerak dan penilaian overbought / oversold. Ini menyesuaikan frekuensi perdagangan berdasarkan perubahan lebar pita untuk beradaptasi dengan kondisi pasar yang berbeda. Sementara itu, penyaringan sinyal oleh RSI dan indikator lain menghindari perdagangan yang salah. Strategi ini mempertimbangkan baik pelacakan tren pasar dan pengendalian risiko. Dengan optimalisasi berkelanjutan, ini dapat menjadi strategi perdagangan kuantitatif yang menguntungkan secara stabil.
/*backtest start: 2023-01-08 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //@FiboBuLL strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100) src = input(close, title='Source') length = input.int(55, minval=1, title='EMA length') // 20 for classis Bollinger Bands SMA line (basis) mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation') //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk basis = ta.sma(src, length) dev = mult * ta.stdev(src, length) Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type') CC = input(true, 'Color Bars') upper = basis + dev lower = basis - dev //Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc. short = src < lower // and rsi(close,14)<40 long = src > upper // and rsi(close,14)>60 L1 = ta.barssince(long) S1 = ta.barssince(short) longSignal = L1 < S1 and not (L1 < S1)[1] shortSignal = S1 < L1 and not (S1 < L1)[1] //Plots and Fills ////Long/Short shapes with text // plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true) // plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true) // plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true) // plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true) p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band') p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band') p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis') fill(p, p1, color=color.new(color.teal, 85), title='Top Fill') //fill for basis-upper fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85) //fill for basis-lower //Barcolor bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na barcolor(CC ? bcol : na, editable=false, title='Color Bars') // //Alerts ---- // Use 'Once per bar close' // alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close' // alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}') // Use 'Once per bar close' Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗') // === INPUT BACKTEST RANGE === FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12) FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31) FromYear = input.int(defval=2018, title='From Year', minval=2015) ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12) ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31) ToYear = input.int(defval=9999, title='To Year', minval=2010) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false if window() and (Show == 'Longs Only' or Show == 'Both') strategy.entry('AL', direction=strategy.long, when=longSignal) strategy.close('LongAL', when=shortSignal, comment='AL KAPA') if window() and (Show == 'Shorts Only' or Show == 'Both') strategy.entry('SAT', direction=strategy.short, when=shortSignal) strategy.close('SAT', when=longSignal, comment='SAT KAPA')