Chiến lược theo dõi Bollinger của Noro

Tác giả:ChaoZhang, Ngày: 2023-11-28 16:57:28
Tags:

img

Tổng quan

Đây là một chiến lược theo dõi đà dựa trên Bollinger Bands. Nó kết hợp Bollinger Bands để đánh giá xu hướng thị trường và điểm đảo ngược, và đặt các vị trí dài và ngắn để theo dõi biến động thị trường.

Nguyên tắc

Chỉ số cốt lõi của chiến lược này là Bollinger Bands, bao gồm dải giữa, dải trên và dải dưới. Dải giữa là trung bình động của n ngày, và dải trên và dải dưới là sự thay đổi của dải giữa cộng/từ độ lệch chuẩn. Khi giá tiếp cận dải trên/dải dưới, nó được coi là một tín hiệu mua quá mức/bán quá mức. Chiến lược kết hợp độ lệch xu hướng làm cơ sở cho các vị trí mở, tức là mở các vị trí khi giá vượt qua dải giữa theo hướng ngược lại. Để ngăn ngừa tổn thất gây ra bởi các đột phá sai, chiến lược yêu cầu chiều rộng của đột phá lớn hơn mức trung bình. Điều kiện đóng là giá quay trở lại sau khi vượt qua dải giữa.

Chiến lược này cũng bao gồm cả các mục nhập theo xu hướng và các mục nhập đảo ngược trung bình, tương ứng với các cơ hội giao dịch khác nhau. Các mục nhập theo xu hướng yêu cầu dải giữa là tham chiếu hỗ trợ / kháng cự và tạo ra các bước thoát lệch. Các mục nhập đảo ngược trung bình đảo ngược trực tiếp gần các dải Bollinger trên / dưới. Chiến lược kết hợp hai loại tín hiệu này và có thể thực hiện cả hoạt động theo dõi xu hướng và đảo ngược.

Phân tích lợi thế

Chiến lược này kết hợp các đặc điểm mua quá mức / bán quá mức của Bollinger Bands với phán đoán điểm đảo ngược. Điều này cho phép nó áp dụng cho cả thị trường xu hướng và dao động, nắm bắt các loại cơ hội giao dịch khác nhau. Cài đặt thoát lỗ dừng ngăn chặn lỗ mở rộng. Ngoài ra, khả năng giao dịch cả dài và ngắn làm tăng khả năng áp dụng của chiến lược.

So với các chiến lược Bollinger đơn giản, logic xu hướng bổ sung làm cho các mục nhập của chiến lược này ổn định hơn, và nó cũng nắm bắt các cơ hội đảo ngược. Điều này cải thiện tỷ lệ tín hiệu-đồn. Ngoài ra, giao dịch cả hai hướng sử dụng các cơ hội giao dịch đầy đủ hơn trên các tình huống thị trường khác nhau.

Phân tích rủi ro

Chiến lược này chủ yếu dựa trên các đặc điểm mua quá mức / bán quá mức của Bollinger Bands. Vì vậy, khi có biến động giá cực đoan, chiều rộng của Bollinger Bands tiếp tục mở rộng, điều này có thể dễ dàng dẫn đến nhiều giao dịch thua lỗ. Đây là một điểm rủi ro tiềm ẩn. Ngoài ra, vẫn có một số sự không chắc chắn và lỗi trong các phán quyết đảo ngược, gây ra các mục nhập và dừng thất bại.

Đối với sự thất bại của Bollinger Bands, chúng ta có thể rút ngắn tham số n để làm cho các dải nhạy cảm hơn, hoặc giảm chiều rộng dải để giảm khả năng mất mát.

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

Các hướng chính để tối ưu hóa chiến lược này bao gồm:

  1. Các thông số của Bollinger Bands có thể được điều chỉnh theo các thị trường khác nhau để tìm sự kết hợp tối ưu.
  2. Lượng độ lệch và tính toán giá trị trung bình có thể được kiểm tra bằng các tùy chọn khác.
  3. Thêm thêm các bộ lọc để đánh giá tín hiệu vào và giảm dương tính giả.
  4. Kiểm tra các phương pháp dừng lỗ khác như dừng lỗ đường mòn.
  5. Các thông số có thể được tối ưu hóa theo các sản phẩm và khung thời gian cụ thể.

Kết luận

Chiến lược này làm cho việc mở rộng và tối ưu hóa hiệu quả cho các chiến lược Bollinger tiêu chuẩn. Sự lệch xu hướng bổ sung cải thiện sự ổn định và sử dụng các cơ hội đảo ngược tốt. Khả năng giao dịch cả hai hướng và dừng lỗ cũng làm cho chiến lược mạnh mẽ hơn. Những cải tiến hơn nữa có thể đạt được thông qua tối ưu hóa tham số và thêm nhiều bộ lọc.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy("Noro's Bollinger Strategy v1.3", shorttitle = "Bollinger str 1.3", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 5)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")

length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length")
mult = input(2.0, defval = 2.0, minval = 0.001, maxval = 50, title = "Bollinger Mult")
source = input(ohlc4, defval = ohlc4, title = "Bollinger Source")

uset = input(true, defval = true, title = "Use trend entry")
usect = input(true, defval = true, title = "Use counter-trend entry")

fromyear = input(2018, defval = 2018, 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
body = abs(close - open)
abody = ema(body, 30)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0 
up1 = bar == -1 and ohlc4 >= basis and ohlc4 < upper and (close < strategy.position_avg_price or strategy.position_size == 0) and uset
dn1 = bar == 1 and ohlc4 <= basis and ohlc4 > lower and (close > strategy.position_avg_price or strategy.position_size == 0) and uset
up2 = close <= lower and usect
dn2 = close >= upper and usect
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2

//Trading
if up1 or up2
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Thêm nữa