Strategi perdagangan kuantitatif kombinasi fraktal Williams dengan indikator ZZ


Tanggal Pembuatan: 2024-01-29 15:24:30 Akhirnya memodifikasi: 2024-01-29 15:24:30
menyalin: 0 Jumlah klik: 850
1
fokus pada
1617
Pengikut

Strategi perdagangan kuantitatif kombinasi fraktal Williams dengan indikator ZZ

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang menggunakan teori pecahan Bill Williams dan indikator ZZ. Strategi ini menilai tren pasar dengan menghitung pecahan Williams, dan digabungkan dengan indikator ZZ untuk memetakan garis resistensi dukungan untuk menemukan potensi titik-titik pecah, sehingga memungkinkan perdagangan yang mengikuti tren.

Prinsip Strategi

Strategi ini pertama-tama menghitung Williams fraction untuk menentukan apakah saat ini sedang naik atau turun. Jika dalam bentuk naik, maka dianggap sedang dalam tren naik; Jika dalam bentuk turun, maka dianggap sedang dalam tren turun.

Kemudian gambar garis dukungan dan garis resistensi indikator ZZ berdasarkan titik pecahan. Jika harga menembus garis resistensi yang setara dengan pecahan yang naik, lakukan lebih banyak; jika harga menembus garis dukungan yang setara dengan pecahan yang turun, lakukan kosong.

Dengan kombinasi ini, Anda dapat menangkap perubahan tren dalam waktu yang tepat dan melakukan perdagangan pelacakan tren.

Analisis Keunggulan Strategi

Strategi ini menggabungkan dua metode analisis teknis yang berbeda, yaitu Williams Segmentation dan ZZ Indicator, untuk mengeksplorasi lebih banyak peluang perdagangan.

Ini dapat menilai perubahan tren pasar pada waktu yang tepat dan mengatur kondisi stop loss yang baik, membantu untuk memahami arah tren utama. Selain itu, indikator ZZ dapat menyaring beberapa kasus terobosan palsu dan menghindari kerugian yang tidak perlu.

Secara keseluruhan, strategi ini mempertimbangkan penilaian tren dan pilihan titik masuk tertentu, menyeimbangkan risiko dan keuntungan.

Analisis Risiko Strategi

Risiko terbesar dari strategi ini adalah bahwa perhitungan pecahan dan indikator ZZ dapat mengirimkan sinyal perdagangan yang salah, yang menyebabkan kerugian yang tidak perlu. Misalnya, setelah melewati garis resistensi, harga mungkin akan kembali ke bawah dengan cepat dan tidak dapat terus naik.

Selain itu, metode perhitungan pecahan dapat membuat kesalahan karena pengaturan siklus waktu yang tidak tepat. Jika siklus waktu terlalu pendek, maka akan meningkatkan probabilitas terobosan palsu.

Untuk mengurangi risiko ini, parameter perhitungan dari deformasi dapat disesuaikan dengan baik, atau dapat mengurangi sinyal yang salah dengan menambahkan kondisi penyaringan. Selain itu, stop loss yang lebih besar dapat diatur untuk mengontrol kerugian tunggal.

Arah optimasi strategi

Strategi ini dapat dioptimalkan lebih lanjut dengan cara:

  1. Menambahkan filter indikator momentum, seperti MACD atau indikator Brin, dapat menghindari beberapa false breaks.

  2. Mengoptimalkan pengaturan parameter fraksi, menyesuaikan cara perhitungan titik tinggi dan rendah, dan mempersingkat periode waktu untuk mendapatkan penilaian tren yang lebih akurat.

  3. Meningkatkan akurasi algoritma pembelajaran mesin untuk menilai tren, menggunakan penilaian AI untuk menghindari keterbatasan yang ditetapkan oleh manusia.

  4. Menambahkan mekanisme stop loss yang dapat disesuaikan dengan volatilitas pasar.

  5. Menggunakan algoritma pembelajaran dalam untuk mengoptimalkan pengaturan parameter secara keseluruhan.

Meringkaskan

Strategi ini, melalui kombinasi yang cerdik dari teori Williams dan ZZ indicator, memungkinkan penilaian dan penangkapan perubahan tren pasar secara tepat waktu. Strategi ini mempertahankan tingkat kemenangan yang tinggi dan diharapkan untuk mendapatkan keuntungan tambahan yang stabil dalam jangka panjang. Langkah selanjutnya adalah dengan memperkenalkan lebih banyak alat penyaringan dan penilaian AI, diharapkan untuk meningkatkan stabilitas dan tingkat keuntungan strategi lebih lanjut.

Kode Sumber 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)