Siguiendo la estrategia de tendencia basada en ZigZag

El autor:¿ Qué pasa?, fecha: 2023-10-30 14:51:08
Las etiquetas:

img

Resumen general

Esta estrategia utiliza el indicador ZigZag para determinar la dirección de la tendencia y sigue la tendencia una vez confirmada.

Estrategia lógica

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.

Análisis de ventajas

  • ZigZag puede filtrar eficazmente el ruido del mercado y determinar con precisión la dirección de la tendencia principal.
  • El tiempo de turno de ZigZag es preciso, lo que permite oportunidades óptimas de entrada.
  • Implementa una estrategia de tendencia pura sin otros indicadores o modelos complejos.
  • La lógica es simple y clara, fácil de entender y modificar.
  • La frecuencia de negociación se puede controlar libremente mediante ajuste de parámetros.

Análisis de riesgos

  • ZigZag es insensible a las inversiones de tendencia a mediano plazo, potencialmente perdiendo inversiones más rápidas.
  • Las estrategias de seguimiento de tendencias no pueden manejar las pérdidas por inversiones de tendencias.
  • No limita el tamaño de la pérdida de las operaciones individuales, lo que plantea grandes riesgos de pérdida única.
  • La estrategia se basa únicamente en un indicador, los riesgos de sobreajuste.

Los riesgos pueden reducirse:

  • Combinar otros indicadores para detectar los riesgos de reversión de tendencia.
  • Acortando el período de retención, stop loss oportuno.
  • Añadir la gestión del riesgo para limitar el tamaño de una sola pérdida.
  • Añadir modelos de aprendizaje automático para mejorar la robustez.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Las órdenes de suspensión de pérdidas se incluirán en la lista de las órdenes de suspensión de pérdidas.

  2. Añadir mecanismos de detección de inversión de tendencia, por ejemplo, MACD, promedios móviles.

  3. Agregue el módulo de reingreso, posiciones piramidal cuando la tendencia continúe.

  4. Añadir modelos de aprendizaje automático como LSTM para ayudar a la detección de tendencias.

  5. Optimizar la gestión de capital basada en teorías de absorción o correlación.

  6. Optimice de manera integral parámetros como el período ZigZag mediante pruebas de retroceso y expertos en referencia.

Resumen de las actividades

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()

Más.