Strategi trend berikut adaptif adalah strategi perdagangan kuantitatif yang menggabungkan Bollinger Bands dan penunjuk purata bergerak untuk menyesuaikan faktor kekuatan trend secara dinamik dan mencapai trend berikut dan stop loss. Strategi ini menggunakan Bollinger Bands untuk mengira turun naik harga dan dengan itu secara dinamik mengira kekuatan trend yang munasabah. Ia kemudian menggunakan penunjuk ATR untuk merangka saluran trend adaptif untuk menentukan dan mengikuti trend bullish dan bearish. Pada masa yang sama, strategi ini mempunyai mekanisme stop loss terbina dalam untuk mengawal risiko dengan berkesan.
Indikator utama strategi ini ialah Bollinger Bands. Bollinger Bands terdiri daripada band tengah, band atas dan band bawah. Band tengah adalah purata bergerak mudah n hari, band atas adalah band tengah + k kali deviasi standard n hari, dan band bawah adalah band tengah - k kali deviasi standard n hari. Di sini kita memilih band tengah 20 hari dan 2 kali deviasi standard untuk membina Bollinger Bands.
Kemudian kita mengira lebar jalur (band atas - band bawah) di atas nisbah jalur tengah, yang dirujuk sebagai faktor kekuatan. nisbah ini mencerminkan turun naik pasaran semasa dan kekuatan trend. Kami menetapkan nilai maksimum dan minimum faktor kekuatan untuk mengelakkannya menjadi terlalu besar atau terlalu kecil.
Dengan faktor kekuatan yang munasabah, digabungkan dengan penunjuk ATR, jalur atas dan bawah bergerak ke atas dan ke bawah dengan jarak faktor kekuatan ATR * masing-masing untuk membentuk saluran trend adaptif. Apabila harga penutupan menembusi rel atas ke atas dari bawah, pergi panjang; apabila ia menembusi rel bawah ke bawah dari atas, pergi pendek.
Selain itu, strategi ini juga menetapkan mekanisme stop loss. Selepas kedudukan panjang terbentuk, jika harga jatuh di bawah titik terendah ketika kedudukan dibuka, stop loss exit; sama untuk kedudukan pendek.
Strategi ini mempunyai kelebihan berikut:
Kebolehsesuaian yang tinggi. Cara pengiraan faktor kekuatan membolehkan strategi untuk menyesuaikan lebar saluran secara dinamik berdasarkan turun naik pasaran, memperluaskan saluran dalam trend pasaran bull dan mempersempit saluran dalam pasaran berayun untuk mencapai penyesuaian diri kepada pelbagai jenis pasaran.
Frekuensi operasi yang sederhana. Berbanding dengan strategi purata bergerak yang mudah, strategi Bollinger Bands menyesuaikan saluran kurang kerap, mengelakkan pembukaan dan penutupan kedudukan yang kerap yang tidak perlu.
Masa kemasukan yang tepat. Penembusan rel atas dan bawah dapat menapis bunyi pasaran dengan berkesan dan memastikan kebarangkalian tinggi menangkap pembukaan trend.
Mekanisme Stop Loss. Kaedah stop loss terbina dalam dapat mengawal kerugian tunggal dengan berkesan, yang merupakan kelebihan utama strategi ini.
Strategi ini juga mempunyai beberapa risiko:
Sensitiviti parameter yang tinggi. Tempoh n dan pengganda k Bollinger Bands mempunyai pengaruh yang besar terhadap keputusan, memerlukan ujian berulang untuk mencari kombinasi parameter yang optimum.
Kegagalan untuk mengesan trend apabila Bollinger Bands berlainan. Apabila harga turun naik secara ganas, rel Bollinger Bands berkembang dengan cepat, mengakibatkan ketidakupayaan untuk mengesan trend. Strategi perlu dihentikan kemudian, menunggu rel untuk bersesuaian sebelum berjalan semula.
Strategi Bollinger Bands tidak sempurna, akan ada juga sejumlah isyarat palsu yang dihasilkan, yang memerlukan menanggung kerugian yang sepadan.
Kaedah stop loss yang agak mudah. Stop loss strategi ini hanya mempertimbangkan harga tertinggi dan terendah selepas membuka kedudukan, tanpa menggabungkan kaedah stop loss yang lebih kompleks berdasarkan turun naik dll, yang mungkin terlalu agresif atau konservatif, memerlukan pengoptimuman.
Strategi ini perlu dioptimumkan dalam aspek berikut:
Uji kesan mata wang yang berbeza dan parameter kitaran. Parameter strategi boleh dioptimumkan untuk mata wang dan kitaran yang berbeza untuk meningkatkan kebolehsesuaian strategi.
Mengoptimumkan mekanisme stop loss. Memindahkan stop loss, berayun stop loss, trailing stop loss dan lain-lain boleh diperkenalkan untuk membuat kaedah stop loss lebih pintar.
Menggabungkan penunjuk lain untuk menapis isyarat kemasukan. Penunjuk seperti MACD, KDJ dan lain-lain boleh ditambah untuk mengelakkan isyarat palsu dari Bollinger Bands di pasaran yang berayun ke sisi.
Menambah mekanisme pengurusan kedudukan. Melaksanakan pengesanan keuntungan berhenti, perdagangan piramid, kedudukan perkadaran tetap dan lain-lain kaedah pengurusan untuk meningkatkan keuntungan strategi.
Melakukan pengoptimuman backtest. Memeriksa secara komprehensif hasil strategi dengan memperluaskan jangka masa backtest, menyesuaikan parameter, menganalisis laporan backtest dan lain-lain untuk mencari parameter yang optimum.
Secara keseluruhan, strategi trend berikut adaptif adalah strategi kuantitatif yang cukup matang. Ia menggunakan Bollinger Bands untuk menangkap trend secara dinamik, digabungkan dengan penunjuk ATR untuk membina saluran adaptif untuk menilai trend panjang dan pendek. Sementara itu ia mempunyai mekanisme stop loss terbina dalam untuk mengawal risiko. Kelebihan strategi ini adalah kekerapan operasi yang sesuai, masa kemasukan yang tepat, dan kawalan risiko yang baik. Walau bagaimanapun, terdapat beberapa isu yang memerlukan pengoptimuman dalam bidang seperti pemilihan parameter, kaedah stop loss, penapisan isyarat untuk menjadikan strategi lebih mantap dan pintar.
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true) Pd=input(2, minval=1,maxval = 100, title="Period") Bw=input(50, minval=1,maxval = 100, title="Bandwidth") minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor") maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor") plot_trend=input(true, title="Plot trend") plot_losscut = input(true, title="Plot losscut") /////////////// Calculate the BB's /////////////// basisBB = ema(close, 20) devBB = 2 * stdev(close, 20) upperBB = basisBB + devBB lowerBB = basisBB - devBB //plot(upperBB) //plot(lowerBB) ///////////// Trend //////////////////////////// rawFactor = ((upperBB-lowerBB)/basisBB)*Bw Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor Up=hl2-(Factor*atr(Pd)) Dn=hl2+(Factor*atr(Pd)) TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1) TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1) Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80) sig_trend_long = Trend[1] == -1 and Trend == 1 sig_trend_short = Trend[1] == 1 and Trend == -1 ///////////// Loss Cut //////////////////////////// price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1] current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1]) sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) ) has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1]) sig_reentry_long = not has_position and current_trend == 1 and low > price_cut sig_reentry_short = not has_position and current_trend == -1 and high < price_cut bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70) plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny) plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny) LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60) fill(TrendDownPlot, LossCutPlot, color=silver, transp=90) plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny) plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny) ///////////// Strategy //////////////////////////// if true strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long) strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short) if(current_trend == 1) strategy.close('long', when=sig_loss_cut == true) //strategy.exit('lc',from_entry='long', stop=price_cut) if( current_trend == -1 ) strategy.close('short', when=sig_loss_cut == true) //strategy.exit('sc',from_entry='short', stop=price_cut)