
A estratégia usa o indicador ZigZag para determinar a direção da tendência e, após a confirmação da tendência, faz o acompanhamento da tendência.
A estratégia é baseada em um indicador ZigZag que filtra o ruído do mercado e determina a direção das principais flutuações de preços. O ZigZag emite um sinal de negociação quando os preços atingem novos altos ou baixos.
Concretamente, a estratégia primeiro calcula o valor de ZigZag, quando o preço cria um alto mais alto, ZigZag para o preço do alto; quando o preço cria um baixo mais baixo, ZigZag para o preço do baixo. Assim, o ZigZag pode refletir claramente a direção principal da oscilação do preço.
A estratégia determina a direção da tendência com base no valor do ZigZag. Quando o ZigZag sobe, indica que está em uma tendência de alta; Quando o ZigZag desce, indica que está em uma tendência de baixa. A estratégia abre uma posição quando o ZigZag se reverte para acompanhar a direção da tendência.
Especificamente, a estratégia é abrir uma ordem excedente quando a rotação de ZigZag forma uma nova alta e abrir uma ordem vazia quando a rotação de ZigZag forma uma nova baixa. A condição de posição livre é a rotação de ZigZag novamente. Isso permite uma estratégia de negociação automática baseada na tendência de ZigZag.
O risco pode ser reduzido através das seguintes medidas:
A estratégia pode ser melhorada em vários aspectos:
Aumentar a estratégia de stop loss para controlar o risco de perdas individuais. Pode-se definir um stop loss móvel ou um stop loss pendente.
Adição de mecanismo de julgamento de reversão de tendência. Indicadores como MACD, média móvel e outros podem ser incluídos para fechar posições quando a tendência é julgada.
Adicionar o módulo de reentrada. Quando a tendência continua, pode-se aumentar a posição apropriada para obter mais lucro.
Adicionar modelos de aprendizagem de máquina. Pode treinar modelos de aprendizagem profunda, como o LSTM, auxiliando o ZigZag a determinar a direção das tendências.
Mecanismos de otimização de gestão de fundos. O tamanho da posição pode ser otimizado de acordo com a retirada ou a teoria da correlação.
Os parâmetros de otimização global são definidos. Os parâmetros de otimização podem ser verificados com o histórico e com a referência a livros especializados, como o comprimento do ciclo de ZigZag.
A estratégia usa o indicador ZigZag para determinar a direção da tendência e implementa uma estratégia de negociação baseada na tendência. A lógica da estratégia é simples, clara e fácil de implementar. Mas também há problemas de dependência de um único indicador, risco de reversão da tendência. Podemos fazer otimização multidimensional em termos de stop loss, indicadores auxiliares, módulos de reentrada, aprendizado de máquina, etc., para tornar a estratégia mais robusta e racional.
/*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()