Strategi pencocokan rata-rata bergerak ganda berdasarkan Bollinger Bands

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

img

Gambaran umum

Strategi pencocokan rata-rata bergerak ganda berdasarkan Bollinger Bands adalah strategi trend-mengikuti yang berjalan dengan harga dan volume di pasar.

Prinsip Strategi

Strategi ini terutama didasarkan pada sinyal crossover dari indikator Bollinger Bands dan indikator rata-rata bergerak untuk perdagangan. Secara khusus, ini menggunakan rel tengah, rel atas Bollinger Bands, dan 7 rata-rata bergerak dengan panjang dari 5 hingga 200 hari pada saat yang sama. Ini menghasilkan sinyal beli ketika harga menembus rel tengah dan bawah Bollinger Bands dari bawah ke atas; ini menghasilkan sinyal jual ketika harga menembus rel atas Bollinger Bands dari atas ke bawah untuk mencapai tren berikut.

Selain itu, strategi ini juga memperkenalkan indikator moveToFract untuk menilai posisi panjang dan pendek. Indikator ini menentukan apakah tren pasar saat ini naik atau turun dengan menghitung urutan pengaturan rata-rata bergerak jangka pendek dan jangka panjang, sehingga menghindari menghasilkan sinyal yang salah di pasar yang terikat rentang. Akhirnya, dikombinasikan dengan aturan stop profit dan stop loss yang dapat dikonfigurasi, indikator ini membentuk tren yang lebih lengkap setelah strategi perdagangan.

Analisis Keuntungan

  1. Konfigurasi yang fleksibel yang dapat menyesuaikan kombinasi parameter sesuai dengan lingkungan pasar yang berbeda
  2. Menggabungkan dua indikator yang berbeda sebagai filter dapat mengurangi sinyal yang salah
  3. Indikator penilaian tren dapat menghindari operasi terbalik di pasar yang tidak stabil
  4. Pelacakan pengaturan stop loss memaksimalkan keuntungan

Analisis Risiko

  1. Parameter harus disesuaikan dengan tepat agar sesuai dengan siklus jangka waktu yang berbeda untuk menghindari perdagangan yang berlebihan
  2. Pelacakan stop loss dapat memperluas kerugian dalam penurunan yang cepat
  3. Harus memastikan dana yang cukup, jika tidak tidak mampu menahan risiko kerugian berkelanjutan

Arahan Optimasi

  1. Tambahkan golden cross dan death cross penghakiman untuk lebih mengoptimalkan
  2. Berbagai varietas memiliki parameter yang berbeda, pertimbangkan pembelajaran mesin untuk parameter optimal
  3. Gabungkan dengan indeks volatilitas untuk menentukan volatilitas tren dan memperkuat kontrol risiko

Kesimpulan

Secara umum, ini adalah strategi trend following yang sangat praktis. Ini menggunakan crossover indikator untuk pengambilan keputusan, dan juga menggabungkan modul penilaian tren untuk secara efektif menyaring sinyal yang salah. Setelah mengkonfigurasi stop profit dan stop loss, ini dapat sepenuhnya mengikuti tren untuk perdagangan dan mendapatkan pengembalian yang baik. Dengan menyesuaikan kombinasi parameter dan menambahkan lebih banyak filter, strategi ini dapat lebih dioptimalkan untuk beradaptasi dengan lebih banyak lingkungan pasar, dan memiliki ruang yang luas untuk perbaikan 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 banyak