Chiến lược tín hiệu dao động dải Bohr


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

Chiến lược tín hiệu dao động dải Bohr

Tổng quan

Chiến lược Bollinger Wave là một chiến lược giao dịch định lượng kết hợp các dải Bollinger Wave và đường trung bình di chuyển. Chiến lược này tạo ra tín hiệu giao dịch bằng cách tính toán chênh lệch tiêu chuẩn của dải Bollinger Wave và tín hiệu chéo của đường trung bình di chuyển để xác định xu hướng thị trường và khu vực quá mua quá bán.

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

Chiến lược này đầu tiên tính toán đường trung bình di chuyển chỉ số trong một chu kỳ nhất định ((EMA) làm đường chuẩn. Sau đó, dựa trên EMA này, tính toán đường lên đường ((EMA + n lần chênh lệch chuẩn) và đường xuống đường ((EMA - n lần chênh lệch chuẩn).

Khi giá nằm giữa đường lên và đường xuống, đó là khoảng dao động giá bình thường của cổ phiếu. Ngoài ra, chiến lược này kết hợp với các chỉ số khác như chỉ số RSI để lọc tín hiệu giao dịch, giảm tần suất giao dịch và giảm tổn thất không cần thiết.

Cụ thể, các quy tắc đánh giá tín hiệu giao dịch của chiến lược này như sau:

  1. Tín hiệu đa đầu: giá đóng cửa> đường lên đường và RSI ((14) > 60
  2. Tín hiệu đầu trống: giá đóng cửa < đường ray dưới và RSI ((14) <40

Khi có tín hiệu giao dịch như trên, nhập theo số lượng cố định hoặc tỷ lệ tài khoản. Khi giá trở lại phạm vi sóng hoặc có tín hiệu ngược lại, thoát khỏi vị trí.

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

Chiến lược này kết hợp sự phán đoán xu hướng và phán đoán mua bán quá mức để tránh giao dịch sai trong việc thu hồi xung đột. So với chiến lược chỉ số đơn, có thể giảm bớt vị trí mở vị trí không cần thiết và kiểm soát rủi ro hiệu quả.

So với các chiến lược trung bình di chuyển đơn giản, các dải Boolean phản ánh tốt hơn sự biến động và mức độ rủi ro của thị trường hiện tại. Các tín hiệu giao dịch được tin cậy hơn khi có dải sóng rộng hơn; tần số giao dịch sẽ tự động giảm khi có dải sóng rộng hơn. Sự điều chỉnh thích nghi này có thể điều chỉnh rủi ro theo các chiến lược kiểm soát thị trường khác nhau.

Ngoài ra, chiến lược này được xác nhận đôi bằng các chỉ số như RSI, có thể lọc ra một số tín hiệu giả và tránh giao dịch sai tại các điểm chuyển hướng. Điều này cũng làm tăng tỷ lệ chiến thắng của chiến lược.

Phân tích rủi ro

Chiến lược này có những rủi ro:

  1. Rủi ro tối ưu hóa tham số. Nếu tham số trung bình di chuyển hoặc nhân chênh lệch chuẩn được đặt không đúng cách, sẽ tạo ra nhiều giao dịch ồn ào hơn hoặc bỏ lỡ cơ hội giao dịch. Các tham số này cần được thử nghiệm và tối ưu hóa nhiều lần.

  2. Rủi ro phá vỡ tín hiệu giả. Khi giá tăng trở lại rất nhanh sau khi phá vỡ đường lên xuống ngắn hạn, sẽ tạo ra tín hiệu sai. Tại thời điểm này, giao dịch tự nhiên sẽ làm tăng lỗ.

  3. Rủi ro tần số giao dịch. Nếu khoảng cách đường lên xuống quá nhỏ, sẽ tăng số lần giao dịch và thanh toán phí xử lý. Điều này sẽ ảnh hưởng đến lợi nhuận cuối cùng.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa hơn nữa:

  1. Tăng cơ chế dừng lỗ. Thiết lập dừng di chuyển hoặc dừng thời gian, giúp dừng lỗ kịp thời, kiểm soát tổn thất đơn lẻ.

  2. Tăng quản lý vị trí. Như thiết lập các quy tắc tăng và giảm vị trí, để lợi nhuận tăng và thua lỗ giảm. Điều này có thể làm tăng tỷ lệ lợi nhuận chiến lược.

  3. Kết hợp với các chỉ số khác để lọc tín hiệu. Các chỉ số như KDJ, MACD và các chỉ số khác có thể được sử dụng như các chỉ số hỗ trợ cho các tín hiệu phán đoán. Điều này giúp nâng cao hơn nữa tỷ lệ lợi nhuận chiến lược.

  4. Tối ưu hóa thiết lập tham số. Bạn có thể sử dụng các phương pháp có hệ thống hơn như thuật toán di truyền để kiểm tra các tổ hợp tham số để tìm các thiết lập tham số tốt hơn.

Tóm tắt

Chiến lược tín hiệu dao động của Boll đã tích hợp các phán đoán xu hướng của đường trung bình di chuyển và phán đoán mua quá mức. Nó điều chỉnh tần số giao dịch theo sự thay đổi của phạm vi sóng và có thể thích ứng với các trạng thái khác nhau của thị trường. Đồng thời kết hợp với các chỉ số như RSI để lọc tín hiệu và tránh giao dịch sai. Chiến lược này xem xét cả nhu cầu theo dõi xu hướng thị trường và kiểm soát rủi ro. Với sự tối ưu hóa liên tục, chiến lược này có thể trở thành chiến lược giao dịch định lượng có lợi nhuận ổn định.

Mã nguồn chiến lược
/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@FiboBuLL

strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

src = input(close, title='Source')
length = input.int(55, minval=1, title='EMA length')  // 20 for classis Bollinger Bands SMA line (basis)


mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation')  //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)

Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type')
CC = input(true, 'Color Bars')

upper = basis + dev
lower = basis - dev

//Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc.

short = src < lower  // and rsi(close,14)<40
long = src > upper  // and rsi(close,14)>60

L1 = ta.barssince(long)
S1 = ta.barssince(short)

longSignal = L1 < S1 and not (L1 < S1)[1]
shortSignal = S1 < L1 and not (S1 < L1)[1]

//Plots and Fills


////Long/Short shapes with text
// plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true)
// plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true)  

// plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true)
// plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true)  


p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band')
p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band')

p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis')

fill(p, p1, color=color.new(color.teal, 85), title='Top Fill')  //fill for basis-upper
fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85)  //fill for basis-lower

//Barcolor

bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na

barcolor(CC ? bcol : na, editable=false, title='Color Bars')


// //Alerts ----  // Use 'Once per bar close'

// alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close'
// alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}')  // Use 'Once per bar close'

Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗')

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

// === FUNCTION EXAMPLE === 
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

if window() and (Show == 'Longs Only' or Show == 'Both')
    strategy.entry('AL', direction=strategy.long, when=longSignal)
    strategy.close('LongAL', when=shortSignal, comment='AL KAPA')

if window() and (Show == 'Shorts Only' or Show == 'Both')
    strategy.entry('SAT', direction=strategy.short, when=shortSignal)
    strategy.close('SAT', when=longSignal, comment='SAT KAPA')