Segue-se uma estratégia de tendência baseada em ZigZag

Autora:ChaoZhang, Data: 2023-10-30 14:51:08
Tags:

img

Resumo

Esta estratégia usa o indicador ZigZag para determinar a direção da tendência e segue a tendência uma vez confirmada.

Estratégia lógica

A estratégia usa principalmente o indicador ZigZag para determinar a direção da tendência de preços. ZigZag pode filtrar o ruído do mercado e identificar as principais direções de flutuação de preços.

Especificamente, a estratégia primeiro calcula os valores do ZigZag. Quando os preços atingem uma alta mais alta, o valor do ZigZag se torna o preço alto. Quando os preços atingem uma baixa mais baixa, o valor do ZigZag se torna o preço baixo. Assim, o ZigZag pode refletir claramente a direção principal da flutuação dos preços.

A estratégia determina a direção da tendência com base nos valores do ZigZag. Quando o ZigZag sobe, indica uma tendência ascendente. Quando o ZigZag cai, indica uma tendência descendente. A estratégia abre posições quando o ZigZag vira para seguir a direção da tendência.

Em particular, a estratégia vai longo quando o ZigZag vira para uma nova alta, e vai curto quando o ZigZag vira para uma nova baixa.

Análise das vantagens

  • O ZigZag pode filtrar eficazmente o ruído do mercado e determinar com precisão a direção da tendência principal.
  • O tempo de turno do ZigZag é preciso, permitindo oportunidades ótimas de entrada.
  • Implementa uma tendência pura, seguindo uma estratégia sem outros indicadores ou modelos complexos.
  • A lógica é simples e clara, fácil de entender e modificar.
  • A frequência de negociação pode ser controlada livremente através do ajuste de parâmetros.

Análise de riscos

  • O ZigZag é insensível a inversões de tendência de médio prazo, potencialmente perdendo inversões mais rápidas.
  • As estratégias que seguem a tendência não podem lidar com as perdas decorrentes de inversões de tendência.
  • Não limita o tamanho das perdas de operações individuais, que representam riscos de perda única elevados.
  • A estratégia baseia-se apenas num único indicador, o que corre o risco de ser excessivamente adaptável.

Os riscos podem ser reduzidos:

  • Combinação de outros indicadores para detectar riscos de reversão da tendência.
  • Redução do período de detenção, stop loss oportuno.
  • Adicionar gestão de risco para limitar o tamanho de uma única perda.
  • Adicionar modelos de aprendizagem de máquina para melhorar a robustez.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Para efeitos de controlo do risco de perda única, adicionar ordens stop-loss, por exemplo, ordens stop-limit ou stop-trailing.

  2. Adicionar mecanismos de detecção de inversão de tendência, por exemplo, MACD, médias móveis.

  3. Adicionar módulo de reentrada, posições de pirâmide quando a tendência continuar.

  4. Adicionar modelos de aprendizagem de máquina como LSTM para ajudar na detecção de tendências.

  5. Otimizar a gestão de capital com base em teorias de absorção ou correlação.

  6. Otimizar de forma abrangente parâmetros como o período ZigZag por backtesting e referenciamento de conhecimentos.

Resumo

A estratégia identifica a direção da tendência por ZigZag e negocia a tendência. A lógica é simples e fácil de implementar. Mas existem riscos como dependência de indicador único e reversão da tendência. Podemos otimizar por meio de stop loss, indicadores auxiliares, reentrada, modelos de aprendizado de máquina etc. para torná-lo mais robusto e racional. Com parâmetros e controles de risco adequados, pode rastrear efetivamente as tendências de médio e longo prazo.


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

Mais.