xu hướng theo chiến lược dựa trên các kênh Donchian

Tác giả:ChaoZhang, Ngày: 2023-10-31 17:44:19
Tags:

img

Tổng quan

Chiến lược kéo là một chiến lược theo xu hướng dựa trên các kênh Donchian. Nó sử dụng các kênh Donchian nhanh và chậm để xác định hướng xu hướng và tham gia rút lui. Lợi thế của chiến lược này là nó có thể theo dõi xu hướng tự động và cắt giảm lỗ trong thời gian khi xu hướng thay đổi.

Chiến lược logic

Chiến lược đầu tiên xác định khoảng thời gian kênh nhanh là 20 thanh, và khoảng thời gian kênh chậm là 50 thanh.

Đầu tiên, mức cao nhất và thấp nhất của kênh nhanh được tính toán, và điểm giữa được lấy làm đường dừng lỗ. Đồng thời, mức cao nhất và thấp nhất của kênh chậm được tính toán, và kênh trên và dưới được sử dụng làm đường nhập.

Khi giá vượt qua đỉnh của kênh chậm, đi dài. Khi giá vượt qua đáy của kênh chậm, đi ngắn. Sau khi vào vị trí, đặt stop loss ở giữa kênh nhanh.

Vì vậy, kênh chậm xác định hướng xu hướng chính, trong khi kênh nhanh theo dõi các đột phá nhỏ trong phạm vi nhỏ để xác định điểm dừng lỗ.

Ưu điểm

  • Tự động theo dõi xu hướng và cắt giảm tổn thất trong thời gian.

  • Chỉ lấy các mục nhập khi giá vượt qua ranh giới kênh có thể lọc ra một số sự đột phá giả mà không có xu hướng thực sự.

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

Rủi ro

  • Các chiến lược theo xu hướng có thể có các khoản rút tương đối lớn đòi hỏi sự chuẩn bị tâm lý.

  • Stop loss quá gần. Thời gian kênh nhanh là ngắn nên stop loss gần, dễ bị dừng lại. Chúng ta có thể thư giãn thích hợp thời gian kênh nhanh.

  • Quá nhiều giao dịch. Cấu trúc kênh kép có thể tạo ra các mục nhập quá nhiều, đòi hỏi kích thước vị trí hợp lý.

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

  • Chúng ta có thể thêm biến động v.v. trong các điều kiện nhập cảnh để lọc các sự đột phá mà không có đủ sức mạnh xu hướng.

  • Tối ưu hóa các tham số thời gian kênh. Chúng ta có thể tìm ra các kết hợp tham số kênh tối ưu một cách có hệ thống.

  • Kết hợp nhiều khung thời gian. Xác định xu hướng chính trong khung thời gian cao hơn và giao dịch trong khung thời gian thấp hơn.

  • Phân đoạn dừng mất mát động. Điều chỉnh khoảng cách dừng động dựa trên biến động thị trường.

Tóm lại

Chiến lược kéo là một chiến lược theo xu hướng tiêu chuẩn nói chung. Nó sử dụng các kênh giá để xác định hướng xu hướng và thiết lập dừng lỗ để kiểm soát rủi ro. Chiến lược có một số lợi thế nhưng cũng có những vấn đề về giảm và dừng lỗ quá gần. Chúng ta có thể tối ưu hóa nó bằng cách điều chỉnh các tham số kênh, thêm bộ lọc vv. Nhưng chúng ta nên lưu ý các chiến lược theo xu hướng đòi hỏi tâm lý mạnh mẽ để chịu được giảm.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2020

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

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risk      = input(2, minval = 0.1, maxval = 99, title = "Risk size, %")
fast      = input(20, minval = 1, title = "Fast channel (for stop-loss)")
slow      = input(50, minval = 1, title = "Slow channel (for entries)")
showof    = input(true, defval = true, title = "Show offset")
showll    = input(true, defval = true, title = "Show lines")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(true, defval = true, 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")

//Donchian price channel fast
hf = highest(high, fast)
lf = lowest(low, fast)
center = (hf + lf) / 2

//Donchian price chennal slow
hs = highest(high, slow)
ls = lowest(low, slow)

//Lines
colorpc = showll ? color.blue : na
colorsl = showll ? color.red : na
offset = showof ? 1 : 0
plot(hs, offset = offset, color = colorpc, title = "Slow channel high")
plot(ls, offset = offset, color = colorpc, title = "Slow channel low")
plot(center, offset = offset, color = colorsl, title = "Fast channel stop-loss")

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

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = true

//Lot size
risksize = -1 * risk
risklong = ((center / hs) - 1) * 100
coeflong = abs(risksize / risklong)
lotlong = (strategy.equity / close) * coeflong
riskshort = ((center / ls) - 1) * 100
coefshort = abs(risksize / riskshort)
lotshort = (strategy.equity / close) * coefshort

//Orders
strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and hs > 0 and truetime)
strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and ls > 0 and truetime)
strategy.exit("LongExit", "Long", stop = center, when = needlong and strategy.position_size > 0)
strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0)
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