Fractal Williams digabungkan dengan Indikator ZZ untuk Strategi Dagangan Kuantitatif

Penulis:ChaoZhang, Tarikh: 2024-01-29 15:24:30
Tag:

img

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang menggabungkan penggunaan teori fraktal Bill Williams dan penunjuk ZZ. Ia menilai trend pasaran melalui pengiraan fraktal Williams dan mengenal pasti titik pecah yang berpotensi dengan menggambar garis sokongan / rintangan menggunakan penunjuk ZZ untuk melaksanakan perdagangan mengikut trend.

Prinsip Strategi

Strategi ini mula-mula mengira fraktal Williams untuk menentukan sama ada fraktal semasa meningkat atau menurun. Jika fraktal meningkat, ia dipercayai bahawa trend semasa adalah ke atas. Jika fraktal menurun, ia dipercayai bahawa trend semasa adalah ke bawah.

Kemudian ia menarik garis sokongan dan rintangan penunjuk ZZ berdasarkan titik fraktal. Jika harga menembusi garis rintangan yang sepadan dengan fraktal yang meningkat, pergi panjang. Jika harga menembusi garis sokongan yang sepadan dengan fraktal yang jatuh, pergi pendek.

Melalui gabungan sedemikian, adalah mungkin untuk menangkap perubahan dalam trend dengan cara yang tepat pada masanya dan melaksanakan perdagangan mengikut trend.

Analisis Kelebihan

Strategi ini menggabungkan dua kaedah analisis teknikal yang berbeza - fraktal Williams dan penunjuk ZZ - untuk mendedahkan lebih banyak peluang perdagangan.

Ia boleh menilai pada masa yang tepat titik perubahan trend pasaran dan mempunyai kriteria berhenti rugi / mengambil keuntungan yang baik untuk menangkap arah trend utama.

Secara amnya, strategi ini mempertimbangkan kedua-dua penilaian trend dan pemilihan titik masuk khusus untuk mengimbangi risiko dan pulangan.

Analisis Risiko

Risiko terbesar strategi ini adalah bahawa penghakiman fraktal dan penunjuk ZZ boleh mengeluarkan isyarat perdagangan yang salah, yang membawa kepada kerugian yang tidak perlu.

Di samping itu, cara fractal dikira boleh membawa kepada penilaian yang salah jika jangka masa ditetapkan dengan tidak betul.

Untuk mengurangkan risiko ini, menyesuaikan parameter pengiraan fraktal dengan sewajarnya dan meningkatkan keadaan penapisan untuk mengurangkan isyarat yang salah.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dalam aspek berikut:

  1. Tambah penapis penunjuk momentum seperti MACD atau Bollinger Bands untuk mengelakkan beberapa pecah palsu.

  2. Mengoptimumkan tetapan parameter fraktal dan menyesuaikan pengiraan tertinggi dan terendah dan memendekkan jangka masa untuk mendapatkan penilaian trend yang lebih tepat.

  3. Meningkatkan algoritma pembelajaran mesin untuk menilai ketepatan trend dan mengelakkan batasan manusia.

  4. Tambahkan mekanisme stop loss adaptif berdasarkan turun naik pasaran.

  5. Gunakan algoritma pembelajaran mendalam untuk mengoptimumkan tetapan parameter keseluruhan.

Ringkasan

Dengan menggabungkan teori fraktal Williams dengan mahir dan penunjuk ZZ, strategi ini mencapai pengesanan tepat pada masanya dan menangkap perubahan dalam trend pasaran. Ia mengekalkan kadar kemenangan yang tinggi dan dijangka memperoleh pulangan yang berlebihan dalam jangka panjang. Langkah seterusnya dengan memperkenalkan lebih banyak penapis dan keupayaan AI, dijangka akan meningkatkan lagi kestabilan strategi dan kadar pulangan.


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

Lebih lanjut