Adaptive trend following strategy adalah strategi perdagangan kuantitatif yang menggabungkan Bollinger Bands dan indikator rata-rata bergerak untuk menyesuaikan faktor kekuatan tren secara dinamis dan mencapai trend following dan stop loss. Strategi ini menggunakan Bollinger Bands untuk menghitung volatilitas harga dan dengan demikian secara dinamis menghitung kekuatan tren yang wajar.
Indikator inti dari strategi ini adalah Bollinger Bands. Bollinger Bands terdiri dari band tengah, band atas dan band bawah. Band tengah adalah rata-rata bergerak sederhana n-hari, band atas adalah band tengah + k kali deviasi standar n-hari, dan band bawah adalah band tengah - k kali deviasi standar n-hari. Di sini kita memilih band tengah 20 hari dan 2 kali deviasi standar untuk membangun Bollinger Bands.
Kemudian kita menghitung bandwidth (band atas - band bawah) atas rasio band tengah, yang disebut faktor kekuatan. rasio ini mencerminkan volatilitas pasar saat ini dan kekuatan tren. kita menetapkan nilai maksimum dan minimum faktor kekuatan untuk mencegahnya terlalu besar atau terlalu kecil.
Dengan faktor kekuatan yang wajar, dikombinasikan dengan indikator ATR, band atas dan bawah bergerak ke atas dan ke bawah dengan jarak faktor kekuatan ATR * masing-masing untuk membentuk saluran tren adaptif.
Selain itu, strategi juga menetapkan mekanisme stop loss. Setelah posisi panjang dibentuk, jika harga turun di bawah titik terendah ketika posisi dibuka, stop loss exit; sama untuk posisi pendek.
Strategi ini memiliki keuntungan berikut:
Adaptasi yang tinggi. Cara menghitung faktor kekuatan memungkinkan strategi untuk menyesuaikan lebar saluran secara dinamis berdasarkan volatilitas pasar, memperluas saluran dalam tren pasar bull dan mempersempit saluran di pasar osilasi untuk mencapai penyesuaian diri ke berbagai jenis pasar.
Frekuensi operasi moderat. Dibandingkan dengan strategi rata-rata bergerak sederhana, strategi Bollinger Bands menyesuaikan saluran lebih jarang, menghindari pembukaan dan penutupan posisi yang sering yang tidak perlu.
Waktu masuk yang akurat. Penembusan rel atas dan bawah dapat secara efektif menyaring kebisingan pasar dan memastikan kemungkinan tinggi menangkap pembukaan tren.
Mekanisme stop loss. Metode stop loss built-in dapat secara efektif mengontrol kerugian tunggal, yang merupakan keuntungan utama dari strategi ini.
Strategi ini juga memiliki beberapa risiko:
Sensitivitas parameter yang tinggi. Periode n dan pengganda k dari Bollinger Bands memiliki pengaruh besar pada hasil, yang membutuhkan pengujian berulang untuk menemukan kombinasi parameter yang optimal.
Ketidakmampuan untuk melacak tren ketika Bollinger Bands menyimpang. Ketika harga berfluktuasi dengan keras, rel Bollinger Bands dengan cepat berkembang, sehingga tidak dapat melacak tren. Strategi perlu dihentikan kemudian, menunggu rel untuk konvergen sebelum berjalan lagi.
Strategi Bollinger Bands tidak sempurna, akan ada juga sejumlah sinyal palsu yang dihasilkan, yang mengharuskan menanggung kerugian yang sesuai.
Metode stop loss yang relatif sederhana. Stop loss dari strategi ini hanya mempertimbangkan harga tertinggi dan terendah setelah membuka posisi, tanpa memasukkan metode stop loss yang lebih kompleks berdasarkan volatilitas dll, yang mungkin terlalu agresif atau konservatif, yang membutuhkan optimasi.
Strategi ini perlu dioptimalkan dalam aspek berikut:
Uji efek dari mata uang yang berbeda dan parameter siklus. parameter strategi dapat dioptimalkan untuk mata uang yang berbeda dan siklus untuk meningkatkan kemampuan adaptasi strategi.
Memoptimalkan mekanisme stop loss. Stop loss bergerak, stop loss osilasi, trailing stop loss dll dapat diperkenalkan untuk membuat metode stop loss lebih cerdas.
Indikator seperti MACD, KDJ dll dapat ditambahkan untuk menghindari sinyal palsu dari Bollinger Bands di pasar osilasi sisi.
Menambahkan mekanisme manajemen posisi Mengimplementasikan metode manajemen pelacakan stop profit, perdagangan piramida, posisi proporsi tetap dll untuk meningkatkan profitabilitas strategi.
Melakukan optimasi backtest. Uji secara komprehensif hasil strategi dengan memperluas jangka waktu backtest, menyesuaikan parameter, menganalisis laporan backtest dll untuk menemukan parameter optimal.
Secara keseluruhan, strategi mengikuti tren adaptif adalah strategi kuantitatif yang cukup matang. Ini menggunakan Bollinger Bands untuk menangkap tren secara dinamis, dikombinasikan dengan indikator ATR untuk membangun saluran adaptif untuk menilai tren panjang dan pendek. Sementara itu, ia memiliki mekanisme stop loss built-in untuk mengendalikan risiko. Keuntungan dari strategi ini adalah frekuensi operasi yang tepat, waktu masuk yang akurat, dan kontrol risiko yang baik. Namun, ada beberapa masalah yang membutuhkan optimasi di bidang seperti pemilihan parameter, metode stop loss, penyaringan sinyal untuk membuat strategi lebih kuat dan cerdas.
/*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)