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.
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.
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.
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.
Esta estrategia puede optimizarse aún más en los siguientes aspectos:
Añadir filtros de indicadores de impulso como el MACD o las bandas de Bollinger para evitar algunas rupturas falsas.
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.
Aumentar los algoritmos de aprendizaje automático para juzgar la precisión de la tendencia y evitar las limitaciones humanas.
Mecanismo de stop loss adaptativo basado en la volatilidad del mercado.
Utilice algoritmos de aprendizaje profundo para optimizar la configuración general de parámetros.
Al combinar hábilmente la teoría fractal de Williams
/*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)