Các Fractal Williams kết hợp với chỉ số ZZ cho các chiến lược giao dịch định lượng

Tác giả:ChaoZhang, Ngày: 2024-01-29 15:24:30
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch định lượng kết hợp sử dụng lý thuyết fractal của Bill Williams và chỉ số ZZ. Nó đánh giá xu hướng thị trường thông qua việc tính toán các fractal của Williams và xác định các điểm đột phá tiềm năng bằng cách vẽ các đường hỗ trợ / kháng cự sử dụng chỉ số ZZ để thực hiện các giao dịch theo xu hướng.

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

Chiến lược đầu tiên tính toán các fractal Williams để xác định xem fractal hiện tại đang tăng hay giảm. Nếu là một fractal tăng, người ta tin rằng xu hướng hiện tại là tăng. Nếu là một fractal giảm, người ta tin rằng xu hướng hiện tại là giảm.

Sau đó, nó vẽ đường hỗ trợ và kháng cự của chỉ số ZZ dựa trên các điểm fractal. Nếu giá vượt qua đường kháng cự tương ứng với fractal tăng, đi dài. Nếu giá vượt qua đường hỗ trợ tương ứng với fractal giảm, đi ngắn.

Thông qua sự kết hợp như vậy, có thể nắm bắt sự thay đổi trong xu hướng một cách kịp thời và thực hiện các giao dịch theo xu hướng.

Phân tích lợi thế

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 - Fractals Williams và chỉ số ZZ - để khám phá thêm các cơ hội giao dịch.

Nó có thể đánh giá kịp thời điểm chuyển hướng của xu hướng thị trường và có tiêu chí dừng lỗ / lấy lợi nhuận tốt để nắm bắt hướng xu hướng chính. Ngoài ra, chỉ số ZZ có thể lọc ra một số sự đột phá sai để tránh tổn thất không cần thiết.

Nói chung, chiến lược này xem xét cả đánh giá xu hướng và lựa chọn điểm đầu vào cụ thể để cân bằng rủi ro và lợi nhuận.

Phân tích rủi ro

Nguy cơ lớn nhất của chiến lược này là các phán đoán fractal và chỉ số ZZ có thể phát ra các 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 vượt qua đường kháng cự, giá có thể nhanh chóng giảm lại, không thể duy trì xu hướng tăng.

Ngoài ra, cách tính toán fractals có thể dẫn đến đánh giá sai nếu khung thời gian được đặt không đúng.

Để giảm rủi ro này, điều chỉnh các tham số tính toán của các fractal một cách thích hợp và tăng điều kiện lọc để giảm tín hiệu sai.

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

Chiến lược này có thể được tối ưu hóa thêm trong các khía cạnh sau:

  1. Thêm các bộ lọc chỉ số động lực như MACD hoặc Bollinger Bands để tránh một số đột phá sai.

  2. Tối ưu hóa cài đặt tham số fractal và điều chỉnh tính toán đỉnh và đáy và rút ngắn khung thời gian để có được các phán đoán xu hướng chính xác hơn.

  3. Tăng các thuật toán học máy để đánh giá độ chính xác xu hướng và tránh những hạn chế của con người.

  4. Thêm cơ chế dừng lỗ thích nghi dựa trên biến động thị trường.

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

Tóm lại

Bằng cách kết hợp khéo léo lý thuyết fractal Williams và chỉ số ZZ, chiến lược này đạt được việc phát hiện kịp thời và nắm bắt những thay đổi trong xu hướng thị trường. Nó duy trì tỷ lệ thắng cao và dự kiến sẽ có được lợi nhuận dư thừa dài hạn.


/*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)

Thêm nữa