Strategi ini mengira indikator PB purata dan pita Bollinger untuk menentukan hubungan salib emas dan salib mati antara penunjuk PB dan rel atas dan bawah pita Bollinger. Ia menghasilkan isyarat beli apabila penunjuk PB memecahkan di atas rel tengah atau rel bawah pita Bollinger, dan menghasilkan isyarat jual apabila penunjuk PB memecahkan di bawah rel tengah atau rel atas pita Bollinger.
Penunjuk PB purata menggabungkan kestabilan sistem purata bergerak dan kepekaan penunjuk PB. Ia menggunakan perbezaan antara purata bergerak cepat dan perlahan kitaran yang berbeza untuk menyatakan trend perubahan harga untuk menentukan trend panjang dan pendek.
Strategi ini juga menggunakan penunjuk Bollinger Band untuk mengenal pasti keadaan overbought dan oversold harga saham. Penunjuk Bollinger Band terdiri daripada tiga lengkung: rel tengah, rel atas dan rel bawah. Rel tengah adalah purata bergerak n hari; rel atas dan bawah dikira berdasarkan rel tengah dan turun naik sejarah. Apabila harga saham berhampiran dengan rel atas, ia berada di zon overbought; apabila ia berhampiran dengan rel bawah, ia berada di zon oversold, dan kawasan di sekitar rel tengah adalah julat harga yang munasabah untuk saham.
Ringkasnya, strategi ini dengan bijak menggunakan penunjuk PB purata untuk menentukan trend kenaikan atau penurunan harga saham, dan pita Bollinger sebagai penunjuk tambahan untuk menentukan keadaan overbought dan oversold, untuk mencari isyarat perdagangan dari hubungan antara kedua-dua penunjuk.
Kelebihan utama strategi ini ialah:
Risiko utama strategi ini ialah:
Untuk menangani risiko di atas, kaedah seperti mengoptimumkan tetapan parameter, stop loss yang ketat, mempertimbangkan faktor makro, pemantauan manual boleh digunakan untuk mengurangkan risiko.
Arah pengoptimuman untuk strategi ini termasuk:
Performa keseluruhan strategi ini cukup memuaskan. Dengan indikator PB purata sebagai terasnya dan Bollinger Bands untuk membantu menentukan isyarat perdagangan, ia mempunyai logika yang mudah, kepekaan yang tinggi, dan hasil backtest yang baik. Dengan terus mengoptimumkan tetapan parameter, menambah penunjuk yang membantu lain, melaksanakan stop loss yang ketat dan lain-lain, keuntungan dan kestabilan strategi dapat ditingkatkan lagi.
/*backtest start: 2024-01-09 00:00:00 end: 2024-01-16 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("BandPass EOS", overlay=false, initial_capital = 1000) src = input(close, "Source", input.source) Period1 = input(41, "Fast Period", input.integer) Period2 = input(54, "Slow Period", input.integer) showBG = input(false, "Show crosses on background?", input.bool) UseReversalStop = input(true, "Use additional triggers?", input.bool) //Super Passband Filter a1 = 0.0 a2 = 0.0 PB = 0.0 RMS = 0.0 if bar_index > Period1 a1 := 5 / Period1 a2 := 5 / Period2 PB := (a1 - a2) * src + (a2 * (1 - a1) - a1 * (1 - a2)) * src[1] + (1 - a1 + 1 - a2) * nz(PB[1]) - (1 - a1) * (1 - a2) * nz(PB[2]) for i = 0 to 49 by 1 RMS := RMS + PB[i] * PB[i] RMS RMS := sqrt(RMS / 40) RMS z = 0 buy = PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z) sell = PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z) signal = buy ? 1 : sell ? -1 : 0 bg = buy ? color.green : sell ? color.red : color.white bg := showBG ? bg : na upperFill = PB>RMS ? color.lime : na lowerFill = PB<-RMS ? color.red : na p1 = plot(PB,"PB",color.red) p2 = plot(RMS,"+RMS",color.blue) p3 = plot(-RMS,"-RMS",color.blue) bgcolor(bg) fill(p1,p2,upperFill) fill(p1,p3,lowerFill) hline(0) //PERIOD testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true lcolor = PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z) scolor = PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z) c1 = (PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z)) c2 = (PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z)) plot (c1 ? PB : na, style = plot.style_circles, color = color.red, linewidth = 3) plot (c2 ? PB : na, style = plot.style_circles, color = color.green, linewidth = 3) if (PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z)) strategy.entry("long", strategy.long, when = testPeriod()) if (PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z)) strategy.entry("short", strategy.short, when = testPeriod())