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


Ngày tạo: 2023-12-13 16:03:37 sửa đổi lần cuối: 2023-12-13 16:03:37
sao chép: 3 Số nhấp chuột: 388
1
tập trung vào
1166
Người theo dõi

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

Tổng quan

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.

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

Tính toán chỉ số

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 .

Quy tắc nhập cảnh

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í ==

Quy tắc chơi

Có hai lựa chọn về quy tắc ra sân:

  1. Kênh 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;

  1. Trận đấu giữa

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

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.

Phân tích lợi thế

Bắt được những bước đột phá

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.

Những rủi ro có thể kiểm soát được

Sử dụng stop loss tỷ lệ có thể kiểm soát tổn thất đơn trong phạm vi khả thi.

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

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.

Phân tích rủi ro

Sự đột phá thất bại

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.

Vụ động đấ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.

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

Động lực

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.

Tối ưu hóa cơ hội nhập học

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.

Các tham số chính xác

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.

Tóm tắt

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.

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