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.
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.
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ó hai quy tắc rời khỏi tùy chọn:
Đó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;
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 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.
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.
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.
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.
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ỗ.
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.
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.
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.
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.
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)