
Se trata de una estrategia de trading cuantitativa que combina la teoría de la fractura de Bill Williams y el indicador ZZ. Esta estrategia determina la tendencia del mercado mediante el cálculo de la fracción de Williams y, junto con el indicador ZZ, traza líneas de resistencia de soporte para descubrir posibles puntos de ruptura y, por lo tanto, realizar operaciones de seguimiento de tendencias.
La estrategia primero calcula la fracción de Williams para determinar si el momento es ascendente o descendente. Si es ascendente, se considera que está en una tendencia alcista; si es descendente, se considera que está en una tendencia descendente.
Luego, trace las líneas de soporte y resistencia del indicador ZZ en función del punto de ruptura. Si el precio rompe la línea de resistencia de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura de la ruptura.
Con esta combinación, se puede capturar el cambio de tendencia en el momento oportuno y realizar operaciones de seguimiento de tendencias.
Esta estrategia combina el uso de dos métodos de análisis técnico diferentes, la fracción de Williams y el indicador ZZ, para explorar más oportunidades de negociación.
Es capaz de juzgar la evolución de la tendencia del mercado en el momento oportuno y establecer buenas condiciones de parada de pérdidas, lo que ayuda a comprender la dirección de la tendencia principal. Además, el indicador ZZ puede filtrar algunas situaciones de falsas rupturas y evitar pérdidas innecesarias.
En general, esta estrategia tiene en cuenta tanto las tendencias como las opciones de puntos de entrada concretos, haciendo un balance entre riesgos y beneficios.
El mayor riesgo de esta estrategia es que el juicio de fractura y el indicador ZZ pueden emitir señales de negociación erróneas, lo que lleva a pérdidas innecesarias. Por ejemplo, después de romper la línea de resistencia, el precio puede retroceder rápidamente y no subir de manera continua.
Además, el cálculo de la fracción puede ser erróneo debido a la configuración incorrecta del ciclo de tiempo. Si el ciclo de tiempo es demasiado corto, aumenta la probabilidad de una falsa ruptura.
Para reducir estos riesgos, se pueden ajustar los parámetros de cálculo de la fractura, o se pueden reducir las señales erróneas mediante el aumento de las condiciones de filtración. Además, se puede configurar una mayor amplitud de stop loss para controlar las pérdidas individuales.
Esta estrategia puede ser optimizada aún más en los siguientes aspectos:
El aumento de los filtros de indicadores de potencia, como el MACD o el indicador de la banda de Bryn, puede evitar algunas falsas rupturas.
Optimizar la configuración de los parámetros de fracción, ajustar el cálculo de los puntos altos y bajos, reducir los períodos de tiempo para obtener un juicio de tendencias más preciso.
Aumentar la precisión de los algoritmos de aprendizaje automático para determinar tendencias, utilizando el juicio de la IA para evitar las limitaciones establecidas por los humanos.
Se añade un mecanismo de amortización de pérdidas que permite ajustar el amortización de pérdidas según la volatilidad del mercado.
Utiliza algoritmos de aprendizaje profundo para optimizar la configuración de los parámetros globales.
Esta estrategia, a través de una combinación ingeniosa de la teoría de la separación de Williams y el indicador ZZ, permite un juicio oportuno y la captura de los cambios en las tendencias del mercado. Se mantiene una alta tasa de ganancias y se espera que obtenga un excedente de ganancias estables 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)