Strategi Bollinger Bands Berbilang Purata Bergerak

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

img

Ringkasan

Strategi ini membina Bollinger Bands dengan pelbagai jenis purata bergerak sebagai input untuk menemui lebih banyak peluang perdagangan.

Logika Strategi

Inti strategi ini terletak pada menggunakan jenis purata bergerak yang dipilih oleh input pengguna, termasuk SMA, EMA, WMA, DEMA, TMA, VAR, WWMA, ZLEMA, TSF, HULL, TILL dan lain-lain, 12 secara keseluruhan, digabungkan dengan Bollinger Bands untuk membentuk isyarat dagangan. Band tengah Bollinger Bands mengadopsi purata bergerak yang dipilih, sementara band atas dan bawah adalah satu penyimpangan standard positif / negatif dari band tengah. Pendek apabila harga memecahkan band atas, panjang apabila harga memecahkan band bawah. Dengan menggabungkan pelbagai jenis purata bergerak, parameter dapat dioptimumkan untuk isyarat dagangan yang lebih stabil dan tepat.

Komponen utama kod adalah:

  1. Fungsi pengiraan untuk 12 jenis purata bergerak, termasuk SMA, EMA, WMA dll.
  2. Fungsi getMA mengembalikan purata bergerak yang sepadan berdasarkan parameter input mav.
  3. Pengiraan band tengah, atas dan bawah Bollinger Bands. Band tengah menggunakan purata bergerak dari fungsi getMA.
  4. Merangka Bollinger Bands.
  5. Generasi isyarat panjang dan pendek. pergi panjang apabila harga pecah di bawah band bawah, pergi pendek apabila harga pecah di atas band atas.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah menyediakan pelbagai jenis purata bergerak. persekitaran pasaran yang berbeza sesuai dengan purata bergerak yang berbeza dari segi kepekaan tindak balas. Mengadopsi pelbagai jenis purata bergerak sangat meningkatkan kebolehsesuaian strategi. Di samping itu, strategi ini membolehkan pengoptimuman parameter untuk panjang purata bergerak, untuk mencari kombinasi yang optimum dan dengan itu mendapatkan isyarat perdagangan yang lebih tepat.

Analisis Risiko

Risiko utama strategi ini terletak pada isyarat huru-hara dari purata bergerak itu sendiri, dengan kemungkinan pelbagai pecah palsu. Juga, penunjuk Bollinger Bands agak sensitif terhadap turun naik harga liar, yang menjadikannya sukar bagi jalur tengah untuk mengesan harga dengan berkesan. Ini memerlukan jenis purata bergerak yang lebih stabil untuk digunakan, bersama-sama dengan penyesuaian parameter yang betul.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dari aspek berikut:

  1. Uji gabungan purata bergerak yang berbeza untuk mencari parameter optimum untuk meningkatkan kestabilan isyarat.
  2. Tambah mekanisme stop loss untuk mengehadkan kerugian daripada isyarat buruk sesekali.
  3. Masukkan penunjuk lain untuk penapisan isyarat, mengelakkan perdagangan berlebihan, contohnya MACD, KD dll.
  4. Mengoptimumkan pengurusan wang, menyesuaikan saiz kedudukan.

Kesimpulan

Strategi ini agak inovatif secara keseluruhan, memperkaya penunjuk Bollinger Bands dengan aplikasi yang lebih canggih. Dengan menyesuaikan purata bergerak gabungan, isyarat yang lebih tepat dan stabil boleh diperoleh. Ia juga membuka idea baru untuk mengoptimumkan strategi Bollinger Bands. Dengan penyesuaian parameter dan pengoptimuman, strategi ini boleh menjadi alat perdagangan yang sangat praktikal.


/*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 lanjut