Repaint Inspector
- Utilitários
-
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself. - Versão: 1.0
O Repaint Inspector mede se um indicador repinta, em vez de aceitar essa afirmação na confiança. Você o anexa a um gráfico, informa qualquer indicador personalizado e a sua lista de parâmetros, e ele relê os buffers desse indicador em barras que já fecharam, contando cada valor que muda, cada valor que aparece e cada valor que desaparece, e também até que ponto para trás no histórico isso ainda acontece.
É uma ferramenta de medição. Em um gráfico, ela nunca envia uma ordem. No Testador de Estratégia, ela abre e fecha uma posição de volume mínimo no início, porque o teste automático do MQL5 Market verifica se um Expert Advisor executa uma operação de negociação; essa operação é anunciada no diário, não faz parte da medição e pode ser desativada por um parâmetro de entrada. Não usa DLL nem acesso à rede, e não grava nada em disco além dos seus dois arquivos CSV em MQL5\Files.
Por que existe: a ausência de repintura é uma afirmação comum na descrição de um indicador, e difícil de verificar. O teste habitual é olhar o gráfico, lembrar mais ou menos onde estavam as setas, recarregar e olhar de novo. Esse teste deixa passar os dois casos que custam dinheiro. No primeiro, um valor numa barra que fechou há algum tempo muda enquanto o gráfico continua aberto: a seta se move alguns pixels, ou é removida enquanto a sua atenção está na borda direita. No segundo, um indicador se comporta bem enquanto está ativo e publica um histórico diferente depois de ser recarregado, que é exatamente o que o usuário enfrenta numa troca de timeframe, num reinício do terminal ou num gráfico novo. Ambos são mensuráveis.
Como a medição é definida, que é a parte que decide se o resultado significa alguma coisa:
- Uma barra é identificada pelo seu horário de abertura, nunca pelo seu shift, de modo que barras novas, rolagem do gráfico e preenchimentos do histórico não podem ser confundidos com uma mudança.
- Somente barras fechadas são comparadas, shift 1 e acima. A barra que ainda está se formando muda por definição e não diz nada sobre repintura.
- O primeiro valor visto para uma barra fechada torna-se a referência. Cada leitura posterior é comparada com a leitura anterior, comparação que conta um evento, e, sempre que um evento é contado, com a primeira leitura, comparação que mede a deriva.
- Três tipos de evento são contados separadamente, porque não são igualmente graves. Changed: um valor mudou para outro valor. Appeared: um slot vazio recebeu um valor, ou seja, um sinal surgiu numa barra que já estava fechada. Vanished: um valor publicado foi apagado, que é o tipo grave, porque 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, o maior shift em que algum evento já foi visto. Um indicador que só redesenha a última barra fechada é algo bem diferente de um que reescreve quinze barras.
- Cada evento é gravado num arquivo CSV com o horário da detecção, o horário da barra, o shift no momento da detecção, o buffer, o tipo de evento, o valor antigo e o novo, o delta, a deriva em relação à primeira leitura e uma flag de pós-recarga, para que o relatório possa ser recontado em vez de aceito na confiança. Um segundo arquivo contém uma linha por buffer com todos os contadores, atualizado a cada 15 segundos enquanto a execução continua.
- O indicador em teste é criado com IndicatorCreate a partir de uma lista de parâmetros interpretada, de modo que qualquer indicador personalizado pode ser inspecionado sem editar nem recompilar nada. A lista interpretada é impressa no diário na inicialização, o que torna visível uma lista de parâmetros errada, em vez de silenciosa.
- O handle pode ser liberado e criado novamente a cada N minutos, mantendo deliberadamente o histórico registrado, o que serve para flagrar o indicador que fica quieto enquanto está ativo e publica um passado diferente depois de uma recarga. O terminal só recalcula numa recarga quando nenhum outro programa mantém o mesmo indicador com os mesmos parâmetros, por isso remova esse indicador dos seus gráficos enquanto este teste estiver rodando.
- Uma verificação é descartada e contada como pulada, não como evidência, sempre que o handle ainda não existe, o indicador ainda não foi calculado, há menos barras fechadas do que a profundidade monitorada (na primeira verificação utilizável, a própria profundidade é reduzida ao histórico disponível, e o diário informa isso), um buffer não pode ser copiado ou a série se desloca entre a leitura dos horários e a leitura dos valores.
Medições feitas com indicadores que acompanham o terminal, para que qualquer pessoa possa repeti-las. Quatro cópias em quatro gráficos de um mesmo terminal, XAUUSD M1, 1 hora e 26 minutos, 300 barras fechadas monitoradas, uma verificação por segundo:
- Examples\ZigZag (12,5,3): 1.315.713 comparações por buffer, 0 valores alterados, 0 surgidos, 17 desaparecidos no buffer plotado com MaxShift 15, e 3 e 10 desaparecidos nos dois buffers de cálculo. Nenhum valor se moveu, porque um extremo do ZigZag é a máxima ou a mínima da sua barra e não pode derivar; ele é removido e republicado em outro lugar.
- Examples\Custom Moving Average (13,0,2): 1.305.513 comparações, nenhum evento sequer.
- Examples\Fractals: 25 eventos em 1.303.713 comparações, todos do tipo Appeared, nenhum Changed, nenhum Vanished, todos no shift 3. Isso não é repintura, e sim confirmação tardia, já que um fractal precisa de mais duas barras antes de poder ser desenhado. A linha de veredito ainda mostra REPAINTS, porque a ferramenta relata o que viu e deixa o julgamento para você: eventos todos do tipo Appeared num único shift fixo significam um indicador utilizável com um atraso conhecido; eventos do tipo Vanished em shifts dispersos, não.
- A quarta cópia rodou o mesmo ZigZag com 0,0 contado como valor comum em vez de ausência de valor: 1.308.513 comparações, 32 eventos, todos do tipo Changed, o mesmo MaxShift de 15 e um delta absoluto máximo de 4184,088, que é o preço do ouro, porque agora cada exclusão é um pico substituído por 0,0. A mesma repintura, com outro nome.
Essas três execuções, ZigZag, média móvel e Fractals, fizeram 4.387, 4.353 e 4.347 verificações. A mesma ferramenta no Testador de Estratégia comprime um dia em segundos: o mesmo ZigZag ao longo de um dia de negociação de XAUUSD M1, modelagem OHLC de 1 minuto, gerou 5.512 verificações, 1.651.923 comparações, 342 valores desaparecidos e 3 surgidos em barras que já estavam fechadas naquele momento, 343 barras distintas afetadas e um MaxShift de 28.
Conferência independente dos contadores. Uma reimplementação independente do Examples\ZigZag em Python foi executada sobre os candles brutos obtidos do terminal e 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 da reprodução, e, para todas as 17, a última leitura da ferramenta é igual ao valor reproduzido. Execução no testador: 343 barras com eventos, 341 delas barras que perderam um valor; as mesmas duas conferências, nenhuma divergência. As contagens de comparações também batem: 87 novas barras M1 abriram durante a execução ao vivo, e (verificações menos 1) vezes 300 menos 87 reproduz exatamente cada contagem de comparações informada.
Parâmetros de entrada: o caminho iCustom do indicador a inspecionar e os seus parâmetros como lista separada por vírgulas, o número de buffers a monitorar (1 a 32), símbolo e timeframe, caso você queira inspecionar outros que não os do gráfico, o número de barras fechadas monitoradas (padrão 300), o mínimo de segundos entre verificações (padrão 1, tempo modelado no testador), uma tolerância absoluta abaixo da qual uma mudança é ignorada, uma opção que trata 0,0 como ausência de valor em buffers do tipo setas e ZigZag (ativada por padrão), o intervalo de recriação do handle, uma parada opcional após N minutos, a opção de CSV, o nome do arquivo e o limite de linhas, as configurações do painel (mostrar ou ocultar, canto, deslocamentos, tamanho da fonte e cinco cores) e a opção da operação de exemplo no Testador de Estratégia descrita acima. Cada parâmetro de entrada está documentado pelo seu próprio comentário no terminal. O caminho fica vazio por padrão de propósito: sem nada preenchido, a ferramenta informa isso no diário e no painel e não mede nada, em vez de apontar para um indicador que talvez não esteja no seu terminal.
Limites, ditos com franqueza. A ferramenta não pode provar a ausência de repintura; ela só pode deixar de encontrar alguma no período medido, e é por isso que a contagem de comparações aparece ao lado de cada veredito. Ela faz amostragens no intervalo de verificação, então um valor que aparece e some dentro de um mesmo intervalo pode passar despercebido: isso aconteceu uma vez na hora e meia descrita acima, em que as duas cópias do ZigZag, iniciadas com 14 segundos de diferença, divergem sobre uma barra (03:32, em dois buffers) cujo valor existiu por menos de um intervalo de verificação, de modo que uma cópia o capturou e a outra não. Ela mede o que um indicador publica através dos seus buffers, então um indicador que desenha objetos no gráfico em vez de preencher buffers é invisível para ela. No Testador de Estratégia, o indicador em teste precisa estar presente e compilado antes de a execução começar: o testador trata uma falha de IndicatorCreate como erro crítico e descarrega o expert, o que nenhum tratamento de erro dentro da ferramenta pode mudar. Num gráfico ao vivo, o mesmo caminho errado não é fatal: a ferramenta continua anexada e tenta de novo a cada 30 segundos, então o parâmetro de entrada pode ser corrigido sem removê-la.
A operação de exemplo no Testador de Estratégia usa o volume mínimo do símbolo, é enviada sem stop loss nem take profit, e a margem é verificada contra a margem livre antes do envio, de modo que um depósito de teste pequeno gera uma linha no diário em vez de uma ordem rejeitada. Ela tem o seu próprio número mágico, é fechada num tick posterior, e nenhum contador, veredito ou linha CSV da medição é afetado por ela. Medido com um depósito de 1000 USD no testador: uma operação, dois negócios, 0,06 USD de custo, e, com o Examples\ZigZag em teste no mesmo intervalo, todos os contadores de repintura coincidiram com os da build que não contém nenhum código de negociação, nos mínimos detalhes: 3.404.353 comparações, 10 valores desaparecidos e MaxShift 17.
Limites práticos. Barras multiplicadas por buffers não podem passar de 200.000 slots, o que é uma proteção de memória; acima disso, a profundidade é reduzida e uma linha é escrita no diário. É um Expert Advisor, então ocupa o único slot de expert do gráfico: uma cópia por gráfico, e não num gráfico em que o seu próprio expert esteja rodando, embora vários gráficos possam rodar cópias ao mesmo tempo. Peça somente buffers que o indicador realmente tem, porque um buffer que não existe falha em todas as verificações, e, depois de cinco linhas no diário, essas falhas passam a ser apenas contadas como puladas. Um nome de CSV definido por você é sobrescrito a cada início; o nome automático inclui o minuto de início. No Testador de Estratégia, os arquivos são gravados na pasta MQL5\Files do próprio agente de teste, não na do terminal, e uma repintura vista no testador e uma repintura vista ao vivo não são automaticamente a mesma coisa - quando a resposta importa, rode ao vivo. Por fim, a ferramenta não diz nada sobre se vale a pena operar um indicador: um indicador que não repinta ainda pode ser inútil, e alguns indicadores que repintam são usados de forma deliberada e correta.
