Chiến lược theo dõi xu hướng của dải Bollinger thích ứng


Ngày tạo: 2023-11-16 16:35:01 sửa đổi lần cuối: 2023-11-16 16:35:01
sao chép: 1 Số nhấp chuột: 605
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi xu hướng của dải Bollinger thích ứng

Tổng quan

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

Nguyên tắc chiến lược

Chiến lược này bao gồm:

  1. Tính toán đường trung bình di chuyển thích ứng. Ở đây sử dụng chỉ số hồi quy tuyến tính để tính toán đường cong hồi quy tuyến tính trong một chu kỳ nhất định làm đường trung bình di chuyển.

  2. Tính đường lên xuống của đường Boolean. Dưới đây, sử dụng các chỉ số ATR tự điều chỉnh để tính đường băng và kết hợp với tham số ratio2 được chỉ định bởi người dùng để tính đường lên xuống của đường Boolean.

  3. Xác định thời gian mua bán. Xác định hướng xu hướng và thời gian mua bán dựa trên việc giá có phá vỡ đường Brin hay không. Khi giá từ dưới lên phá vỡ đường đi xuống, nó được coi là tín hiệu mua; Khi giá từ trên xuống phá vỡ đường đi lên, nó được coi là tín hiệu bán.

  4. Thiết lập dừng lỗ. Sử dụng số điểm dừng cố định để kiểm soát rủi ro, đồng thời sử dụng số điểm cố định trước khi theo dõi dừng lỗ để thiết lập dừng, tối đa hóa xu hướng trong khi đảm bảo lợi nhuận.

  5. Kết hợp với giai đoạn phản hồi, thiết lập thời gian bắt đầu và kết thúc phản hồi để tối ưu hóa chiến lược thử nghiệm.

Lợi thế chiến lược

  1. Thiết kế tham số thích ứng. Các đường dẫn và đường trung bình di động của đường Brink được tính toán theo cách thích ứng, cho phép chiến lược thích ứng với sự thay đổi của thị trường.

  2. Xác định đột phá rõ ràng. Sử dụng đột phá trên và dưới đường ray của kênh Brin để xác định điểm chuyển hướng, tín hiệu sinh học rõ ràng hơn.

  3. Cài đặt dừng lỗ là hợp lý. Sử dụng rủi ro kiểm soát dừng lỗ cố định, theo dõi phương thức dừng để tối đa hóa lợi nhuận theo xu hướng.

  4. Phản hồi xác minh hiệu quả. Thiết lập thời gian phản hồi để xác minh chiến lược và đảm bảo rằng nó cũng có hiệu quả trong bối cảnh lịch sử.

  5. Dễ dàng thực hiện. Chiến lược được thiết kế rõ ràng và dễ hiểu, mã cũng đơn giản hơn, dễ hiểu và hoạt động trên thực tế.

Rủi ro chiến lược

  1. Các kênh Brin cần được tối ưu hóa các tham số. Dải kênh và chu kỳ quay trở lại của kênh Brin cần được tối ưu hóa cho các giống và môi trường thị trường khác nhau. Nếu không được tối ưu hóa đúng cách, sẽ có nhiều tín hiệu bị lỗi hoặc các kích hoạt sai thường xuyên.

  2. Thời gian phản hồi có thể không đầy đủ. Việc phản hồi chỉ đặt phạm vi phản hồi gần đây, không thể bao gồm các hoạt động lịch sử lâu hơn để xác minh đầy đủ sự ổn định của chiến lược.

  3. Có thể có nguy cơ quá phù hợp. Các tham số đo lường lại hiện tại có thể chỉ được tối ưu hóa cho một tình huống cụ thể gần đây, do đó có nguy cơ quá phù hợp với lịch sử.

  4. Số điểm dừng cần được đánh giá để xác định. Số điểm dừng hiện tại là nhỏ, có thể quá nhạy cảm và bị cắt giảm bởi các cú sốc nhỏ. Số điểm dừng thích hợp cần được đánh giá.

  5. Thiếu các chỉ số xác minh định lượng. Hiện tại chỉ đánh giá tín hiệu giao dịch từ đột phá đồ họa, không có các chỉ số định lượng để xác minh hiệu quả của tín hiệu.

Hướng tối ưu hóa chiến lược

  1. Thêm nhiều chỉ số thích ứng. Có thể thử nghiệm các kết hợp của các chỉ số đường trung bình thích ứng, đường dẫn thích ứng, xây dựng chiến lược theo dõi xu hướng mạnh mẽ hơn.

  2. Thiết lập tham số tối ưu hóa. Các phương pháp hệ thống hơn như thuật toán di truyền có thể tìm ra sự kết hợp tối ưu nhất của các tham số đường Boolean và đường trung bình.

  3. Mở rộng phạm vi thời gian phản hồi. Mở rộng phạm vi thời gian phản hồi, kiểm tra tính ổn định của các tham số được tối ưu hóa.

  4. Lập các quy tắc lọc định lượng. Thiết lập các quy tắc chỉ số định lượng như khối lượng giao dịch vượt qua, khoảng cách cột MACD, để tránh tín hiệu phá vỡ đường Boolean sai.

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

  6. Xác minh thực tế. Chạy chiến lược tối ưu hóa trong thực tế, ghi lại trường hợp thu hồi lợi nhuận, tiếp tục hoàn thiện tính ổn định và độ tin cậy của chiến lược.

Tóm tắt

Chiến lược này có tư duy tổng thể rõ ràng, sử dụng đường Boolean để xác định hướng xu hướng và bắt tín hiệu đột phá, và được hỗ trợ bằng đường trung bình di chuyển để xác định hướng xu hướng tổng thể. Với một số tối ưu hóa, nó có thể trở thành một chiến lược theo dõi xu hướng ổn định và đáng tin cậy hơn. Tuy nhiên, vẫn cần chú ý đến sự đại diện của phạm vi thời gian đo đạc, giới thiệu quy tắc lọc định lượng và nắm bắt mức dừng lỗ.

Mã nguồn chiến lược
/*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)