
Ini adalah strategi perdagangan kuantitatif yang menggabungkan teori pecahan Bill Williams dan indikator ZZ. Strategi ini menilai trend pasaran dengan mengira pecahan Williams dan menggabungkan indikator ZZ untuk memetakan garis rintangan sokongan untuk mencari titik pecah yang berpotensi, yang membolehkan perdagangan trend.
Strategi ini pertama kali mengira pecahan Williams untuk menentukan sama ada pecahan naik atau pecahan turun. Jika pecahan naik, ia dianggap sedang dalam trend naik; jika pecahan turun, ia dianggap sedang dalam trend turun.
Garis sokongan dan garis rintangan ZZ kemudian digariskan berdasarkan titik pecahan. Jika harga menembusi garisan rintangan yang setara dengan garisan pecahan yang naik, buat tambahan; jika harga menembusi garisan sokongan yang setara dengan garisan pecahan yang turun, buat kosong.
Dengan kombinasi ini, ia boleh menangkap perubahan trend dalam masa yang tepat, dan membolehkan perdagangan trend-tracking.
Strategi ini menggabungkan dua kaedah analisis teknikal yang berbeza, iaitu Williams fractional dan ZZ index, untuk mencari lebih banyak peluang perdagangan.
Ia dapat menilai perubahan trend pasaran pada masa yang tepat dan menetapkan keadaan hentian kerugian yang baik, membantu untuk memahami arah trend utama. Selain itu, indikator ZZ dapat menyaring beberapa keadaan yang melanggar, dan mengelakkan kerugian yang tidak perlu.
Secara keseluruhannya, strategi ini mempertimbangkan penilaian trend dan pilihan titik masuk tertentu, dengan keseimbangan antara risiko dan keuntungan.
Risiko terbesar dalam strategi ini adalah bahawa penghakiman pecahan dan indikator ZZ mungkin menghantar isyarat perdagangan yang salah, yang menyebabkan kerugian yang tidak perlu. Sebagai contoh, harga mungkin jatuh kembali dengan cepat setelah memecahkan garis rintangan dan tidak dapat terus meningkat.
Di samping itu, perhitungan pecahan mungkin salah kerana tidak betul menetapkan kitaran masa. Jika kitaran masa terlalu pendek, maka kemungkinan palsu akan meningkat.
Untuk mengurangkan risiko ini, parameter pengiraan pembahagian boleh disesuaikan dengan betul, atau anda boleh mengurangkan isyarat yang salah dengan menambah syarat penapisan. Selain itu, anda boleh menetapkan marjin stop yang lebih besar untuk mengawal kerugian tunggal.
Strategi ini boleh dioptimumkan dengan cara berikut:
Menambah penapis penunjuk momentum, seperti MACD atau penunjuk Brin, dapat mengelakkan beberapa penembusan palsu.
Mengoptimumkan parameter pembahagian, menyesuaikan cara pengiraan titik tinggi dan rendah, dan mengurangkan tempoh masa untuk mendapatkan penilaian trend yang lebih tepat.
Meningkatkan ketepatan algoritma pembelajaran mesin dalam menentukan trend, menggunakan kebijaksanaan AI untuk mengelakkan batasan yang ditetapkan oleh manusia.
Menambah mekanisme penangguhan kerugian yang dapat disesuaikan dengan ketara turun naik pasaran
Menggunakan algoritma pembelajaran mendalam untuk mengoptimumkan keseluruhan parameter.
Strategi ini menggunakan gabungan yang bijak antara teori Williams dan ZZ Indicator, untuk menilai dan menangkap perubahan trend pasaran pada masa yang tepat. Ia mengekalkan kadar kemenangan yang tinggi dan dijangka memperoleh keuntungan tambahan yang stabil dalam jangka panjang. Langkah seterusnya adalah dengan memperkenalkan lebih banyak alat penapisan dan kebijaksanaan AI, yang dijangka meningkatkan lagi kestabilan dan keuntungan strategi.
/*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)