Williams-Fraktale kombiniert mit ZZ-Indikator für quantitative Handelsstrategien

Schriftsteller:ChaoZhang, Datum: 2024-01-29 15:24:30
Tags:

img

Übersicht

Dies ist eine quantitative Handelsstrategie, die die Verwendung der Bill Williams Fraktaltheorie und des ZZ-Indikators kombiniert.

Strategieprinzip

Die Strategie berechnet zunächst die Williams-Fraktale, um festzustellen, ob das aktuelle Fraktal steigt oder fällt. Wenn es sich um ein steigendes Fraktal handelt, wird angenommen, dass der aktuelle Trend nach oben ist. Wenn es sich um ein fallendes Fraktal handelt, wird angenommen, dass der aktuelle Trend nach unten ist.

Der ZZ-Indikator zeichnet dann die Unterstützungs- und Widerstandslinien basierend auf den Fraktalpunkten. Wenn der Preis die Widerstandslinie durchbricht, die dem steigenden Fraktal entspricht, gehen Sie lang. Wenn der Preis die Unterstützungslinie durchbricht, die dem fallenden Fraktal entspricht, gehen Sie kurz.

Durch eine solche Kombination ist es möglich, Veränderungen der Trends rechtzeitig zu erfassen und Trends folgend zu handeln.

Analyse der Vorteile

Diese Strategie kombiniert zwei verschiedene technische Analysemethoden - Williams-Fraktale und ZZ-Indikatoren - um mehr Handelsmöglichkeiten zu entdecken.

Der ZZ-Indikator kann auch einige falsche Ausbrüche filtern, um unnötige Verluste zu vermeiden.

Im Allgemeinen berücksichtigt diese Strategie sowohl die Beurteilung von Trends als auch die spezifische Auswahl von Einstiegspunkten, um Risiken und Renditen auszugleichen.

Risikoanalyse

Das größte Risiko dieser Strategie besteht darin, dass Fraktalurteile und der ZZ-Indikator falsche Handelssignale ausgeben können, was zu unnötigen Verlusten führt.

Darüber hinaus kann die Art und Weise, wie Fraktale berechnet werden, zu Fehleinschätzungen führen, wenn der Zeitrahmen nicht richtig eingestellt wird.

Um diese Risiken zu reduzieren, sollten die Berechnungsparameter der Fraktale angemessen angepasst und die Filterbedingungen erhöht werden, um fehlerhafte Signale zu reduzieren.

Optimierungsrichtlinien

Diese Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Hinzufügen von Filtern für Momentumindikatoren wie MACD oder Bollinger Bands, um falsche Ausbrüche zu vermeiden.

  2. Optimieren Sie die Einstellungen der Fraktalparameter und passen Sie die Berechnung von Höchst- und Tiefwerten an und verkürzen Sie den Zeitrahmen, um genauere Trendbeurteilungen zu erhalten.

  3. Verstärken Sie die Maschinellen Lernalgorithmen, um die Trendgenauigkeit zu beurteilen und menschliche Grenzen zu vermeiden.

  4. Hinzufügen eines anpassungsfähigen Stop-Loss-Mechanismus auf Basis der Marktvolatilität.

  5. Verwenden Sie Deep-Learning-Algorithmen, um die Gesamtparameter-Einstellungen zu optimieren.

Zusammenfassung

Durch die geschickte Kombination der Williams-Fraktaltheorie und des ZZ-Indikators erreicht diese Strategie eine rechtzeitige Erkennung und Erfassung von Veränderungen der Markttrends. Sie hält eine hohe Gewinnrate bei und erwartet langfristige Überzinsungen.


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

Mehr