Strategi Bollinger Wave adalah strategi perdagangan kuantitatif yang menggabungkan Bollinger Bands dan purata bergerak. Ia menghasilkan isyarat perdagangan dengan mengira penyimpangan standard Bollinger Bands dan silang purata bergerak untuk menentukan trend pasaran dan kawasan overbought / oversold.
Strategi ini mula-mula mengira purata bergerak eksponensial (EMA) dalam tempoh yang ditentukan sebagai garis asas. Band atas (EMA + n kali penyimpangan standard) dan band bawah (EMA - n kali penyimpangan standard) kemudian dikira berdasarkan EMA ini. Patah di atas band atas menunjukkan isyarat overbought, sementara pecah di bawah band bawah menunjukkan isyarat oversold.
Apabila harga berada di antara band atas dan bawah, ini adalah julat turun naik harga biasa saham. Di samping itu, strategi menggabungkan penunjuk lain seperti RSI untuk menapis isyarat perdagangan dan mengurangkan kekerapan perdagangan untuk meminimumkan kerugian yang tidak perlu.
Khususnya, peraturan isyarat dagangan adalah:
Apabila isyarat perdagangan di atas muncul, ambil kedudukan dengan kuantiti tetap atau peratusan akaun. keluar kedudukan apabila harga bergerak kembali ke dalam band atau isyarat bertentangan muncul.
Strategi ini menggabungkan penentuan trend dan pertimbangan overbought / oversold untuk mengelakkan perdagangan yang salah di pasaran yang terikat julat.
Band Bollinger lebih baik mencerminkan turun naik pasaran semasa dan tahap risiko berbanding dengan strategi purata bergerak yang mudah. Apabila lebar band kecil, isyarat perdagangan lebih boleh dipercayai. Apabila lebar band besar, kekerapan perdagangan akan dikurangkan secara automatik. Penyesuaian adaptif sedemikian dapat mengawal risiko strategi berdasarkan keadaan pasaran yang berbeza.
Di samping itu, pengesahan berganda dari RSI dan penunjuk lain membantu menapis beberapa isyarat palsu dan mengelakkan perdagangan yang salah di sekitar titik perubahan trend.
Risiko utama strategi ini ialah:
Risiko pengoptimuman parameter. Jika parameter purata bergerak atau deviasi standard ditetapkan dengan tidak betul, ia boleh menghasilkan perdagangan yang lebih bising atau kehilangan peluang perdagangan. Parameter ini memerlukan ujian dan pengoptimuman berulang.
Risiko isyarat pecah palsu. Apabila harga secara ringkas memecahkan di atas atau di bawah jalur kemudian berbalik dengan cepat, ia mungkin menghasilkan isyarat yang salah. Berdagang secara buta pada mereka akan meningkatkan kerugian. Ini boleh dikawal dengan meningkatkan tempoh purata bergerak atau menetapkan stop loss.
Risiko kekerapan dagangan yang tinggi. Jika rentang mempunyai jurang yang sangat sempit, ia boleh meningkatkan jumlah dagangan dan komisen yang dibayar, sehingga mempengaruhi keuntungan akhir. Ini boleh dikurangkan dengan meningkatkan tempoh purata bergerak secara sederhana.
Terdapat ruang untuk pengoptimuman lagi strategi:
Menambah mekanisme stop loss. Menggunakan stop loss atau stop loss masa membantu merealisasikan kerugian dalam masa dan mengawal jumlah kerugian perdagangan tunggal.
Tambah peraturan saiz kedudukan. Sebagai contoh, piramid ke dalam perdagangan yang menang dan mengurangkan yang kalah. Ini boleh meningkatkan pulangan strategi.
Gabungkan dengan penunjuk lain untuk penapisan isyarat. Penunjuk seperti KDJ dan MACD boleh berfungsi sebagai alat penilaian tambahan. Ini membantu meningkatkan lagi keuntungan strategi.
Mengoptimumkan tetapan parameter. Kaedah yang lebih sistematik seperti algoritma genetik boleh digunakan untuk menguji kombinasi parameter yang berbeza dan mencari tetapan yang lebih baik.
Strategi Bollinger Wave mengintegrasikan penentuan trend purata bergerak dan penilaian overbought / oversold. Ia menyesuaikan kekerapan perdagangan berdasarkan perubahan lebar jalur untuk menyesuaikan diri dengan keadaan pasaran yang berbeza. Sementara itu, penapisan isyarat oleh RSI dan penunjuk lain mengelakkan perdagangan yang tidak betul. Strategi ini mempertimbangkan kedua-dua pengesanan trend pasaran dan mengawal risiko. Dengan pengoptimuman berterusan, ia boleh menjadi strategi perdagangan kuantitatif yang menguntungkan yang mantap.
/*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')