Strategi pencocokan purata bergerak berganda berdasarkan Bollinger Bands

Penulis:ChaoZhang, Tarikh: 2023-11-24 15:32:57
Tag:

img

Ringkasan

Strategi pencocokan purata bergerak berganda berdasarkan Bollinger Bands adalah strategi trend-mengikuti yang berjalan dengan harga dan jumlah di pasaran. Ia menggunakan persilangan Bollinger Bands dan purata bergerak sebagai isyarat perdagangan untuk melaksanakan strategi kuantitatif yang dapat mengenal pasti trend pasaran secara automatik dan berdagang dengan peraturan berhenti keuntungan dan berhenti kerugian.

Prinsip Strategi

Strategi ini terutamanya berdasarkan isyarat silang penunjuk Bollinger Bands dan isyarat purata bergerak untuk perdagangan. Khususnya, ia menggunakan rel tengah, rel atas Bollinger Bands, dan 7 purata bergerak dengan panjang dari 5 hingga 200 hari pada masa yang sama. Ia menghasilkan isyarat beli apabila harga memecahkan rel tengah dan bawah Bollinger Bands dari bawah ke atas; ia menghasilkan isyarat jual apabila harga memecahkan rel atas Bollinger Bands dari atas ke bawah untuk mencapai trend berikut.

Di samping itu, strategi ini juga memperkenalkan penunjuk moveToFract untuk menilai kedudukan panjang dan pendek. Penunjuk ini menentukan sama ada trend pasaran semasa naik atau turun dengan mengira urutan susunan purata bergerak jangka pendek dan jangka panjang, dengan itu mengelakkan menghasilkan isyarat yang salah di pasaran terhad julat. Akhirnya, digabungkan dengan peraturan stop profit dan stop loss yang boleh dikonfigurasikan, ia membentuk trend yang lebih lengkap mengikuti strategi perdagangan.

Analisis Kelebihan

  1. Konfigurasi yang fleksibel yang boleh menyesuaikan kombinasi parameter untuk memenuhi persekitaran pasaran yang berbeza
  2. Menggabungkan dua penunjuk yang berbeza sebagai penapis boleh mengurangkan isyarat yang salah
  3. Indikator penilaian trend boleh mengelakkan operasi terbalik di pasaran yang tidak menentu
  4. Mengesan tetapan stop loss memaksimumkan keuntungan

Analisis Risiko

  1. Parameter harus diselaraskan dengan sewajarnya untuk menyesuaikan kitaran jangka masa yang berbeza untuk mengelakkan perdagangan berlebihan
  2. Pengesanan stop loss boleh meningkatkan kerugian dalam penurunan pesat
  3. Harus memastikan dana yang mencukupi, jika tidak tidak dapat menahan risiko kerugian berterusan

Arahan pengoptimuman

  1. Tambah golden cross dan kematian cross penghakiman untuk mengoptimumkan lebih lanjut
  2. Varieti yang berbeza mempunyai parameter yang berbeza, pertimbangkan pembelajaran mesin untuk parameter optimum
  3. Gabungkan dengan indeks turun naik untuk menentukan turun naik trend dan mengukuhkan kawalan risiko

Kesimpulan

Secara umum, ini adalah strategi trend berikut yang sangat praktikal. Ia menggunakan crossover penunjuk untuk membuat keputusan, dan juga menggabungkan modul penghakiman trend untuk menapis isyarat yang salah dengan berkesan. Setelah mengkonfigurasi stop profit dan stop loss, ia dapat mengikuti trend sepenuhnya untuk perdagangan dan memperoleh pulangan yang baik. Dengan menyesuaikan kombinasi parameter dan menambah lebih banyak penapis, strategi ini dapat dioptimumkan lagi untuk menyesuaikan diri dengan lebih banyak persekitaran pasaran, dan mempunyai ruang yang besar untuk peningkatan dan prospek aplikasi.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )




Lebih lanjut