Adaptive Bollinger Trend Tracking Strategi

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

img

Ringkasan

Strategi ini berdasarkan kepada penunjuk Bollinger Bands, digabungkan dengan purata bergerak adaptif, untuk menilai dan mengesan trend dengan tepat. Dengan menyesuaikan parameter secara dinamik, strategi ini dapat disesuaikan dengan produk dan persekitaran pasaran yang berbeza, dengan kestabilan dan kesesuaian yang kuat.

Logika Strategi

Strategi ini terdiri daripada bahagian utama berikut:

  1. Mengira purata bergerak adaptif Gunakan penunjuk regresi linear untuk mengira lengkung regresi linear dalam tempoh tertentu sebagai purata bergerak.

  2. Mengira Bollinger Bands. Gunakan penunjuk ATR adaptif untuk mengira band, digabungkan dengan parameter ratio2 yang ditentukan pengguna, untuk mendapatkan band atas dan bawah.

  3. Menentukan kemasukan dan keluar. Menghakimi arah trend dan kemasukan / keluar berdasarkan harga menembusi Bollinger Bands. Menembusi isyarat jalur atas menjual kemasukan sementara memecahkan isyarat jalur bawah membeli kemasukan.

  4. Tetapkan stop loss dan ambil keuntungan. Gunakan titik stop loss tetap untuk mengawal risiko dan berhenti keuntungan untuk memaksimumkan keuntungan trend.

  5. Gabungkan dengan tetingkap masa backtesting untuk pengoptimuman dan pengesahan strategi.

Kelebihan

  1. Parameter penyesuaian. Perancangan purata bergerak dan jalur penyesuaian menyesuaikan dengan perubahan pasaran.

  2. Penembusan Bollinger Bands menawarkan isyarat pembalikan trend yang jelas.

  3. Penempatan berhenti yang munasabah. Stop loss tetap mengawal risiko dan menjejaki keuntungan berhenti bertujuan untuk memaksimumkan keuntungan trend.

  4. Divalidasi oleh backtesting. Backtesting jendela mengesahkan keberkesanan strategi.

  5. Mudah difahami dan dilaksanakan. Logik jelas dan kod ringkas untuk mudah difahami.

Risiko

  1. Band Bollinger memerlukan penyesuaian parameter. Lebar band dan tempoh mungkin memerlukan pengoptimuman untuk produk yang berbeza. Parameter yang tidak betul membawa kepada isyarat yang hilang atau pencetus palsu.

  2. Tempoh backtest terhad. Julat backtest baru-baru ini mungkin tidak mencukupi untuk mengesahkan kestabilan sepenuhnya di data sejarah yang komprehensif.

  3. Risiko terlalu sesuai: Parameter yang dioptimumkan semasa mungkin terlalu sesuai dengan keadaan pasaran khusus terkini.

  4. Tahap stop loss perlu dinilai. Stop loss kecil mungkin terlalu sensitif dan dihentikan oleh turun naik kecil. keperluan stop loss yang sesuai dinilai.

  5. Kekurangan pengesahan yang boleh diukur. Pada masa ini hanya menggunakan penembusan grafik untuk isyarat perdagangan tanpa pengesahan metrik yang boleh diukur.

Arahan Penambahbaikan

  1. Memperkenalkan penunjuk yang lebih adaptif. Uji kombinasi pelbagai purata bergerak adaptif dan saluran untuk membina sistem pengesanan trend yang kukuh.

  2. Menggunakan kaedah yang lebih sistematik seperti algoritma genetik untuk mencari kombinasi parameter yang optimum.

  3. Memperluaskan tempoh backtest. Ujian pada data sejarah yang lebih luas untuk memeriksa kestabilan parameter. Menggabungkan kos transaksi untuk backtest yang lebih realistik.

  4. Memperkenalkan penapis kuantitatif. Tetapkan penapis seperti volume breakout, jurang histogram MACD untuk mengelakkan pecah palsu.

  5. Mengoptimumkan hentian. Menilai tahap hentian kehilangan tetap yang berbeza dan kaedah hentian yang menyusul untuk mencari hentian yang optimum.

  6. Jalankan strategi yang dioptimumkan secara langsung untuk merakam prestasi untuk penambahbaikan lanjut.

Kesimpulan

Strategi ini mempunyai logik yang jelas menggunakan Bollinger Bands untuk menentukan arah trend dan menangkap isyarat pecah, dengan purata bergerak menentukan trend keseluruhan. Dengan pengoptimuman yang betul, ia boleh menjadi trend yang stabil dan boleh dipercayai mengikuti strategi. Tetapi pertimbangan utama termasuk perwakilan backtest, penapis kuantitatif, dan penyesuaian stop loss. Jika aspek ini ditangani dengan baik, strategi dapat mencapai keuntungan yang stabil dan ketara 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 lanjut