Fraktal Williams Dikombinasikan dengan Indikator ZZ untuk Strategi Perdagangan Kuantitatif

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

img

Gambaran umum

Ini adalah strategi perdagangan kuantitatif yang menggabungkan penggunaan teori fraktal Bill Williams dan indikator ZZ. Ini menilai tren pasar melalui perhitungan fraktal Williams dan mengidentifikasi titik-titik breakout potensial dengan menggambar garis dukungan / resistensi menggunakan indikator ZZ untuk menerapkan perdagangan mengikuti tren.

Prinsip Strategi

Strategi ini pertama-tama menghitung fraktal Williams untuk menentukan apakah fraktal saat ini naik atau turun. Jika fraktal naik, diyakini bahwa tren saat ini naik. Jika fraktal turun, diyakini bahwa tren saat ini menurun.

Ini kemudian menggambar garis dukungan dan resistensi indikator ZZ berdasarkan titik fraktal. Jika harga menembus garis resistensi yang sesuai dengan fraktal yang naik, pergi panjang. Jika harga menembus garis dukungan yang sesuai dengan fraktal yang turun, pergi pendek.

Melalui kombinasi tersebut, dimungkinkan untuk menangkap perubahan tren secara tepat waktu dan menerapkan perdagangan yang mengikuti tren.

Analisis Keuntungan

Strategi ini menggabungkan dua metode analisis teknis yang berbeda - fraktal Williams dan indikator ZZ - untuk mengungkap lebih banyak peluang perdagangan.

Indikator ini dapat menilai titik balik tren pasar secara tepat waktu dan memiliki kriteria stop loss/take profit yang baik untuk menangkap arah tren utama.

Secara umum, strategi ini mempertimbangkan penilaian tren dan pemilihan titik masuk khusus untuk menyeimbangkan risiko dan pengembalian.

Analisis Risiko

Risiko terbesar dari strategi ini adalah bahwa penilaian fraktal dan indikator ZZ dapat mengeluarkan sinyal perdagangan yang salah, yang mengarah pada kerugian yang tidak perlu.

Selain itu, cara fraktal dihitung dapat menyebabkan penilaian yang salah jika kerangka waktu ditetapkan dengan tidak benar.

Untuk mengurangi risiko ini, sesuaikan dengan parameter perhitungan fraktal dan tingkatkan kondisi penyaringan untuk mengurangi sinyal yang salah.

Arahan Optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:

  1. Tambahkan filter indikator momentum seperti MACD atau Bollinger Bands untuk menghindari beberapa breakout palsu.

  2. Mengoptimalkan pengaturan parameter fraktal dan menyesuaikan perhitungan puncak dan terendah dan memperpendek kerangka waktu untuk mendapatkan penilaian tren yang lebih akurat.

  3. Meningkatkan algoritma pembelajaran mesin untuk menilai akurasi tren dan menghindari keterbatasan manusia.

  4. Tambahkan mekanisme stop loss adaptif berdasarkan volatilitas pasar.

  5. Gunakan algoritma pembelajaran mendalam untuk mengoptimalkan pengaturan parameter secara keseluruhan.

Ringkasan

Dengan menggabungkan teori fraktal Williams dan indikator ZZ, strategi ini mencapai deteksi dan penangkapan perubahan tren pasar secara tepat waktu.


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