Strategi Multiple Moving Average Bollinger Bands

Penulis:ChaoZhang, Tanggal: 2024-02-06 15:08:26
Tag:

img

Gambaran umum

Strategi ini membangun Bollinger Bands dengan berbagai jenis moving average sebagai input untuk menemukan lebih banyak peluang trading.

Logika Strategi

Inti dari strategi ini terletak pada penggunaan jenis rata-rata bergerak yang dipilih oleh input pengguna, termasuk SMA, EMA, WMA, DEMA, TMA, VAR, WWMA, ZLEMA, TSF, HULL, TILL dll, total 12, dikombinasikan dengan Bollinger Bands untuk membentuk sinyal perdagangan. Band tengah Bollinger Bands mengadopsi rata-rata bergerak yang dipilih, sementara band atas dan bawah adalah satu deviasi standar positif / negatif dari band tengah. Pendek ketika harga melanggar band atas, panjang ketika harga melanggar band bawah. Dengan menggabungkan berbagai jenis rata-rata bergerak, parameter dapat dioptimalkan untuk sinyal perdagangan yang lebih stabil dan akurat.

Komponen utama kode adalah:

  1. Fungsi perhitungan untuk 12 jenis rata-rata bergerak, termasuk SMA, EMA, WMA dll.
  2. Fungsi getMA mengembalikan rata-rata bergerak yang sesuai berdasarkan parameter input mav.
  3. Perhitungan band tengah, atas dan bawah Bollinger Bands. Band tengah menggunakan moving average dari fungsi getMA.
  4. Menggambar Bollinger Bands.
  5. Generasi sinyal panjang dan pendek. pergi panjang ketika harga melanggar band bawah, pergi pendek ketika harga melanggar band atas.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah menyediakan beberapa jenis rata-rata bergerak. Lingkungan pasar yang berbeda sesuai dengan rata-rata bergerak yang berbeda dalam hal sensitivitas reaksi. Mengadopsi beberapa jenis rata-rata bergerak sangat meningkatkan kemampuan beradaptasi strategi. Selain itu, strategi ini memungkinkan optimasi parameter untuk panjang rata-rata bergerak, untuk menemukan kombinasi yang optimal dan dengan demikian mendapatkan sinyal perdagangan yang lebih akurat.

Analisis Risiko

Risiko utama dari strategi ini terletak pada sinyal kacau dari rata-rata bergerak sendiri, dengan kemungkinan beberapa false breakout. Juga, indikator Bollinger Bands cukup sensitif terhadap perubahan harga liar, sehingga sulit bagi band tengah untuk melacak harga secara efektif. Ini membutuhkan jenis rata-rata bergerak yang lebih stabil untuk digunakan, bersama dengan penyesuaian parameter yang tepat.

Arahan Optimasi

Strategi dapat dioptimalkan dari aspek berikut:

  1. Uji kombinasi rata-rata bergerak yang berbeda untuk menemukan parameter optimal untuk meningkatkan stabilitas sinyal.
  2. Tambahkan mekanisme stop loss untuk membatasi kerugian dari sinyal buruk sesekali.
  3. Masukkan indikator lain untuk penyaringan sinyal, menghindari perdagangan berlebihan, misalnya MACD, KD dll.
  4. Mengoptimalkan manajemen uang, menyesuaikan ukuran posisi.

Kesimpulan

Strategi ini cukup inovatif secara keseluruhan, memperkaya indikator Bollinger Bands dengan aplikasi yang lebih canggih. Dengan menyesuaikan rata-rata bergerak yang dikombinasikan, sinyal yang lebih akurat dan stabil dapat diperoleh. Ini juga membuka ide-ide baru untuk mengoptimalkan strategi Bollinger Bands.


/*backtest
start: 2023-01-30 00:00:00
end: 2023-10-13 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Bollinger Bands Strategy (MA type)", overlay=true)
src = input(close, title="Source")
length = input(20,step=10, minval=1)
mult = input(1,type=input.float, minval=0.001, maxval=50, title="StdDev")

length1=input(26, "Long Moving Average Length", minval=1)
length2=input(9, "Trigger Length", minval=1)
T3a1 = input(0.7, "TILLSON T3 Volume Factor", step=0.1)
////////////
mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL"])
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
DEMA = ( 2 * ema(src,length)) - (ema(ema(src,length),length) )
Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
    zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
    lrc = linreg(src, length, 0)
    lrc1 = linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
HMA = wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
T3e1=ema(src, length)
T3e2=ema(T3e1,length)
T3e3=ema(T3e2,length)
T3e4=ema(T3e3,length)
T3e5=ema(T3e4,length)
T3e6=ema(T3e5,length)
T3c1=-T3a1*T3a1*T3a1
T3c2=3*T3a1*T3a1+3*T3a1*T3a1*T3a1
T3c3=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1
T3c4=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1
T3=T3c1*T3e6+T3c2*T3e5+T3c3*T3e4+T3c4*T3e3


getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "DEMA"
        ma := DEMA
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma

    if mav == "HULL"
        ma := HMA
        ma

    if mav == "TILL"
        ma := T3
        ma
    ma
    
//////////
basis = getMA(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input(0, "Offset",minval = -500, maxval = 500)
plot(basis, "Basis",color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
/////////
buyEntry = crossover(src, lower)
sellEntry = crossunder(src, upper)
if (crossover(src, lower))
	strategy.entry("BBandLE", strategy.long, stop=lower, oca_name="BollingerBands",  comment="BBandLE")
else
	strategy.cancel(id="BBandLE")
if (crossunder(src, upper))
	strategy.entry("BBandSE", strategy.short, stop=upper, oca_name="BollingerBands",  comment="BBandSE")
else
	strategy.cancel(id="BBandSE")
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Lebih banyak