Adaptive Bollinger Trend Tracking Strategy (Strategi Pelacakan Tren Bollinger yang Adaptif)

Penulis:ChaoZhang, Tanggal: 2023-11-16 16:35:01
Tag:

img

Gambaran umum

Strategi ini didasarkan pada indikator Bollinger Bands, dikombinasikan dengan rata-rata bergerak adaptif, untuk secara akurat menilai dan melacak tren. Dengan menyesuaikan parameter secara dinamis, strategi dapat beradaptasi dengan produk dan lingkungan pasar yang berbeda, dengan stabilitas dan kemampuan beradaptasi yang kuat.

Logika Strategi

Strategi ini terdiri dari bagian-bagian utama berikut:

  1. Menghitung rata-rata bergerak adaptif Menggunakan indikator regresi linier untuk menghitung kurva regresi linier selama periode tertentu sebagai rata-rata bergerak.

  2. Menghitung Bollinger Bands. Gunakan indikator ATR adaptif untuk menghitung band, dikombinasikan dengan parameter ratio2 yang ditentukan pengguna, untuk mendapatkan band atas dan bawah.

  3. Menentukan entri dan keluar. Menghakimi arah tren dan entri/keluar berdasarkan harga yang menembus Bollinger Bands. Menembus sinyal band atas menjual entri sementara memecahkan sinyal band bawah membeli entri.

  4. Menggunakan titik stop loss tetap untuk mengendalikan risiko dan trailing stop profit untuk memaksimalkan keuntungan tren.

  5. Gabungkan dengan jendela waktu backtesting untuk optimasi dan verifikasi strategi.

Keuntungan

  1. Parameter adaptif. Rata-rata bergerak dan band desain adaptif menyesuaikan diri dengan perubahan pasar.

  2. Bollinger Bands Breakout menawarkan sinyal pembalikan tren yang jelas.

  3. Stop loss tetap mengendalikan risiko dan trailing stop profit bertujuan untuk memaksimalkan keuntungan tren.

  4. Divalidasi dengan backtesting. jendela backtesting memverifikasi efektivitas strategi.

  5. Logika jelas dan kode ringkas untuk mudah dipahami.

Risiko

  1. Bollinger Bands membutuhkan penyesuaian parameter. lebar band dan periode mungkin perlu dioptimalkan untuk produk yang berbeda. parameter yang tidak benar menyebabkan sinyal hilang atau pemicu palsu.

  2. Periode backtest terbatas. rentang backtest terbaru mungkin tidak cukup untuk sepenuhnya memverifikasi stabilitas data historis yang komprehensif.

  3. Risiko overfitting: Parameter yang dioptimalkan saat ini mungkin terlalu sesuai dengan kondisi pasar khusus baru-baru ini.

  4. Stop loss level perlu evaluasi. Stop loss kecil mungkin terlalu sensitif dan dihentikan oleh fluktuasi kecil. Stop loss yang tepat perlu dinilai.

  5. Kurangnya validasi yang dapat diukur. Saat ini hanya menggunakan pemisahan grafis untuk sinyal perdagangan tanpa validasi metrik yang dapat diukur.

Arah Peningkatan

  1. Memperkenalkan indikator yang lebih adaptif. Uji kombinasi dari berbagai rata-rata bergerak adaptif dan saluran untuk membangun sistem pelacakan tren yang kuat.

  2. Menggunakan metode yang lebih sistematis seperti algoritma genetik untuk menemukan kombinasi parameter yang optimal.

  3. Memperluas periode backtest. Uji pada data historis yang lebih luas untuk memeriksa stabilitas parameter. Masukkan biaya transaksi untuk backtest yang lebih realistis.

  4. Masukkan filter kuantitatif, pasang filter seperti volume breakout, MACD histogram gap untuk menghindari breakout palsu.

  5. Mengoptimalkan stop. Mengevaluasi tingkat stop loss yang berbeda dan metode stop trailing untuk menemukan stop yang optimal.

  6. Jalankan strategi yang dioptimalkan langsung untuk merekam kinerja untuk perbaikan lebih lanjut.

Kesimpulan

Strategi ini memiliki logika yang jelas menggunakan Bollinger Bands untuk menentukan arah tren dan menangkap sinyal breakout, dengan moving average mendefinisikan tren keseluruhan. Dengan optimasi yang tepat, itu dapat menjadi tren yang stabil dan dapat diandalkan mengikuti strategi. Tetapi pertimbangan utama termasuk representatifitas backtest, filter kuantitatif, dan penyesuaian stop loss. Jika aspek ini ditangani dengan baik, strategi dapat mencapai keuntungan yang stabil dan cukup dalam perdagangan langsung.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]

len = input(40)
linear_reg = linreg(close_price, len, 0)

calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2

calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott

plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))


//
length = input(title="linear Length",  defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought",  defval=1, minval=1)
oversold = input(title="Oversold",  defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe",  defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period

fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2015)

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 // create function "within window of time"

smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev

bbr = (cierre - lower)/(upper - lower)

// plot(bbr)

// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] :  nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)

// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] :  nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1]) 
plotshape(zz,  title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)


strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY",  when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)

strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL",  when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)


Lebih banyak