Participe de nossa página de fãs
Coloque um link para ele, e permita que outras pessoas também o avaliem
Avalie seu funcionamento no terminal MetaTrader 5
- Visualizações:
- 13
- Avaliação:
- Publicado:
-
Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance
Verifica se um indicador é repintado, em vez de aceitar a afirmação sem questionar. Ele se anexa a um gráfico, relê os buffers do indicador em teste nas barras que já foram fechadas e conta todas as alterações detectadas: valores que se movem, valores que aparecem e valores que desaparecem — juntamente com o ponto mais distante no histórico em que isso ainda ocorre.

Exemplos\ZigZag(12,5,3) no XAUUSD M1. O painel foi capturado aos 1 h 25 min 12 s da execução, 87 segundos antes de ser interrompida, razão pela qual os totais na tabela abaixo são ligeiramente superiores. As cores do painel foram definidas como preto sobre branco para a captura de tela; as configurações padrão são texto claro sobre um painel escuro.
O problema
“Sem repintura” é a afirmação mais frequente nas descrições de indicadores e a mais difícil de verificar. O teste usual consiste em observar o gráfico, lembrar-se aproximadamente de onde as setas estavam, recarregar o indicador e observar novamente. Esse teste não detecta os dois casos que, na verdade, custam dinheiro.
O primeiro é quando um valor em uma barra que fechou há algum tempo muda enquanto o gráfico permanece aberto. O olho não percebe isso: a seta se move alguns pixels ou é removida enquanto a atenção está voltada para a borda direita do gráfico.
O segundo é um indicador que se comporta normalmente enquanto está ativo e publica um histórico diferente após ser recarregado — exatamente o que uma mudança de intervalo de tempo, uma reinicialização do terminal ou um novo gráfico causam ao usuário.
Ambos são mensuráveis. O que é necessário é algo que registre o que o indicador publicou na primeira vez em que o fez e, em seguida, continue verificando.
O que ele mede
- Uma barra é identificada por seu horário de abertura, nunca por seu deslocamento; portanto, novas barras, rolagem e atualizações do histórico não podem ser confundidas com uma alteração.
- Apenas barras fechadas são comparadas, a partir do deslocamento 1 e superiores. A barra que ainda está se formando muda por definição e não indica repintura.
- O primeiro valor observado para uma barra fechada torna-se a referência. Cada leitura posterior é comparada com a leitura anterior, o que conta como um evento, e com a primeira leitura, o que mede o desvio.
- Três tipos de eventos são contados separadamente, pois não são igualmente prejudiciais:
- Alterado — um valor mudou para um valor diferente.
- Apareceu — um espaço vazio recebeu um valor, de modo que um sinal se materializou em uma barra que já estava fechada.
- Desapareceu — um valor publicado foi apagado. Esse é o pior tipo: o sinal com base no qual um trader agiu não está mais no histórico que o próximo leitor vê.
- O número principal é o MaxShift, a maior variação já observada em qualquer evento. Um indicador que apenas redesenha a última barra fechada é algo totalmente diferente de um que reescreve quinze barras do histórico.
- Cada evento é gravado em um arquivo CSV com a hora da barra, o buffer, o deslocamento na detecção e os valores antigo e novo, para que o relatório possa ser auditado em vez de simplesmente acreditado.
- O indicador em teste é criado com o IndicatorCreate a partir de uma lista de parâmetros analisados, de modo que qualquer indicador personalizado possa ser inspecionado sem a necessidade de editar ou recompilar nada. Os parâmetros analisados são impressos no diário no início, o que torna visível uma lista de parâmetros incorreta, em vez de ignorá-la silenciosamente.
- Opcionalmente, o identificador é liberado e recriado a cada N minutos. O histórico registrado não é reinicializado propositalmente, de modo que a execução também captura o indicador que permanece inativo enquanto está ativo e publica um passado diferente após uma recarga.
- Uma verificação é descartada e contada como ignorada, em vez de como evidência, sempre que o identificador do indicador ainda não existir, o indicador ainda não tiver sido calculado, houver menos barras fechadas do que a profundidade solicitada, um buffer não puder ser copiado ou a série se deslocar entre a leitura dos horários e a leitura dos valores.
A amostragem funciona assim: um valor que existe por menos tempo do que o intervalo de verificação pode ser perdido. Esse é um limite real e há uma medição dele mais adiante.
Exemplo medido
Tudo a seguir utiliza indicadores que vêm com o terminal, portanto, qualquer pessoa pode repetir o procedimento.
Ao vivo, XAUUSD M1, 1 hora e 26 minutos
Quatro cópias em quatro gráficos do mesmo terminal e do mesmo feed, 30/09/2026, das 02h19 às 03h46, horário do servidor; 300 barras fechadas observadas, uma verificação por segundo.
| Indicador em teste | Buffer | Comparações | Alterado | Apareceu | Desapareceu | MaxShift | Veredicto |
|---|---|---|---|---|---|---|---|
| Exemplos\ZigZag (12,5,3) | 0 | 1 315 713 | 0 | 0 | 17 | 15 | REPINTURAS |
| Exemplos\ZigZag (12,5,3) | 1 | 1 315 713 | 0 | 0 | 3 | 1 | REPINTURAS |
| Exemplos\ZigZag (12,5,3) | 2 | 1 315 713 | 0 | 0 | 10 | 3 | REPAINTS |
| Exemplos\Média móvel personalizada (13,0,2) | 0 | 1 305 513 | 0 | 0 | 0 | - | ESTÁVEL |
| Exemplos\Fractais, confirmação tardia | 0 | 1 303 713 | 0 | 13 | 0 | 3 | REPINTURAS |
| Exemplos\Fractais, confirmação tardia | 1 | 1 303 713 | 0 | 12 | 0 | 3 | REPINTURAS |
4.387, 4.353 e 4.347 verificações, respectivamente; 0 / 0 / 1 verificações ignoradas; 0 ressincronizações; 0 recargas de identificador. Os arquivos de eventos contêm 30, 0 e 25 linhas, o que equivale à soma das três colunas de eventos em cada caso.
As contagens de comparação não são números redondos e não deveriam ser: 87 novas barras M1 foram abertas durante a execução, e uma barra que acabou de ser aberta ainda não possui histórico de barras fechadas. Para cada instância, (verificações - 1) x 300 - 87 reproduz exatamente a contagem de comparação relatada.
Três assinaturas diferentes em uma tabela:
- O ZigZag apaga seu próprio histórico. 17 valores foram apagados do buffer do ZigZag plotado, um deles 15 barras após o fechamento daquela barra, e mais 13 dos dois buffers de cálculo atrás dela. Nada se moveu: um extremo do ZigZag é a Máxima ou a Mínima de sua barra e não pode se deslocar; portanto, ele é removido e republicado em outro lugar. É por isso que os eventos desaparecem e a coluna delta permanece vazia.
- Uma média móvel de barras fechadas não se move. 1.305.513 comparações, nenhum evento.
- Os fractais são um terceiro caso, e a ferramenta os separa do primeiro. 25 eventos, todos “Apareceram”, nenhum “Mudou”, nenhum “Desapareceu”, todos no deslocamento 3. Isso não é repintura, é confirmação tardia: um fractal precisa de mais duas barras antes de poder ser desenhado; portanto, o valor aparece legitimamente três barras atrás e, então, permanece. A coluna de veredicto ainda indica “REPAINTS”, porque a ferramenta relata o que observou e deixa o julgamento a cargo do leitor. Um indicador cujos eventos são todos do tipo “Apareceu” em um deslocamento fixo é utilizável com esse atraso embutido; um indicador cujos eventos são do tipo “Desapareceu” em deslocamentos dispersos não é.
Strategy Tester, a mesma medição em dez segundos
Exemplos\ZigZag(12,5,3), XAUUSD M1, 28/09/2026 a 29/09/2026, modelagem OHLC de 1 minuto, 300 barras fechadas observadas:
| contador | valor |
|---|---|
| veredicto | REPAINTS |
| verificações | 5.512 |
| comparações em barras fechadas | 1.651.923 |
| alteradas / surgiram / desapareceram | 0 / 3 / 342 |
| barras distintas que perderam um valor | 341 |
| barras distintas com pelo menos um evento | 343 |
| MaxShift | 28 |
| verificações / ressincronizações ignoradas | 0 / 0 |
| Linhas do CSV | 345 (= 342 + 3) |
Em um dia de negociação, o ZigZag excluiu 342 valores que já havia publicado em barras que estavam fechadas naquele momento, e uma dessas exclusões ocorreu 28 barras após o fechamento da barra em questão. Três valores apareceram em barras já fechadas. Apenas um dos três era um valor que voltou: a barra 17:06 perdeu 4126,184, recuperou exatamente o mesmo número vinte segundos depois e o perdeu novamente um minuto depois disso. É também por isso que Max |delta| apresenta o valor 0,00000000 para a execução; trata-se de uma medição, não de uma lacuna.

