Chiến lược giao dịch Bollinger Band đa bộ lọc là một chiến lược giao dịch định lượng kết hợp chỉ số Bollinger Band, chỉ số trung bình động, chỉ số RSI và các tính năng đồ họa đường K để sàng lọc nhiều điều kiện để tạo ra các tín hiệu giao dịch khi các điều kiện được đáp ứng.
Chiến lược này chủ yếu sử dụng ba chỉ số: Bollinger Bands, moving average và RSI. Trong số đó, đường ray giữa của Bollinger Bands là đường trung bình di chuyển đơn giản của giá n ngày, và đường ray trên và dưới là đường ray giữa +2 độ lệch chuẩn và đường ray giữa -2 độ lệch chuẩn tương ứng. Chỉ số RSI là một giá trị từ 0 đến 100 được tính dựa trên phạm vi tăng / giảm trong một khoảng thời gian nhất định.
Chiến lược tạo ra tín hiệu giao dịch thông qua ba điều kiện chính sau:
(1) Bollinger Lower-band breakout & K-line body contradiction Khi giá đóng phá vỡ lower-band lên và màu sắc của K-line body mâu thuẫn với hướng xu hướng hiện tại, đi dài.
(2) Bollinger breakout upper-band & K-line body contradiction. Khi giá đóng phá vỡ băng trên xuống và màu sắc của K-line body mâu thuẫn với hướng xu hướng hiện tại, đi ngắn.
Nếu hướng vị trí phù hợp với sự đảo ngược màu sắc cơ thể K-line, đóng vị trí.
Ngoài ra, chiến lược cũng thiết lập các bộ lọc trung bình động, bộ lọc thân K-line, bộ lọc RSI và các điều kiện phụ khác để kiểm soát nghiêm ngặt việc nhập cảnh.
Rủi ro có thể được giảm bằng cách điều chỉnh các thông số Bollinger và kiểm soát nghiêm ngặt dừng.
Nhìn chung, chiến lược này là một chiến lược theo xu hướng trung hạn và dài hạn điển hình. Bằng cách sàng lọc nhiều điều kiện và kiểm soát chặt chẽ thời gian vào và ra với cách tiếp cận giao dịch xu hướng, nó có thể giảm giao dịch không cần thiết và nắm bắt xu hướng thị trường trung hạn và dài hạn.
/*backtest start: 2023-12-17 00:00:00 end: 2024-01-16 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=3 strategy("Noro's Bollinger Strategy v1.4", shorttitle = "Bollinger str 1.4", overlay = true ) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(false, defval = false, title = "Short") length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length") mult = input(1, defval = 1, minval = 0.001, maxval = 50, title = "Bollinger Mult") source = input(ohlc4, defval = ohlc4, title = "Bollinger Source") usebf = input(true, defval = true, title = "Use body-filter") usecf = input(true, defval = true, title = "Use color-filter") userf = input(true, defval = true, title = "Use RSI-filter") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") showbands = input(true, defval = true, title = "Show Bollinger Bands") //Bollinger Bands basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Lines col = showbands ? black : na plot(upper, linewidth = 1, color = col) plot(basis, linewidth = 1, color = col) plot(lower, linewidth = 1, color = col) //Body filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 2 or usebf == false //Color filter bar = close > open ? 1 : close < open ? -1 : 0 gb = bar == 1 or usecf == false rb = bar == -1 or usecf == false //RSI Filter fastup = rma(max(change(close), 0), 7) fastdown = rma(-min(change(close), 0), 7) rsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) ursi = rsi > 70 or userf == false drsi = rsi < 30 or userf == false //Signals up = close <= lower and rb and body and drsi and (close < strategy.position_avg_price or strategy.position_size == 0) dn = close >= upper and gb and body and ursi and (close > strategy.position_avg_price or strategy.position_size == 0) exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //Trading if up strategy.entry("Long", strategy.long, needlong == false ? 0 : na) if dn strategy.entry("Short", strategy.short, needshort == false ? 0 : na) if exit strategy.close_all()