Chiến lược đột phá kênh giá năng động

Tác giả:ChaoZhang, Ngày: 2023-12-13 16:03:37
Tags:

img

Tổng quan

Chiến lược Breakout kênh giá động là một chiến lược giao dịch định lượng dựa trên chỉ số kênh giá Donchian. Chiến lược đánh giá hướng xu hướng thị trường theo đường trên và dưới của kênh giá, và thiết lập các vị trí dài hoặc ngắn khi giá vượt qua kênh.

Ý tưởng chính của chiến lược này là Sử dụng sự đột phá của kênh giá Donchan. Khi giá vượt qua giới hạn trên của kênh, thiết lập một vị trí dài để tìm xu hướng; Khi giá vượt qua giới hạn dưới của kênh, thiết lập một vị trí ngắn để tìm xu hướng.

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

Tính toán chỉ số

Kênh giá được tính bằng các công thức sau:

Đường trên = Đường cao nhất trong N giai đoạn trước

Đường thấp nhất = Đường thấp nhất trong N giai đoạn qua

Đường giữa = (Đường trên + Đường dưới) / 2

N là chiều dài của chu kỳ kênh. mặc định là 50 cho chiến lược này.

Quy tắc nhập cảnh

Khi giá cao nhất của dòng K mới nhất vượt qua giới hạn trên của kênh, thiết lập một vị trí dài;

Khi giá thấp nhất của K-line mới nhất vượt qua giới hạn dưới của kênh, thiết lập một vị trí ngắn.

Ví dụ:

Điểm cao của đường K trước đó không vượt quá giới hạn trên của kênh;
Điểm cao nhất của dòng K hiện tại phá vỡ giới hạn trên của kênh; ==> Thiết lập một vị trí dài

Các quy tắc xuất cảnh

Có hai quy tắc rời khỏi tùy chọn:

  1. Khóa thoát kênh

Đóng vị trí dài: Giá dừng lỗ là giới hạn dưới của kênh;

Khóa vị trí ngắn: Giá dừng lỗ là giới hạn trên của kênh;

  1. Điểm ra đường trung tâm

Không quan trọng các vị trí dài hay ngắn, đóng tất cả các vị trí khi giá giảm xuống dưới đường trung tâm của kênh.

Kiểm soát rủi ro

Kiểm soát rủi ro sử dụng lỗ dừng tỷ lệ để tính khoảng cách dừng lỗ cụ thể dựa trên chiều rộng kênh và tỷ lệ phần trăm rủi ro chấp nhận được.

Chỉ số giá trị đầu tư (tương đương với giá trị đầu tư của các công ty)

Khoảng cách dừng lỗ ngắn = Giá nhập * (1 + Tỷ lệ rủi ro chấp nhận được)

Ví dụ, nếu rủi ro chấp nhận được đặt ở mức 2%, giá nhập là 10.000 đô la, thì đường dừng lỗ cho vị trí dài là 10.000 * (1 - 2%) = 9.800 đô la.

Phân tích lợi thế

Bắt được sự đột phá xu hướng

Khi giá vượt qua ranh giới trên và dưới của kênh, rất có thể một xu hướng hướng mới sẽ bắt đầu.

Rủi ro có thể kiểm soát được

Việc sử dụng stop loss theo tỷ lệ có thể giữ cho các lỗ đơn trong phạm vi chấp nhận được.

Không gian tối ưu hóa tham số lớn

Các thông số như chu kỳ kênh, tỷ lệ rủi ro, phương pháp dừng lỗ có thể được tối ưu hóa và kết hợp để thích nghi với nhiều môi trường thị trường hơn.

Phân tích rủi ro

Các cuộc thoát hiểm thất bại

Sự đột phá giá của các giới hạn kênh không nhất thiết phải tạo thành một xu hướng, có khả năng thất bại, có khả năng gây ra dừng lỗ.

Thị trường giới hạn phạm vi

Khi thị trường bị giới hạn trong phạm vi, giá có thể thường xuyên chạm vào giới hạn trên và dưới của kênh, dẫn đến giao dịch thường xuyên quá mức, do đó làm tăng chi phí giao dịch và tổn thất trượt.

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

Kênh động

Xem xét làm cho chiều dài của kênh giá một biến tự động điều chỉnh dựa trên biến động thị trường. Tăng chiều dài kênh khi thị trường dao động và giảm chiều dài kênh khi xu hướng rõ ràng.

Tăng cơ hội nhập học

Kết hợp các chỉ số khác để lọc thời gian nhập cảnh, chẳng hạn như chỉ số khối lượng, đường trung bình động, v.v. để tránh sự đột phá không hiệu quả trong các thị trường dao động.

Tối ưu hóa tham số

Sử dụng nhiều dữ liệu lịch sử hơn để kiểm tra và tối ưu hóa các kết hợp tham số để xác định các tham số tối ưu để thích nghi với điều kiện thị trường rộng lớn hơn.

Tóm lại

Chiến lược kênh giá động nói chung là một chiến lược theo dõi xu hướng tương đối đơn giản và trực quan. Ưu điểm của nó là tín hiệu rõ ràng và dễ hiểu; Kiểm soát rủi ro tương đối hợp lý. Nhưng vẫn còn một số vấn đề cần được tối ưu hóa hơn nữa, chẳng hạn như xử lý các vụ phá vỡ thất bại và thị trường dao động. Chiến lược này phù hợp hơn như một công cụ phụ trợ cho giao dịch xu hướng, và hiệu quả sẽ tốt hơn khi kết hợp với các chỉ số hoặc mô hình kỹ thuật khác.


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro

//@version=4
strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risklong  = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
stoptype  = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type")
lotsize   = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
pclen     = input(50, minval = 1, title = "Price Channel Length")
showll    = input(true, defval = true, title = "Show lines")
showof    = input(true, defval = true, title = "Show offset")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(false, defval = false, title = "Show background")
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")

//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2

//Stop-loss
needstop = stoptype == "Center" or needlong == false or needshort == false
sl = center

//Lines
pccol = showll ? color.black : na
slcol = showll and stoptype == "Center" ? color.red : na
offset = showof ? 1 : 0
plot(h, offset = offset, color = pccol, title = "Channel High")
plot(center, offset = offset, color = slcol, title = "Cannel Center")
plot(l, offset = offset, color = pccol, title = "Channel Low")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//Lot size
risksizelong = -1 * risklong
risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
if h > 0
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime)
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime)
sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na
if size > 0 and needstop
    strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
    strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size == 0 ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Thêm nữa