
Strategi Bollinger Wave adalah strategi perdagangan kuantitatif yang menggabungkan Bollinger Wave Band dan purata bergerak. Strategi ini menghasilkan isyarat perdagangan dengan mengira perbezaan piawaian Bollinger Wave Band dan isyarat persilangan rata-rata bergerak untuk menilai trend pasaran dan kawasan overbought.
Strategi ini pertama-tama mengira purata bergerak indeks dalam tempoh yang ditetapkan ((EMA) sebagai garis asas. Kemudian berdasarkan EMA ini, garis atas ((EMA + n kali standard deviation) dan garis bawah ((EMA - n kali standard deviation) dihitung.
Apabila harga berada di antara garisan atas dan garisan bawah, adalah kawasan harga biasa saham. Selain itu, strategi ini digabungkan dengan indikator lain seperti RSI untuk menapis isyarat perdagangan, mengurangkan frekuensi perdagangan, dan mengurangkan kerugian yang tidak perlu.
Secara khusus, peraturan untuk menilai isyarat perdagangan dalam strategi ini adalah seperti berikut:
Apabila isyarat dagangan di atas muncul, masuk dengan jumlah tetap atau perkadaran akaun. Keluar dari kedudukan apabila harga kembali ke dalam lingkungan gelombang atau isyarat sebaliknya muncul.
Strategi ini menggabungkan penilaian trend dan penilaian overbought dan oversold untuk mengelakkan perdagangan yang salah dalam penyusunan guncangan. Berbanding dengan strategi satu petunjuk, ia dapat mengurangkan kedudukan yang tidak perlu dan mengawal risiko dengan berkesan.
Boll band lebih mencerminkan turun naik dan tahap risiko pasaran semasa berbanding dengan strategi purata bergerak sederhana. Apabila band lebar gelombang adalah jam, isyarat perdagangan lebih dipercayai; apabila band lebar gelombang besar, frekuensi perdagangan akan turun secara automatik.
Di samping itu, strategi ini melakukan pengesahan dua kali dengan penunjuk seperti RSI, yang boleh menyaring beberapa isyarat palsu dan mengelakkan perdagangan yang salah pada titik perubahan trend.
Strategi ini mempunyai risiko utama:
Risiko pengoptimuman parameter. Jika parameter purata bergerak atau perkalian perbezaan piawai ditetapkan dengan tidak betul, lebih banyak perdagangan bising atau peluang perdagangan yang terlewat akan dihasilkan. Parameter ini perlu diuji dan dioptimumkan berulang kali.
Risiko meletupkan isyarat palsu. Apabila harga muncul dalam jangka pendek untuk menembusi garisan atas dan bawah dan segera kembali, isyarat yang salah akan dihasilkan. Apabila ini berlaku, perdagangan akan meningkatkan kerugian. Risiko ini boleh dikawal dengan meningkatkan kitaran purata bergerak atau menetapkan stop loss.
Risiko frekuensi dagangan. Jika jurang atas dan bawah terlalu kecil, ia akan meningkatkan jumlah dagangan dan bayaran bayaran. Ini akan memberi kesan kepada keuntungan akhir. Anda boleh meningkatkan kitaran purata bergerak dengan sewajarnya untuk mengawal risiko ini.
Strategi ini masih boleh dioptimumkan lagi:
Menambah mekanisme hentian kerugian. Menubuhkan hentian bergerak atau hentian masa, membantu menghentikan kerugian tepat pada masanya, mengawal kerugian tunggal.
Meningkatkan pengurusan kedudukan. Sebagai contoh, menetapkan peraturan untuk menambah dan mengurangkan kedudukan, sehingga keuntungan meningkat dan kerugian berkurangan. Ini dapat meningkatkan kadar keuntungan strategi.
Dalam kombinasi dengan petunjuk lain, isyarat penapisan. Indikator seperti KDJ, MACD dan sebagainya boleh digunakan sebagai isyarat penilaian tambahan. Ini dapat membantu meningkatkan kadar keuntungan strategi.
Tetapan parameter yang dioptimumkan. Ia boleh diuji dengan kaedah yang lebih sistematik seperti algoritma genetik untuk mencari tetapan parameter yang lebih baik.
Strategi isyarat bergelombang Bol menggabungkan penilaian trend rata-rata bergerak dan penilaian overbought dan oversold. Ia menyesuaikan frekuensi dagangan mengikut perubahan dalam julat gelombang dan dapat disesuaikan dengan keadaan pasaran yang berbeza. Ia juga memfilter isyarat dalam kombinasi dengan indikator seperti RSI untuk mengelakkan perdagangan yang salah.
/*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')