Fractals de Williams combinés avec l'indicateur ZZ pour les stratégies de négociation quantitatives

Auteur:ChaoZhang est là., Date: 2024-01-29 15h24h30
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de trading quantitative qui combine l'utilisation de la théorie fractale de Bill Williams et de l'indicateur ZZ. Il juge les tendances du marché à travers le calcul des fractales de Williams et identifie les points de rupture potentiels en dessinant des lignes de support/résistance à l'aide de l'indicateur ZZ pour mettre en œuvre des transactions suivant la tendance.

Principe de stratégie

La stratégie calcule d'abord les fractales de Williams pour déterminer si le fractal actuel est en hausse ou en baisse.

Il dessine ensuite les lignes de support et de résistance de l'indicateur ZZ en fonction des points fractaux. Si le prix traverse la ligne de résistance correspondant au fractal en hausse, passez long. Si le prix traverse la ligne de support correspondant au fractal en baisse, passez court.

Grâce à une telle combinaison, il est possible de saisir les changements de tendance en temps opportun et de mettre en œuvre des transactions suivant la tendance.

Analyse des avantages

Cette stratégie combine deux méthodes d'analyse technique différentes - les fractales Williams et les indicateurs ZZ - pour découvrir davantage d'opportunités de trading.

Il peut juger en temps opportun du tournant des tendances du marché et dispose de bons critères de stop loss/take profit pour capturer la direction principale de la tendance.

En général, cette stratégie prend en considération à la fois le jugement de tendance et les choix spécifiques de points d'entrée pour équilibrer les risques et les rendements.

Analyse des risques

Le plus grand risque de cette stratégie est que les jugements fractaux et l'indicateur ZZ puissent émettre de mauvais signaux de trading, conduisant à des pertes inutiles.

En outre, la façon dont les fractales sont calculées peut conduire à des jugements erronés si le délai n'est pas correctement défini.

Pour réduire ces risques, ajustez de manière appropriée les paramètres de calcul des fractales et augmentez les conditions de filtrage pour réduire les signaux erronés.

Directions d'optimisation

Cette stratégie peut être encore optimisée dans les domaines suivants:

  1. Ajoutez des filtres d'indicateurs de dynamique tels que le MACD ou les bandes de Bollinger pour éviter de fausses ruptures.

  2. Optimiser les paramètres fractaux et ajuster le calcul des hauts et des bas et raccourcir le délai pour obtenir des jugements de tendance plus précis.

  3. Augmenter les algorithmes d'apprentissage automatique pour juger de l'exactitude des tendances et éviter les limitations humaines.

  4. Ajouter un mécanisme de stop loss adaptatif basé sur la volatilité du marché.

  5. Utilisez des algorithmes d'apprentissage profond pour optimiser les paramètres globaux.

Résumé

En combinant habilement la théorie fractale de Williams et l'indicateur ZZ, cette stratégie permet de détecter et de capturer en temps opportun les changements dans les tendances du marché.


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

Plus de