Esta estrategia utiliza el indicador ZigZag para determinar la dirección de la tendencia y sigue la tendencia una vez confirmada.
La estrategia utiliza principalmente el indicador ZigZag para determinar la dirección de la tendencia del precio.
Específicamente, la estrategia primero calcula los valores de ZigZag. Cuando los precios alcanzan un máximo más alto, el valor de ZigZag se convierte en el precio alto. Cuando los precios alcanzan un mínimo más bajo, el valor de ZigZag se convierte en el precio bajo. Por lo tanto, ZigZag puede reflejar claramente la dirección principal de la fluctuación de los precios.
La estrategia determina la dirección de la tendencia basada en los valores de ZigZag. Cuando ZigZag sube, indica una tendencia al alza. Cuando ZigZag cae, indica una tendencia a la baja. La estrategia abre posiciones cuando ZigZag gira para seguir la dirección de la tendencia.
En particular, la estrategia es larga cuando ZigZag se vuelve a un nuevo máximo, y corta cuando ZigZag se vuelve a un nuevo mínimo.
Los riesgos pueden reducirse:
La estrategia se puede optimizar en los siguientes aspectos:
Las órdenes de suspensión de pérdidas se incluirán en la lista de las órdenes de suspensión de pérdidas.
Añadir mecanismos de detección de inversión de tendencia, por ejemplo, MACD, promedios móviles.
Agregue el módulo de reingreso, posiciones piramidal cuando la tendencia continúe.
Añadir modelos de aprendizaje automático como LSTM para ayudar a la detección de tendencias.
Optimizar la gestión de capital basada en teorías de absorción o correlación.
Optimice de manera integral parámetros como el período ZigZag mediante pruebas de retroceso y expertos en referencia.
La estrategia identifica la dirección de la tendencia por ZigZag y negocia la tendencia. La lógica es simple y fácil de implementar. Pero existen riesgos como la dependencia de un solo indicador y la inversión de tendencia. Podemos optimizar a través de stop loss, indicadores auxiliares, reentrada, modelos de aprendizaje automático, etc. para hacerlo más robusto y racional. Con parámetros y controles de riesgos adecuados, puede rastrear efectivamente las tendencias a medio y largo plazo.
/*backtest start: 2022-10-23 00:00:00 end: 2023-04-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's ZZ Strategy v1.0", shorttitle = "ZZ str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(false, defval = false, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") tf = input('W', title='Timeframe for ZigZag') showzz = input(false, defval = false, title = "Show ZigZag") showbg = input(false, defval = false, title = "Show Background") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //ZigZag zigzag() => _isUp = close >= open _isDown = close <= open _direction = _isUp[1] and _isDown ? -1 : _isDown[1] and _isUp ? 1 : nz(_direction[1]) _zigzag = _isUp[1] and _isDown and _direction[1] != -1 ? highest(2) : _isDown[1] and _isUp and _direction[1] != 1 ? lowest(2) : na useAltTF = true zz = useAltTF ? (change(time(tf)) != 0 ? request.security(syminfo.tickerid, tf, zigzag()) : na) : zigzag() zzcolor = showzz ? black : na plot(zz, title = 'ZigZag', color = zzcolor, linewidth = 2) //Levels dot = zz > 0 ? zz : dot[1] uplevel = dot > dot[1] ? dot : uplevel[1] dnlevel = dot < dot[1] ? dot : dnlevel[1] colorup = close[1] < uplevel[1] and uplevel == uplevel[1] ? lime : na colordn = close[1] > dnlevel[1] and dnlevel == dnlevel[1] ? red : na plot(uplevel, color = colorup, linewidth = 3) plot(dnlevel, color = colordn, linewidth = 3) //Background size = strategy.position_size bgcol = showbg == false ? na : size != size[1] ? blue : na bgcolor(bgcol, transp = 50) //Trading lot = strategy.position_size != strategy.position_size[1] ? strategy.equity / close * capital / 100 : lot[1] if uplevel > 0 and dnlevel > 0 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = uplevel + syminfo.mintick) strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = dnlevel - syminfo.mintick) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all()