Chiến lược giao dịch định lượng kết hợp giữa Williams fractal và chỉ báo ZZ


Ngày tạo: 2024-01-29 15:24:30 sửa đổi lần cuối: 2024-01-29 15:24:30
sao chép: 0 Số nhấp chuột: 850
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng kết hợp giữa Williams fractal và chỉ báo ZZ

Tổng quan

Đây là một chiến lược giao dịch định lượng sử dụng lý thuyết phân đoạn của Bill Williams và chỉ số ZZ. Chiến lược này dùng phân đoạn Williams để đánh giá xu hướng thị trường và kết hợp với chỉ số ZZ để vẽ đường kháng cự hỗ trợ để phát hiện các điểm phá vỡ tiềm năng, để có thể theo dõi xu hướng giao dịch.

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

Chiến lược này đầu tiên tính toán phân đoạn Williams để xác định hiện tại là một phân đoạn tăng hoặc giảm. Nếu là một phân đoạn tăng, nó được coi là hiện đang trong xu hướng tăng; Nếu là một phân đoạn giảm, nó được coi là hiện đang trong xu hướng giảm.

Sau đó, vẽ đường hỗ trợ và đường kháng cự của chỉ số ZZ dựa trên điểm phân chia. Nếu giá phá vỡ đường kháng cự tương ứng với phân chia tăng lên, hãy làm nhiều; Nếu giá phá vỡ đường hỗ trợ tương ứng với phân chia giảm, hãy làm không.

Với sự kết hợp này, các giao dịch theo dõi xu hướng có thể được thực hiện khi xu hướng thay đổi.

Phân tích lợi thế chiến lược

Chiến lược này kết hợp hai phương pháp phân tích kỹ thuật khác nhau, phân đoạn Williams và chỉ số ZZ, để khám phá thêm cơ hội giao dịch.

Nó có thể đánh giá kịp thời sự thay đổi của xu hướng thị trường và thiết lập các điều kiện dừng lỗ tốt, giúp nắm được hướng của xu hướng chính. Ngoài ra, chỉ số ZZ có thể lọc ra một số trường hợp phá vỡ giả để tránh tổn thất không cần thiết.

Nhìn chung, chiến lược này đã cân nhắc cả xu hướng và lựa chọn điểm vào cụ thể, cân bằng giữa rủi ro và lợi nhuận.

Phân tích rủi ro chiến lược

Rủi ro lớn nhất của chiến lược này là sự phân định hình dạng và chỉ số ZZ có thể đưa ra tín hiệu giao dịch sai, dẫn đến tổn thất không cần thiết. Ví dụ, sau khi phá vỡ đường kháng cự, giá có thể giảm trở lại rất nhanh và không thể tăng lên.

Ngoài ra, cách tính toán phân hình có thể bị sai lệch do thiết lập chu kỳ thời gian không phù hợp. Nếu chu kỳ thời gian quá ngắn, sẽ làm tăng khả năng phá vỡ giả.

Để giảm những rủi ro này, các tham số tính toán của phân dạng có thể được điều chỉnh thích hợp, hoặc có thể giảm tín hiệu sai bằng cách tăng điều kiện lọc. Ngoài ra, có thể thiết lập độ dừng lớn hơn để kiểm soát tổn thất đơn lẻ.

Hướng tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa hơn nữa bằng cách:

  1. Thêm bộ lọc cho các chỉ số động lực, chẳng hạn như MACD hoặc chỉ số băng tần Brin, có thể ngăn chặn một số đột phá giả.

  2. Tối ưu hóa thiết lập tham số phân dạng, điều chỉnh cách tính toán điểm cao và thấp, thu nhỏ chu kỳ thời gian để có được phán đoán xu hướng chính xác hơn.

  3. Tăng độ chính xác của thuật toán học máy trong việc xác định xu hướng, sử dụng trí tuệ AI để tránh các giới hạn của thiết lập bằng tay.

  4. Thêm cơ chế dừng lỗ thích ứng, có thể điều chỉnh mức dừng lỗ theo mức độ biến động của thị trường.

  5. Sử dụng thuật toán học sâu để tối ưu hóa thiết lập tham số tổng thể.

