Los fractales de Williams combinados con el indicador ZZ para estrategias comerciales cuantitativas

El autor:¿ Qué pasa?, Fecha: 2024-01-29 15:24:30
Las etiquetas:

img

Resumen general

Esta es una estrategia de trading cuantitativa que combina el uso de la teoría fractal de Bill Williams y el indicador ZZ. Juzga las tendencias del mercado a través del cálculo de fractales de Williams e identifica puntos de ruptura potenciales dibujando líneas de soporte/resistencia utilizando el indicador ZZ para implementar operaciones de tendencia.

Principio de la estrategia

La estrategia primero calcula los fractales de Williams para determinar si el fractal actual está subiendo o bajando. Si es un fractal creciente, se cree que la tendencia actual es ascendente. Si es un fractal descendente, se cree que la tendencia actual es descendente.

Luego dibuja las líneas de soporte y resistencia del indicador ZZ basadas en los puntos fractales. Si el precio rompe la línea de resistencia correspondiente al fractal creciente, vaya largo. Si el precio rompe la línea de soporte correspondiente al fractal descendente, vaya corto.

A través de esta combinación, es posible capturar los cambios en las tendencias de manera oportuna e implementar operaciones que sigan las tendencias.

Análisis de ventajas

Esta estrategia combina dos métodos diferentes de análisis técnico - fractales de Williams e indicadores ZZ - para descubrir más oportunidades comerciales.

Puede juzgar oportunamente el punto de inflexión de las tendencias del mercado y tiene buenos criterios de stop loss / take profit para capturar la dirección principal de la tendencia.

En general, esta estrategia considera tanto el juicio de tendencia como las selecciones específicas de puntos de entrada para equilibrar los riesgos y los rendimientos.

Análisis de riesgos

El mayor riesgo de esta estrategia es que los juicios fractales y el indicador ZZ puedan emitir señales comerciales incorrectas, lo que conduce a pérdidas innecesarias.

Además, la forma en que se calculan los fractales puede conducir a juicios erróneos si el marco de tiempo se establece incorrectamente.

Para reducir estos riesgos, ajuste adecuadamente los parámetros de cálculo de los fractales y aumente las condiciones de filtrado para reducir las señales erróneas.

Direcciones de optimización

Esta estrategia puede optimizarse aún más en los siguientes aspectos:

  1. Añadir filtros de indicadores de impulso como el MACD o las bandas de Bollinger para evitar algunas rupturas falsas.

  2. Optimizar la configuración de los parámetros fractales y ajustar el cálculo de los máximos y mínimos y acortar el plazo para obtener juicios de tendencia más precisos.

  3. Aumentar los algoritmos de aprendizaje automático para juzgar la precisión de la tendencia y evitar las limitaciones humanas.

  4. Mecanismo de stop loss adaptativo basado en la volatilidad del mercado.

  5. Utilice algoritmos de aprendizaje profundo para optimizar la configuración general de parámetros.

Resumen de las actividades

Al combinar hábilmente la teoría fractal de Williams y el indicador ZZ, esta estrategia logra la detección y captura oportuna de los cambios en las tendencias del mercado. Manteene una alta tasa de ganancia y espera obtener retornos excedentes a largo plazo.


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

Más.