
Strategi Bollinger Wave adalah strategi perdagangan kuantitatif yang menggabungkan Bollinger Band dan Moving Average. Strategi ini menghasilkan sinyal perdagangan dengan menghitung perbedaan standar Bollinger Band dan sinyal silang Moving Average untuk menilai tren pasar dan zona overbought dan oversold.
Strategi ini pertama-tama menghitung rata-rata bergerak indeks dalam periode yang ditentukan (EMA) sebagai garis dasar. Kemudian berdasarkan EMA ini menghitung garis atas (EMA + n kali standar deviasi) dan garis bawah (EMA - n kali standar deviasi). Ini adalah sinyal overbought ketika harga menerobos garis atas dan sinyal oversold ketika harga jatuh ke garis bawah.
Ketika harga berada di antara garis atas dan garis bawah, itu adalah area normal harga saham berfluktuasi. Selain itu, strategi ini digabungkan dengan indikator lain seperti RSI untuk memfilter sinyal perdagangan, mengurangi frekuensi perdagangan, dan mengurangi kerugian yang tidak perlu.
Secara khusus, aturan penilaian sinyal perdagangan untuk strategi ini adalah sebagai berikut:
Ketika sinyal perdagangan yang disebutkan di atas muncul, masuk dengan jumlah tetap atau proporsi akun. Keluar dari posisi ketika harga kembali ke dalam kisaran gelombang atau sinyal sebaliknya muncul.
Strategi ini menggabungkan penilaian tren dan penilaian overbought dan oversold untuk menghindari kesalahan perdagangan dalam penutupan guncangan. Dibandingkan dengan strategi indikator tunggal, ini dapat mengurangi pembukaan posisi yang tidak perlu dan mengendalikan risiko secara efektif.
Boll band lebih mencerminkan volatilitas dan tingkat risiko pasar saat ini daripada strategi rata-rata bergerak sederhana. Dengan bandwidth yang lebih besar, sinyal perdagangan lebih dapat diandalkan. Dengan bandwidth yang lebih besar, frekuensi perdagangan secara otomatis menurun.
Selain itu, strategi ini melakukan double confirmation melalui indikator seperti RSI, yang dapat memfilter beberapa sinyal palsu, untuk menghindari perdagangan yang salah pada titik-titik perubahan tren.
Strategi ini menghadapi risiko utama sebagai berikut:
Risiko optimasi parameter. Jika parameter moving average atau standar deviasi tidak diatur dengan benar, akan menghasilkan lebih banyak perdagangan yang berisik atau kehilangan peluang perdagangan.
Resiko sinyal palsu pecah. Ketika harga muncul singkat setelah menembus garis tren naik turun dan segera kembali, akan menghasilkan sinyal yang salah. Pada saat ini, perdagangan akan meningkatkan kerugian. Risiko ini dapat dikendalikan dengan meningkatkan siklus moving average atau mengatur stop loss.
Risiko frekuensi perdagangan. Jika jarak antara garis atas dan bawah terlalu kecil, akan meningkatkan jumlah transaksi dan pembayaran biaya. Ini akan berdampak pada keuntungan akhir. Siklus rata-rata bergerak dapat ditingkatkan secara tepat untuk mengendalikan risiko ini.
Strategi ini masih memiliki ruang untuk dioptimalkan lebih jauh:
Meningkatkan mekanisme stop loss. Membangun stop loss bergerak atau stop loss waktu, membantu untuk menghentikan kerugian tepat waktu, mengendalikan kerugian tunggal.
Meningkatkan manajemen posisi. Misalnya, membuat aturan untuk menambah dan mengurangi posisi, sehingga keuntungan meningkat dan kerugian berkurang. Ini dapat meningkatkan tingkat keuntungan strategi.
Dalam kombinasi dengan indikator lain, sinyal penyaringan. Indikator seperti KDJ, MACD, dan lain-lain dapat digunakan sebagai indikator untuk membantu sinyal penilaian. Ini dapat membantu meningkatkan tingkat keuntungan strategi lebih lanjut.
Optimalkan pengaturan parameter. Kombinasi parameter dapat diuji dengan metode yang lebih sistematis seperti algoritma genetik untuk mencari pengaturan parameter yang lebih baik.
Strategi sinyal bergelombang Bol menggabungkan penilaian tren dari rata-rata bergerak dan penilaian overbought dan oversold. Ini menyesuaikan frekuensi perdagangan sesuai dengan perubahan dalam rentang gelombang dan dapat disesuaikan dengan keadaan pasar yang berbeda.
/*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')