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.
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.
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 )