Tóm tắt

Chiến lược này, thông qua sự kết hợp khéo léo của lý thuyết phân tách Williams và chỉ số ZZ, cho phép đánh giá kịp thời và nắm bắt các thay đổi trong xu hướng thị trường. Nó duy trì tỷ lệ thắng cao và có khả năng thu được lợi nhuận vượt trội ổn định trong thời gian dài.

Mã nguồn chiến lược
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title = "robotrading ZZ-8 fractals", shorttitle = "ZZ-8", 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(false, defval = true, title = "Short")
filterBW = input(false, title="filter Bill Williams Fractals")
showll = input(true, title = "Show levels")
showff = input(true, title = "Show fractals (repaint!)")
showdd = input(true, title = "Show dots (repaint!)")
showbg = input(false, title = "Show background")
showlb = input(false, title = "Show drawdown")
startTime = input(defval = timestamp("01 Jan 2000 00:00 +0000"), title = "Start Time", type = input.time, inline = "time1")
finalTime = input(defval = timestamp("31 Dec 2099 23:59 +0000"), title = "Final Time", type = input.time, inline = "time1")

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

//Fractals
isRegularFractal(mode) =>
    ret = mode == 1 ? high[4] < high[3] and high[3] < high[2] and high[2] > high[1] and high[1] > high[0] : mode == -1 ? low[4] > low[3] and low[3] > low[2] and low[2] < low[1] and low[1] < low[0] : false
isBWFractal(mode) =>
    ret = mode == 1 ? high[4] < high[2] and high[3] <= high[2] and high[2] >= high[1] and high[2] > high[0] : mode == -1 ? low[4] > low[2] and low[3] >= low[2] and low[2] <= low[1] and low[2] < low[0] : false
filteredtopf = filterBW ? isRegularFractal(1) : isBWFractal(1)
filteredbotf = filterBW ? isRegularFractal(-1) : isBWFractal(-1)

//Triangles
plotshape(filteredtopf and showff, title='Filtered Top Fractals', style=shape.triangledown, location=location.abovebar, color= color.red, offset=-2)
plotshape(filteredbotf and showff, title='Filtered Bottom Fractals', style=shape.triangleup, location=location.belowbar, color= color.lime, offset=-2)

//Levels
hh = 0.0
ll = 0.0
hh := filteredtopf ? high[2] : hh[1]
ll := filteredbotf ? low[2] : ll[1]

//Trend
trend = 0
trend := high >= hh[1] ? 1 : low <= ll[1] ? -1 : trend[1]

//Lines
hcol = showll and hh == hh[1] and close < hh ? color.lime : na
lcol = showll and ll == ll[1] and close > ll ? color.red : na
plot(hh, color = hcol)
plot(ll, color = lcol)

//Dots
// var line hline = na
// if hh != hh[1] and showdd
//     hline := line.new(bar_index - 0, hh[0], bar_index - 2, hh[0], xloc = xloc.bar_index, extend = extend.none, style = line.style_dotted, color = color.lime, width = 1)
// var line lline = na
// if ll != ll[1] and showdd
//     lline := line.new(bar_index - 0, ll[0] - syminfo.mintick, bar_index - 2, ll[0] - syminfo.mintick, xloc = xloc.bar_index, extend = extend.none, style = line.style_dotted, color = color.red, width = 1)
    
//Background
bgcol = showbg == false ? na : trend == 1 ? color.lime : trend == -1 ? color.red : na
bgcolor(bgcol, transp = 80)

//Orders
if hh > 0 and needlong
    strategy.entry("Long", strategy.long, na, stop = hh, when = needlong and truetime)
    strategy.exit("Exit Long", "Long", stop = ll, when = needshort == false)
if ll > 0 and startTime
    strategy.entry("Short", strategy.short, na, stop = ll, when = needshort and truetime)
    strategy.exit("Exit Short", "Short", stop = hh, when = needlong == false)
if time > finalTime
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")

if showlb

    //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 != strategy.position_size[1] ? 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)*50)
    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)