Chiến lược theo dõi xu hướng Bollinger thích nghi

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

img

Tổng quan

Chiến lược này dựa trên chỉ số Bollinger Bands, kết hợp với một đường trung bình động thích nghi, để đánh giá chính xác và theo dõi xu hướng. Bằng cách điều chỉnh các tham số một cách năng động, chiến lược có thể thích nghi với các sản phẩm và môi trường thị trường khác nhau, với sự ổn định và khả năng thích nghi mạnh mẽ.

Chiến lược logic

Chiến lược bao gồm các phần chính sau:

  1. Sử dụng chỉ số hồi quy tuyến tính để tính đường cong hồi quy tuyến tính trong một khoảng thời gian nhất định như trung bình di chuyển.

  2. Sử dụng chỉ số ATR thích nghi để tính các dải, kết hợp với tham số ratio2 được chỉ định bởi người dùng, để có được các dải trên và dưới.

  3. Xác định bước vào và bước ra. Xác định hướng xu hướng và bước vào / bước ra dựa trên giá phá vỡ qua Bollinger Bands. Bước qua các tín hiệu dải trên bán bước vào trong khi bước qua các tín hiệu dải dưới mua bước vào.

  4. Sử dụng điểm dừng lỗ cố định để kiểm soát rủi ro và dừng lợi nhuận để tối đa hóa lợi nhuận xu hướng.

  5. Kết hợp với cửa sổ thời gian backtesting để tối ưu hóa và xác minh chiến lược.

Ưu điểm

  1. Các thông số thích nghi. Định hình đường trung bình động và dải thích nghi với những thay đổi của thị trường.

  2. Bollinger Bands breakout cung cấp các tín hiệu chuyển hướng rõ ràng.

  3. Đặt dừng hợp lý. Đặt dừng lỗ cố định kiểm soát rủi ro và dừng lợi nhuận theo dõi nhằm tối đa hóa lợi nhuận xu hướng.

  4. Được xác nhận bằng cách kiểm tra lại.

  5. Dễ hiểu và thực hiện. Logic là rõ ràng và mã là ngắn gọn để dễ hiểu.

Rủi ro

  1. Bollinger Bands cần điều chỉnh các tham số. Chiều rộng và thời gian băng tần có thể cần tối ưu hóa cho các sản phẩm khác nhau. Các tham số không chính xác dẫn đến tín hiệu bị thiếu hoặc kích hoạt sai.

  2. Thời gian backtest hạn chế. Phạm vi backtest gần đây có thể không đủ để xác minh đầy đủ tính ổn định trên các dữ liệu lịch sử toàn diện.

  3. Rủi ro quá phù hợp: Các thông số tối ưu hiện tại có thể quá phù hợp với các điều kiện thị trường cụ thể gần đây.

  4. Mức dừng lỗ cần được đánh giá. Mức dừng lỗ nhỏ có thể quá nhạy cảm và bị dừng bởi các biến động nhỏ. Mức dừng lỗ phù hợp cần được đánh giá.

  5. Thiếu xác thực có thể định lượng. Hiện tại chỉ sử dụng sự đột phá đồ họa cho các tín hiệu giao dịch mà không có xác nhận số liệu có thể định lượng.

Hướng dẫn cải thiện

  1. Giới thiệu các chỉ số thích nghi hơn. Kiểm tra sự kết hợp của các trung bình và kênh chuyển động thích nghi khác nhau để xây dựng hệ thống theo dõi xu hướng mạnh mẽ.

  2. Sử dụng các phương pháp có hệ thống hơn như thuật toán di truyền để tìm kết hợp các tham số tối ưu.

  3. Mở rộng thời gian backtest. Thử nghiệm trên dữ liệu lịch sử rộng hơn để kiểm tra sự ổn định của tham số. Bao gồm chi phí giao dịch để backtest thực tế hơn.

  4. Thiết lập các bộ lọc định lượng như volume breakout, MACD histogram gap để tránh breakout sai.

  5. Tối ưu hóa dừng. Đánh giá các mức dừng lỗ cố định khác nhau và các phương pháp dừng theo dõi để tìm dừng tối ưu.

  6. Thực hiện chiến lược tối ưu hóa trực tiếp để ghi lại hiệu suất để cải thiện hơn nữa.

Kết luận

Chiến lược này có logic rõ ràng bằng cách sử dụng Bollinger Bands để xác định hướng xu hướng và nắm bắt các tín hiệu đột phá, với đường trung bình động xác định xu hướng tổng thể. Với tối ưu hóa thích hợp, nó có thể trở thành một xu hướng ổn định và đáng tin cậy sau chiến lược. Nhưng các cân nhắc chính bao gồm khả năng đại diện backtest, bộ lọc định lượng và điều chỉnh dừng lỗ. Nếu các khía cạnh này được xử lý tốt, chiến lược có thể đạt được lợi nhuận ổn định và đáng kể trong giao dịch trực tiếp.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]

len = input(40)
linear_reg = linreg(close_price, len, 0)

calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2

calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott

plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))


//
length = input(title="linear Length",  defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought",  defval=1, minval=1)
oversold = input(title="Oversold",  defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe",  defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period

fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2015)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev

bbr = (cierre - lower)/(upper - lower)

// plot(bbr)

// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] :  nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)

// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] :  nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1]) 
plotshape(zz,  title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)


strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY",  when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)

strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL",  when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)


Thêm nữa