Os 345 eventos daquele dia, agrupados pelo turno em que foram detectados. A maioria das atualizações ocorre uma ou duas barras atrás, e é por isso que observar apenas a última barra fechada não é suficiente.

Exemplos\Média Móvel Personalizada (13,0,2), mesmo símbolo e mesma janela de execução que o ZigZag acima: 1.291.114 comparações no momento da captura de tela e nenhum valor alterado. A contagem de comparações é exibida ao lado do veredicto propositalmente — “ESTÁVEL” só tem valor se for acompanhado do número ao lado.
O que a opção “Tratar 0,0 como nenhum valor” altera e qual é a magnitude da lacuna de amostragem
A quarta cópia executou o mesmo ZigZag com essa opção desativada, de modo que 0,0 é considerado um valor comum: 1.308.513 comparações, 18 + 3 + 11 = 32 eventos, todos eles “Alterados”, o mesmo MaxShift de 15 e um Max |delta| de 4.184,08800000 no buffer principal. Esse número é o valor de referência, pois a “alteração” é um pico sendo substituído por 0,0. Ambas as configurações descrevem a mesma atualização; a configuração padrão a nomeia corretamente.
As duas cópias não viram exatamente a mesma lista, e vale a pena saber disso. A quarta cópia registrou dois eventos que a primeira não detectou: a barra 03:32:00 nos buffers 0 e 2, detectada às 03:33:01. As duas cópias foram iniciadas com 14 segundos de diferença, e o valor existiu por menos de um intervalo de verificação; por isso, uma delas o registrou e a outra não. Com um intervalo de um segundo no M1, essa é a resolução do instrumento.

