ZigZag, ZZ
A ideia principal da estratégia é pegar o mais cedo possível um movimento forte de tendência do mercado e manter a posição durante toda a tendência. A operação é aberta no momento do rompimento de níveis construídos previamente a partir das máximas/mínimas anteriores do preço.
A base é uma lógica parecida com o indicador ZigZag:
● Quando o mercado começa a virar para cima, é registrada uma mínima local
● Quando vira para baixo, uma máxima local
Esses pontos viram referências. Deles se formam os níveis que o mercado precisa romper para confirmar o movimento.
Reversível (flip long ↔ short)
A posição está sempre aberta e vira de short para long e vice-versa. (Se não forem usados modificadores da estratégia - eles estão descritos abaixo no bloco «Parâmetros e modificadores»)
⚠️ A estratégia gera operações com prejuízo quando o mercado está lateral e durante reversões em V.
Tipo de ordem: ordem Stop a Mercado (em algumas corretoras também pode se chamar ordem Condicional ou de Gatilho)
● Em verde está onde é colocada a ordem condicional de compra: o rompimento da última máxima relevante.
● Em vermelho, a de venda: o preço rompe a última mínima.
Depois de iniciar a estratégia, se não houver posição e o preço estiver entre os níveis, serão colocadas 1 ordem para abrir posição long e 1 para short. Se o preço não estiver entre os níveis ou houver posição aberta, será colocada 1 ordem.
Se houver posição aberta, pela estratégia deve existir apenas 1 ordem. Por padrão o tamanho dessa ordem = tamanho da posição * 2, para virar a posição (fechar e abrir uma nova do mesmo tamanho).
Strategy Trend Zig Zag e ZZ - qual a diferença
Strategy Trend Zig Zag (zigzag, selecionada por padrão ao criar o robô) - versão simples com o mínimo de configurações, equivalente ao script «Estratégia de tendência simples» no TradingView.
Os níveis são construídos da mesma forma que no ZZ2, e a posição é virada por ordens stop. Os modificadores e filtros do bloco «Parâmetros e modificadores» não são usados nela.
length- profundidade de busca da reversão (padrão 5)detection- comprimento da EMA de suavização (padrão 3)
ZZ (zz) - versão completa: dois tipos de níveis (ZZ2 e ZZ6) e todos os modificadores, filtros e configurações de tamanho de posição descritos abaixo.
Tipos de níveis: ZZ2 e ZZ6
ZZ2 (padrão) - os níveis são construídos pelos pontos de reversão do preço suavizado. O algoritmo é explicado em detalhe no bloco «Para os curiosos».
depth - profundidade de busca da reversão (padrão 5)
detection, detection_type, detection_source - comprimento, tipo (EMA por padrão) e fonte de preço da linha de suavização cujas reversões definem os pontos
rsi_len, rsi_value - condição adicional de RSI para o ponto de reversão. Não é usada quando rsi_value = 0
ZZ6 - os níveis são construídos por dois canais de máximas/mínimas: um rápido de comprimento zz6_len e um lento de comprimento zz6_len_slow (se não definido, zz6_len * 3).
O nível é fixado quando o canal rápido e o lento coincidem (o preço renovou o extremo) e o canal rápido começa a virar.
No ZZ6 o tamanho da posição depende do risco: quanto maior a distância entre os níveis (e portanto mais longe o stop), menor o lote.
zz6_risklong,zz6_riskshort- risco em % por operação. Lote = lote base * (risco % / distância entre os níveis em %)zz6_risk_one- usar para short o mesmo risco que para long (zz6_risklong)zz6_risk_max- limite superior para esse multiplicador de lote
Parâmetros e modificadores
Modo de operação
reverse- modo reverso (contra a tendência). No rompimento do nível superior o robô abre short, no rompimento do inferior, long. As ordens neste modo são a mercadoalways_in_position- se não há posição e o preço já passou do nível (por exemplo após fechar por stop ou take profit), o robô entra imediatamente com ordem a mercado na direção do rompimentoone_entry_long,one_entry_short- uma entrada por cada novo nível. Se a posição desse nível já foi fechada (por exemplo por take profit ou stop), o robô não entra de novo no mesmo nívelsingle_entry- reforça a opção anterior: a proibição de nova entrada é retirada não por um novo nível, mas só depois de uma entrada no sentido oposto
Ajuste dos níveis
level_offset_long,level_offset_short- deslocamento do nível por um valor fixo de preçolevel_multiplier_long,level_multiplier_short- deslocamento do nível em porcentagem. 1 - sem deslocamento, 1.01 - 1% acimaangle_long,angle_short- inclinação do nível. O nível é multiplicado por esse valor a cada nova vela e se desloca aos poucos em direção ao preço. 1 - nível horizontal
Filtros de entrada
Quando um filtro proíbe a entrada, o robô não abre nova posição, mas a ordem de fechamento da posição atual no nível oposto permanece.
use_distance_filter,distance_filter- não entrar se a distância entre os níveis for maior que a % definida (stop muito distante)use_flat_filter,flat_filter- não entrar se a distância entre os níveis for menor que a % definida (sinal de mercado lateral)use_narrowing- operar só quando os níveis se estreitam: a última máxima abaixo da anterior e a última mínima acima da anterioruse_ma_filter,ma_filter- não virar se a MA rápida já se afastou da lenta mais do que a % definida contra a nova direçãouse_ma_distance_filter,ma_distance_filter- não entrar se a MA rápida e a lenta estiverem mais próximas que a % definida (sem impulso)ma_fast_*,ma_slow_*- tipo, comprimento e fonte da MA rápida e da lenta para os dois filtros acimafilter_only_open- os filtros de distância valem só para a abertura da posição; virar a partir de uma posição já aberta é permitido- Filtro de tendência (bloco
filter, comum para ZZ e HiDeep) - veja a seção «Fechamento da posição e opções gerais»
Tamanho da posição
use_auto_risk- risco automático para ZZ2. O multiplicador de lote muda suavemente deauto_risk_coeff_startatéauto_risk_coeff_endconforme a distância entre os níveis: deauto_risk_procent_startatéauto_risk_procent_end%. Canal estreito - lote maior, largo - lote menorcount_pnl_profit,count_pnl_loss- ao virar, somar ao tamanho da nova posição o lucro ou o prejuízo da atualsize_control- proteção contra duplicação: se a posição por acidente ficar maior que duas entradas, o excesso é fechado com ordem a mercado
Fechamento da posição
use_tp_between_levels,tp_between_levels_value- fechar a posição com lucro se o preço voltou para dentro do canal entre os níveis e o lucro não é menor que a % definidastop_by_new_level- stop pelo novo nível. Se depois da entrada o preço rompeu um novo nível na direção da posição e depois voltou a ele, a posição é fechadaclose_on_wrong_side- fechar a posição se o preço passou do nível oposto em mais de 1% (por exemplo a ordem stop não disparou por causa de um gap)use_close_on_levels_crossing- fechar a posição se os níveis se cruzaram (o superior ficou abaixo do inferior)from_level_price- calcular o take profit e o lucro mínimo a partir do preço do nível, e não do preço real de entrada
Backtest
Testar no backtester integrado
Script (PineScript) para testar a estratégia em dados históricos no testador de estratégias do TradingView:
Recomendações:
(não são rígidas e podem ser quebradas para fins de pesquisa)
Timeframe de trabalho: 4h ou maior.
Para os curiosos
Algoritmo de construção dos níveis da estratégia ZZ2. Não é usado o indicador ZigZag padrão. Pelo código dá para ver como tudo é simples e que o repaint está descartado. Mas os níveis são construídos com atraso de algumas velas (isso não atrapalha em nada a estratégia)
São usadas três EMAs suavizadas em sequência. Isso cria uma suavização forte, reduzindo o ruído.
A variável z registra os pontos de reversão. Se a EMA vira para cima → é tomada a mínima local (l). Se vira para baixo → a máxima local (h). Esses pontos (l e h) viram a base para a construção dos níveis.
Teste a estratégia com dados históricos no testador e execute-a no hamster-bot.