Chiến lược phá vỡ 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 này đánh giá xu hướng thị trường dựa trên đường giới hạn trên và dưới của kênh giá, thiết lập vị trí mua hoặc bán khi giá phá vỡ kênh.
Ý tưởng chính của chiến lược này là sử dụng breakouts của kênh giá Donchan. Xây dựng một xu hướng tìm kiếm đa đầu khi giá vượt qua giới hạn trên kênh; Xây dựng một xu hướng tìm kiếm ngắn khi giá giảm xuống giới hạn dưới kênh.
Cổng giá được tính bằng công thức sau:
Đường giới hạn = giá cao nhất của N chu kỳ cao nhất
Đường giới hạn dưới = giá thấp nhất của N chu kỳ
Giới hạn trung bình = (giới hạn trên + giới hạn dưới) / 2
Trong đó, N là độ dài của chu kỳ đường dẫn, trong chiến lược này mặc định là 50 .
Xây dựng một vị trí giao dịch 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;
Xây dựng vị trí short position khi giá thấp nhất của dòng K mới nhất giảm xuống dưới đường giới hạn của kênh.
Ví dụ:
Điểm cao nhất của đường K không vượt quá giới hạn trên của đường; Các điểm cao nhất của đường K hiện tại đã vượt qua giới hạn trên của kênh; == Tạo nhiều vị trí ==
Có hai lựa chọn về quy tắc ra sân:
Trong khi đó, các nhà đầu tư khác cũng có xu hướng giảm giá.
Hình 1: Giá dừng lỗ là giới hạn trên đường;
Bất kể vị trí đầu nhiều hay vị trí đầu trống, khi giá giảm trở lại đường trung tâm của kênh, tất cả các vị trí sẽ bị xóa.
Kiểm soát rủi ro sử dụng phương pháp dừng tỷ lệ, tính toán khoảng cách dừng cụ thể dựa trên độ rộng của lối đi và phần trăm rủi ro chấp nhận được của thiết lập.
Lợi nhuận của bạn sẽ được tính theo tỷ lệ phần trăm của rủi ro mà bạn có thể chấp nhận.
Khoảng cách dừng lỗ = giá vào * (1 + phần trăm rủi ro chấp nhận được)
Ví dụ, thiết lập rủi ro thêm 2%, giá nhập là 10.000 đô la, và chỉ một đường dừng là 10.000 * (1 - 2%) = 9.800 đô la.
Khi giá phá vỡ đường dẫn, có khả năng sẽ bắt đầu xu hướng hướng mới. Khi đó, nhập cảnh có thể nắm bắt được sự thay đổi giá lớn hơn.
Sử dụng stop loss tỷ lệ có thể kiểm soát tổn thất đơn trong phạm vi khả thi.
Các tham số như độ dài chu kỳ kênh, tỷ lệ rủi ro, phương thức dừng lỗ có thể được kết hợp tối ưu hóa để phù hợp với nhiều môi trường thị trường hơn.
Giá vượt qua đường dẫn không có nghĩa là chắc chắn sẽ tạo ra xu hướng, có khả năng phá vỡ thất bại, dễ bị mất mát.
Khi thị trường đang ở trong biến động rộng, giá có thể thường xuyên kích hoạt giới hạn trên và dưới của kênh, dẫn đến phí giao dịch tăng và mất điểm trượt do giao dịch quá thường xuyên.
Có thể xem xét chiều dài của kênh giá như một biến, điều chỉnh tự động theo biến động của thị trường. Mở rộ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.
Kết hợp với các chỉ số khác để lọc thời gian nhập cảnh, chẳng hạn như chỉ số năng lượng, trung bình di chuyển, v.v., để tránh phá vỡ không hiệu quả trong tình huống chấn động.
Sử dụng nhiều dữ liệu lịch sử hơn để thử nghiệm tối ưu hóa các tham số, xác định các tham số tối ưu để phù hợp với các tình huống thị trường rộng hơn.
Chiến lược kênh giá động nói chung là một chiến lược theo dõi xu hướng đơn giản và trực quan hơn. Ưu điểm của nó là các biểu tượng rõ ràng và dễ nắm bắt; kiểm soát rủi ro là hợp lý hơn. Nhưng cũng có 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 thị trường phá vỡ thất bại và chấn động. Chiến lược này phù hợp hơn với các công cụ hỗ trợ hợp tác trong giao dịch xu hướng, và hiệu quả sử dụng các chỉ số hoặc mô hình công nghệ khác sẽ tốt hơn.
/*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)