
Đâ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.
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.
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.
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ẻ.
Chiến lược này có thể được tối ưu hóa hơn nữa bằng cách:
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ả.
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.
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.
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.
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ể.
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.
/*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)