A mesma leitura do ZigZag com 0,0 foi contabilizada como um valor. Agora, cada exclusão aparece como “Alterada” com um delta do tamanho do preço. Útil como verificação cruzada, mas enganoso como descrição.
Auditoria dos números
Os contadores também não foram aceitos sem questionamentos. Uma reimplementação independente em Python do Examples\ZigZag, executada sobre as velas brutas obtidas do terminal, foi comparada com os arquivos de eventos:
- Execução ao vivo: para cada uma das 17 barras em que o buffer plotado perdeu um valor, esse valor está ausente na reprodução de hoje, e para todas as 17, a última leitura da ferramenta é igual ao valor reproduzido.
- Execução de teste: 343 barras com eventos, as mesmas duas verificações, sem discrepâncias — 341 valores perdidos ausentes na reprodução e 343 das 343 últimas leituras iguais a ele.
Entradas
| Entrada | Padrão | Descrição |
|---|---|---|
| Indicador a ser inspecionado (caminho iCustom, sem .ex5; exemplo: Examples\ZigZag) | vazio | Caminho do indicador personalizado em relação a MQL5\Indicators, sem a extensão, exatamente como o iCustom espera. Deixado em branco propositalmente: se nada for preenchido, a ferramenta informa isso no diário e no painel e não realiza nenhuma medição, em vez de apontar para um indicador que talvez não esteja no seu terminal. Se o caminho estiver incorreto em um gráfico ao vivo, a ferramenta permanece conectada e tenta novamente a cada 30 segundos, de modo que a entrada possa ser corrigida sem precisar removê-la. Medido no XAUUSD M1 com um caminho incorreto: a ferramenta exibiu o código de erro uma vez; o terminal adicionou sua própria mensagem “não é possível carregar” a cada tentativa (com intervalos de 30,4 e 30,7 segundos); e, ao corrigir o caminho, a medição foi iniciada sem que nada fosse desanexado. |
| Parâmetros, separados por vírgulas (vazio = padrões do indicador) | vazio | A lista de entradas do indicador em teste, por exemplo, 12,5,3. Cada item é tipado de acordo com seu conteúdo: true e false tornam-se bool, um número contendo um ponto ou um expoente torna-se double, um número simples torna-se int, qualquer outra coisa torna-se uma string, e as aspas ao redor são removidas. A lista analisada é impressa no diário no início, de modo que uma lista incorreta fica visível imediatamente. Vazio significa que o indicador é executado com seus próprios valores padrão. |
| Número de buffers a serem monitorados (1..32) | 1 | Quantos buffers são lidos. Os buffers de cálculo também são contabilizados. Um buffer que o indicador não possui faz com que toda a verificação falhe: isso é contabilizado como uma verificação ignorada e as primeiras ocorrências são registradas no diário com o código de erro, de modo que fica visível em vez de passar despercebido. |
| Símbolo (vazio = símbolo do gráfico) | vazio | Inspecionar um indicador em outro símbolo sem abrir seu gráfico. |
| Intervalo de tempo | Atual | Analisar um indicador em outro período. |
| Barras fechadas observadas (shift 1..N) | 300 | Profundidade da verificação. O número de barras multiplicado pelos buffers é limitado a 200.000 slots; acima desse limite, a profundidade é reduzida e uma linha é gravada no diário. |
| Tempo mínimo em segundos entre verificações, tempo simulado no testador (0 = a cada tick) | 1 | Limitação. Um segundo detecta qualquer atualização de tela à qual um usuário humano poderia reagir e consome muito menos CPU do que a cada tick, mas um valor que exista por menos tempo do que o intervalo pode passar despercebido. No Strategy Tester, o relógio simulado é usado em vez do relógio real, portanto, a mesma configuração funciona lá. |
| Ignorar |mudança| menor que este valor (0 = contar todas as mudanças) | 0,0 | Tolerância absoluta nas unidades do buffer, para um indicador que recalcula a partir de ponto flutuante e apresenta oscilações nos últimos dígitos. 0 conta todas as diferenças. Uma alteração não maior que a tolerância não é registrada de forma alguma — nenhum evento, nenhuma linha no CSV, nenhuma contribuição para o |delta| máximo. |
| Trate 0,0 como “sem valor” (buffers do tipo arrow/ZigZag) | true | Muitos indicadores de sinal publicam 0,0 em vez de EMPTY_VALUE para “sem sinal”. Com essa opção ativada, 0,0 é considerado vazio e esses eventos são relatados como “Apareceu” e “Desapareceu”. Desative-a para um buffer em que exatamente zero seja um valor válido. |
| Recriar o identificador do indicador a cada N minutos (0 = nunca) | 0 | Libera o identificador e solicita um novo ao terminal, o que aciona um recálculo completo, a menos que outro programa ainda mantenha o mesmo indicador com os mesmos parâmetros. O histórico registrado não é apagado; portanto, é isso que captura o indicador que permanece estável enquanto está em execução e se altera após uma recarga. |
| Interromper a medição após N minutos (0 = executar até ser removido) | 0 | Encerra a medição e congela o relatório, o que é conveniente para uma execução autônoma. |
| Gravar todos os eventos em MQL5\Files (CSV) | true | O arquivo de eventos. |
| Nome do arquivo CSV (vazio = automático) | vazio | Os nomes automáticos são criados a partir do símbolo, do período e da hora de início. Se um arquivo com esse nome estiver aberto no momento, porque outra cópia foi iniciada no mesmo minuto, um sufixo numérico é adicionado, em vez de a cópia ser executada sem nenhum arquivo. Um arquivo fechado com o mesmo nome, proveniente de uma execução anterior no mesmo minuto, será sobrescrito; portanto, forneça um nome próprio quando a execução for importante. |
| Interromper a gravação após este número de linhas | 100000 | Proteja-se contra um indicador que se atualiza a cada tick. A contagem continua após o limite; apenas o arquivo para de crescer, e uma linha no diário informa isso. |
| Mostrar o painel de relatório no gráfico | true | Desative-o para uma execução autônoma ou de teste. |
| Distância do painel X, em pixels a 96 dpi | 12 | Posição. O painel é redimensionado de acordo com os dpi da tela. |
| Distância Y do painel, em pixels a 96 dpi | 20 | Posição. |
| Tamanho da fonte, pontos (4 ou mais; o painel é redimensionado de acordo com o dpi da tela) | 9 | O painel é uma tabela em fonte monoespaçada. Reduza-o em uma tela de alta resolução ou em um gráfico pequeno; as capturas de tela acima usam 4. |
| Canto do painel | Canto superior esquerdo | Canto de referência. |
| Cor de fundo do painel | cinza escuro | Cores do painel. Uma instância por gráfico, como em qualquer Expert Advisor; vários gráficos podem executar instâncias ao mesmo tempo. |
| Cor da borda do painel | cinza claro | |
| Cor do texto do painel | cinza claro | |
| Cor do cabeçalho quando todos os buffers estão estáveis | verde-limão | |
| Cor do cabeçalho quando um buffer é atualizado | tomate |
O relatório
Este é o bloco de resumo que a ferramenta imprimiu no diário quando a execução ao vivo do ZigZag acima foi interrompida, copiado literalmente. O painel no gráfico mostra a mesma tabela, com o tempo de execução alinhado à direita:
=== Resumo do Repaint Inspector ===================================== Repaint Inspector Exemplos\ZigZag (12,5,3) XAUUSD M1 300 barras fechadas monitoradas em execução há 01:26:39 verificações 4.387 ignoradas 0 ressincronizações 0 recargas de identificador 0 Buf Veredicto Comparações Alteradas Apareceram Desapareceram MaxShift Max |delta| 0 REPAINTS 1.315.713 0 0 17 15 - 1 REPAINTS 1.315.713 0 0 3 1 - 2 REPAINTS 1 315 713 0 0 10 3 - CSV: RepaintInspector_XAUUSD_M1_20260930_0219.csv (30 linhas) iniciado em 30/09/2026 às 02:19:31 (hora do servidor), 4.387 verificações, 0 ignoradas, 0 ressincronizações, 0 recargas de identificador total de eventos 30, linhas do CSV 30 buffer 0: REPAINTS, comparações 1.315.713, alterados 0, aparecidos 0, desaparecidos 17, barras afetadas 17 buffer 0: deslocamento máximo 15 (DESAPARECIDO na barra em 30/09/2026 às 02:59) buffer 0: |delta| máximo nenhum buffer 0: primeiro evento em 30/09/2026 às 02:23:02, último evento em 30/09/2026 às 03:46:03
O arquivo de eventos em MQL5\Files contém uma linha por evento:
detect_time;bar_time;shift_at_detect;buffer;event;old_value;new_value;delta;drift_from_first;after_reload 28/09/2026 17:11:20;28/09/2026 17:06:00;5;0;VANISHED;4126,18400000;EMPTY;;;0
Um valor vazio é registrado como EMPTY e uma diferença indefinida é deixada em branco, para que nenhum leitor confunda um número ausente com um zero. Um segundo arquivo, <nome>_summary.csv, contém uma linha por buffer com cada contador, além do indicador, seus parâmetros, símbolo, intervalo de tempo e profundidade, atualizado a cada 15 segundos enquanto a execução está em andamento, para que os números possam ser recontados a partir do arquivo de eventos sem a necessidade de analisar um log. O diário obtém o bloco inicial, os primeiros 20 eventos na íntegra e o resumo acima quando a ferramenta é removida.
Como usá-lo
- Coloque o indicador que você deseja verificar na pasta MQL5\Indicators e anote sua lista de parâmetros.
- Anexe o Repaint Inspector a um gráfico do símbolo e do período em que você realmente opera, preencha o caminho e os parâmetros e defina o número de buffers.
- Deixe-o rodar durante as horas em que você negocia. A repintura é uma característica da atividade do mercado, não do relógio, e uma noite tranquila de domingo não prova nada.
- Leia primeiro o MaxShift, depois a divisão entre “Changed”, “Appeared” e “Vanished”, em seguida abra o CSV e examine algumas linhas.
- Se o indicador passar por isso, defina o tempo de atualização para 30 minutos e execute-o novamente.
Limites, explicados de forma clara
- A ferramenta não pode provar a ausência de repintura. Ela apenas pode não encontrar nenhuma durante o período medido, e é por isso que a contagem de comparações aparece ao lado de cada veredicto.
- Ela faz amostragens no intervalo de verificação. Um valor que aparece e desaparece dentro de um intervalo pode passar despercebido, e a medição acima mostra que isso ocorre duas vezes em uma hora e meia.
- Ela mede o que um indicador publica por meio de seus buffers. Um indicador que desenha objetos no gráfico em vez de preencher buffers é invisível para ela.
- O Strategy Tester é útil aqui porque comprime um dia em segundos, mas uma repintura no testador e uma repintura em tempo real não são automaticamente a mesma coisa. Quando a resposta for importante, execute a estratégia em tempo real.
- No Testador de Estratégias, o indicador em teste precisa estar presente e compilado antes do início da execução. O testador trata uma falha no IndicatorCreate como um erro crítico e descarrega o expert, o que nenhum tratamento de erros dentro da ferramenta pode alterar: quando medido com um caminho deliberadamente incorreto, a criação do identificador em OnInit gera “erro de criação do indicador” seguido de “erro crítico em OnInit”; já a criação na primeira verificação gera os mesmos seis registros de erro terminando em “erro crítico no OnTester”. Em um gráfico ao vivo, o mesmo caminho incorreto não é fatal: a ferramenta permaneceu conectada e tentou novamente, e o caminho corrigido começou a medir normalmente.
- Isso não diz nada sobre se um indicador é lucrativo. Um indicador que não repinta ainda pode ser inútil, e alguns indicadores que repintam são usados deliberada e corretamente.
- Não são necessárias funções de negociação, DLL, acesso à rede nem arquivos externos. Ele lê buffers e grava arquivos CSV na pasta MQL5\Files.
Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/77842
ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city
Mostra onde os stops provavelmente estão posicionados e quais acabaram de ser acionados. Reservatórios de liquidez = máximas e mínimas de oscilação confirmadas que o preço ainda não ultrapassou, máximas/mínimas iguais (um reservatório maior) e a máxima e a mínima de ontem. Quando uma barra ultrapassa um pool, ela é marcada como “varrida” e como “capturada e rejeitada” se a mesma barra fechar novamente dentro do pool. Sem repintura: um swing só é considerado após N barras fechadas de cada lado. O painel é uma cidade de néon desenhada em um CCanvas: o preço é um carro voador, os stops de venda são torres abaixo dele, os stops de compra são plataformas flutuantes acima dele, os níveis de ontem são outdoors dourados, um holofote varre o céu e um ticker exibe as negociações do dia. Dois buffers fornecem o conjunto ativo mais próximo acima e abaixo para uso em um Expert Advisor. Apenas indicador: ele nunca opera.
Symbol Spec Auditor
Um painel gráfico que exibe os detalhes das especificações do contrato que determinam o tamanho da posição e os custos de negociação (valor do ponto, custo do spread, margem, swap, regras de execução) na moeda da conta, alerta sobre configurações da corretora que violam silenciosamente as regras de tamanho do lote e exporta a auditoria de cada símbolo do Market Watch para um arquivo CSV.
Accumulation/Distribution
O Indicador Accumulation/Distribution (Acumulação/Distribuição ou A/D) é determinado pelas mudanças de preço e volume.
Accelerator Oscillator (AC)
O Indicador Acceleration/Deceleration (Aceleração/Desaceleração ou AC) mede a aceleração e a desaceleração da força motriz atual do mercado.