Chiến lược Bollinger Bands đa đường trung bình động

Tác giả:ChaoZhang, Ngày: 2024-02-06 15:08:26
Tags:

img

Tổng quan

Chiến lược này xây dựng Bollinger Bands với các loại trung bình động khác nhau như là đầu vào để khám phá thêm các cơ hội giao dịch. Nó cung cấp 12 loại trung bình động để lựa chọn, cho phép kết hợp linh hoạt cho các thông số tối ưu.

Chiến lược logic

Cốt lõi của chiến lược này nằm trong việc sử dụng các loại trung bình động được chọn theo đầu vào của người dùng, bao gồm SMA, EMA, WMA, DEMA, TMA, VAR, WWMA, ZLEMA, TSF, HULL, TILL vv, tổng cộng 12, kết hợp với Bollinger Bands để tạo ra tín hiệu giao dịch. Dải giữa của Bollinger Bands áp dụng trung bình động được chọn, trong khi các dải trên và dưới là một sai lệch chuẩn dương / âm từ dải giữa. ngắn khi giá phá vỡ dải trên, dài khi giá phá vỡ dải dưới. Bằng cách kết hợp các loại trung bình động khác nhau, các thông số có thể được tối ưu hóa cho các tín hiệu giao dịch ổn định và chính xác hơn.

Các thành phần chính của mã là:

  1. Chức năng tính toán cho 12 loại đường trung bình động, bao gồm SMA, EMA, WMA v.v.
  2. Chức năng getMA trả về trung bình động tương ứng dựa trên tham số đầu vào mav.
  3. Tính toán giữa, trên và dưới các dải Bollinger Bands. Dải giữa sử dụng trung bình động từ hàm getMA.
  4. Kế hoạch Bollinger Bands.
  5. Đi dài khi giá phá vỡ dưới dải dưới, đi ngắn khi giá phá vỡ trên dải trên.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là cung cấp nhiều loại đường trung bình động. Môi trường thị trường khác nhau phù hợp với các đường trung bình động khác nhau về độ nhạy phản ứng. Việc áp dụng nhiều loại đường trung bình động làm tăng đáng kể khả năng thích nghi của chiến lược. Ngoài ra, chiến lược này cho phép tối ưu hóa tham số cho chiều dài của đường trung bình động, để tìm kết hợp tối ưu và do đó có được các tín hiệu giao dịch chính xác hơn.

Phân tích rủi ro

Rủi ro chính của chiến lược này nằm ở các tín hiệu hỗn loạn từ chính các đường trung bình động, với khả năng đột phá sai nhiều lần. Ngoài ra, chỉ số Bollinger Bands khá nhạy cảm với biến động giá hoang dã, khiến cho băng trung gian khó theo dõi giá hiệu quả. Điều này đòi hỏi phải sử dụng các loại đường trung bình động ổn định hơn, cùng với điều chỉnh tham số thích hợp.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa từ các khía cạnh sau:

  1. Kiểm tra các kết hợp khác nhau của các đường trung bình động để tìm các thông số tối ưu để cải thiện sự ổn định tín hiệu.
  2. Thêm các cơ chế dừng lỗ để hạn chế tổn thất từ các tín hiệu xấu đôi khi.
  3. Bao gồm các chỉ số khác để lọc tín hiệu, tránh giao dịch quá mức, ví dụ như MACD, KD vv.
  4. Tối ưu hóa quản lý tiền, điều chỉnh kích thước vị trí.

Kết luận

Chiến lược này là khá sáng tạo nói chung, làm phong phú cho chỉ số Bollinger Bands với các ứng dụng phức tạp hơn. Bằng cách điều chỉnh các đường trung bình động kết hợp, có thể có được các tín hiệu chính xác và ổn định hơn. Nó cũng mở ra những ý tưởng mới để tối ưu hóa các chiến lược Bollinger Bands. Với điều chỉnh tham số và tối ưu hóa, chiến lược này có thể trở thành một công cụ giao dịch rất thực tế.


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

Thêm nữa