Chiến lược giao dịch nhiều khung thời gian với các dải Bollinger

Tác giả:ChaoZhang, Ngày: 2023-09-20 15:47:46
Tags:

Tổng quan

Chiến lược này sử dụng Bollinger Bands thích nghi để thiết kế hai loại chiến lược trailing stop và kiểm tra lại chúng một cách có hệ thống trên các khung thời gian.

Chiến lược logic

  1. Tính toán các dải trên và dưới của Dải Bollinger thích nghi, với chiều rộng kênh điều chỉnh.

  2. Chiến lược theo dõi đột phá để mở các vị trí trên các đột phá dải và dừng lại khi giá quay trở lại bên trong dải.

  3. Chiến lược đảo ngược đảo ngược để mở các vị trí khi giá đạt đến các dải và dừng lại khi giá quay trở lại bên trong dải.

  4. Sử dụng chỉ số CCI để hỗ trợ xác định mặt dài / ngắn.

  5. Kiểm tra ngược qua nhiều khung thời gian để xác minh tính khả thi của cả hai chiến lược.

Ưu điểm

  1. Bollinger Bands trực quan trong việc nắm bắt xu hướng giá.

  2. Hai chiến lược phù hợp với các điều kiện thị trường khác nhau cho sự vững chắc.

  3. CCI giúp xác định hướng dài / ngắn.

  4. Kiểm tra ngược nhiều khung thời gian làm cho kết quả thuyết phục hơn.

  5. Quy tắc chiến lược đơn giản và rõ ràng dễ thực hiện.

Rủi ro

  1. Bollinger Bands có thể thất bại trong một số tình huống.

  2. Nguy cơ ngừng sớm hoặc muộn trong cả hai chiến lược.

  3. CCI có thể tạo ra tín hiệu không chính xác.

  4. Hãy cẩn thận xử lý những sai lệch trong backtest.

  5. Tối ưu hóa có nguy cơ quá phù hợp.

Tăng cường

  1. Kiểm tra các thông số để tìm kết hợp tối ưu.

  2. Đánh giá việc thêm các bộ lọc với các chỉ số khác.

  3. Tối ưu hóa dừng để giảm rủi ro.

  4. Nghiên cứu các phương pháp thích nghi cho chiều rộng kênh.

  5. Kiểm tra với nhiều biểu tượng và khung thời gian hơn.

  6. Sử dụng máy học để tối ưu hóa các tham số một cách năng động.

Kết luận

Chiến lược này thiết kế hai chiến lược dừng lại dựa trên Bollinger Bands và kiểm tra lại chúng trên nhiều khung thời gian.


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

//@version=4
strategy(title = "Underworld Hunter", overlay=true)

len = input(75, minval=1, title="Length")
src = input(close, title="Source")
basis = 0.0
basis := na(basis[1]) ? sma(src, len) : ema(ema(ema(src,len),len),len)

mult = input(1.9, minval=0.001, maxval=50, title="Deviation")
dev = mult * stdev(src, len)
upper = basis + dev
lower = basis - dev

//CCI calculation and inputs

lengthcci = input(20, minval=1, title="Period for CCI")
ma = sma(close, lengthcci)
ccivalue = (src - ma) / (0.015 * dev(src, lengthcci))

//CCI plotting

cciover0 = ccivalue >= 100 and ccivalue <= 120
cciover1 = ccivalue > 120 and ccivalue <= 140
cciover2 = ccivalue > 140 and ccivalue <= 160
cciover3 = ccivalue > 160 and ccivalue <= 180
cciover4 = ccivalue > 180

cciunder0 = ccivalue <= -100 and ccivalue >= -120
cciunder1 = ccivalue <= -120 and ccivalue > -140
cciunder2 = ccivalue <= -140 and ccivalue > -160
cciunder3 = ccivalue <= -160 and ccivalue > -180
cciunder4 = ccivalue <= -180

plotshape(cciover0, title="CCIO0", location=location.abovebar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder0, title="CCIU0", location=location.belowbar, color=#c6ff1a, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover1, title="CCIO1", location=location.abovebar, color=#ffff00, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder1, title="CCIU1", location=location.belowbar, color=#ffff00, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover2, title="CCIO2", location=location.abovebar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder2, title="CCIU2", location=location.belowbar, color=#ff9900, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover3, title="CCIO3", location=location.abovebar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciunder3, title="CCIU3", location=location.belowbar, color=#ff0000, transp=0, style=shape.circle, size=size.tiny)
plotshape(cciover4, title="CCIO4", location=location.abovebar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)
plotshape(cciunder4, title="CCIU4", location=location.belowbar, color=#cc00cc, transp=0,style=shape.circle, size=size.tiny)

//plotting

plot(upper, title="Upper shadow", color=color.black, transp = 30, linewidth = 4)
plot(upper, title="Upper line", color=#FF2E00, transp = 0, linewidth = 2)
plot(lower, title="Lower shadow", color=color.black, transp = 30, linewidth = 4)
plot(lower, title="Lower line", color=#FF2E00, transp = 0, linewidth = 2)
plot(basis, title="Basic line", color=color.red, transp = 50, linewidth = 2)

mean = input(title="Test Reverse to the Mean instead", type=input.bool, defval=false)
test = input(title="Enable testing", type=input.bool, defval=true)

ordersize=floor(50000/close)

if(close>upper and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Up", strategy.long, ordersize)
if (close<upper and close[1]<upper and close[2]<upper)
    strategy.close("Hunt Up", qty_percent = 100, comment = "Hunt End")

if(close<lower and strategy.opentrades==0 and not mean and test)
    strategy.entry("Hunt Down", strategy.short, ordersize)
if (close>lower and close[1]>lower and close[2]>lower)
    strategy.close("Hunt Down", qty_percent = 100, comment = "Hunt End")

//bounce of bands

if(close>upper and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Down", strategy.short, ordersize)
if (close<upper and close[1]<upper and close[2]<upper and close>high[1])
    strategy.close("Sneak Down", qty_percent = 100, comment = "SneakEnd")

if(close<lower and strategy.opentrades==0 and mean and test)
    strategy.entry("Sneak Up", strategy.long, ordersize)
if (close>lower and close[1]>lower and close[2]>lower and close<low[1])
    strategy.close("Sneak Up", qty_percent = 100, comment = "Sneak End")




Thêm nữa