Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Experts

Tick Integrity Auditor - expert para MetaTrader 5

Quoc Dat Quach
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.
| Portuguese English Русский 中文 Español Deutsch 日本語 한국어 Français Italiano Türkçe
Visualizações:
19
Avaliação:
(1)
Publicado:
Freelance MQL5 Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Um backtest no modo “Cada tick com base em ticks reais” não realiza operações nas velas que você vê. Ele reproduz o histórico de ticks armazenado no terminal, uma cotação por vez, e cada stop, cada ordem pendente e cada filtro de spread são definidos com base nesses ticks. Essa ferramenta audita esse histórico de ticks: ela lê os ticks dos últimos dias para um símbolo, uma lista ou todo o Market Watch e identifica cinco tipos de problemas neles — cotações impossíveis, carimbos de data/hora corrompidos, reversões de preço de um tick medidas em múltiplos do spread mediano, silêncios dentro das próprias sessões de cotação da corretora e minutos em que os ticks e as barras M1 não coincidem.

painel-tia

Cinco símbolos do Market Watch, três dias cada, uma execução às 02:51:02, horário do servidor, em um domingo, 1,3 s. S pts é o spread mediano em pontos, Rev≥10S conta reversões de um tick de pelo menos dez spreads medianos, Silence unexpl. conta lacunas de mais de 60 s que a própria tabela de sessão da corretora não explica, e as três últimas colunas são as verificações de tick contra M1. Apresentado com tamanho de fonte do painel 4 para caber na página; o padrão é 8.

O problema

Uma vela é um resumo. Ela mantém quatro preços de um minuto e desconsidera a ordem em que ocorreram; assim, uma cotação que caiu dois dólares e voltou imediatamente aparece, no gráfico, como uma sombra, na melhor das hipóteses — e como nada quando o restante do minuto já abrange esse intervalo. O testador não vê a vela. Ele vê a cotação, e um stop-loss situado dentro desse intervalo é executado com base nela.

Ninguém lê os ticks a olho nu porque são muitos: no símbolo do ouro medido abaixo, o terminal registra cerca de 300 mil ticks por dia de negociação. Portanto, as perguntas que determinam se um backtest com ticks reais é uma medição ou uma ficção geralmente não são feitas. Existem cotações em que o preço de venda está abaixo do preço de compra? O tempo alguma vez corre para trás? Existem trechos de uma sessão sem nenhum tick? As barras M1 que os indicadores leem correspondem aos ticks com os quais o testador opera?

Esta ferramenta faz essas perguntas em menos de dois segundos para cinco símbolos e três dias, e responde com contagens, carimbos de data/hora em milissegundos e linhas em CSV, não com uma porcentagem de qualidade.

O que ela mede

Cinco verificações na janela [último tick – N dias, último tick), com ambas as extremidades arredondadas para o minuto mais próximo. A janela termina no tick mais recente do símbolo, não no relógio de parede; portanto, uma execução no domingo audita os últimos dias da semana que acabou de fechar. Todas as definições abaixo são exatas, e cada resultado é gravado em CSV com seu carimbo de data/hora em milissegundos, de modo que o relatório pode ser recontado em vez de simplesmente acreditado.

  • Cotações (K1). Um tick com bid <= 0 ou ask <= 0; uma cotação cruzada, ask < bid; uma cotação bloqueada, ask == bid. Cotações bloqueadas são contadas, mas não são resultados — alguns feeds se igualam legitimamente.
  • Carimbos de data/hora (K2). Um tick cujo time_msc é anterior ao do tick anterior (retroativo); uma repetição, com o mesmo time_msc, a mesma oferta de compra e a mesma oferta de venda do tick anterior; e um tick cujo campo de tempo não coincide com time_msc / 1000.
  • Reversões de um tick (K3). Na sequência de ticks que alteram o preço do gráfico, três preços consecutivos p0, p1, p2 formam uma reversão quando o movimento para p1 e o movimento de saída dele têm sinais opostos e p2 volta a ficar dentro de um quarto do movimento a partir de p0. O tamanho é o menor dos dois movimentos, em pontos, e é relatado em múltiplos de S, o spread mediano do próprio símbolo ao longo da janela: contagens em 2, 5, 10 e 20 spreads, e toda reversão de pelo menos InpReversalMult spreads (padrão 10) é considerada um resultado. Dez spreads no ouro e dez spreads no EURUSD são, portanto, a mesma coisa.
  • Silêncios (K4). Dois ticks consecutivos separados por mais de InpSilenceSeconds (padrão 60). A ferramenta consulta o SymbolInfoSessionQuote sobre cada minuto do silêncio e sobre seu último segundo: se algum deles estiver fora das sessões de cotação, o silêncio é explicado (um intervalo diário, um fim de semana); se todos estiverem dentro, ele é inexplicável e constitui uma ocorrência. Um símbolo sem nenhum registro de sessão é relatado como não classificado, nunca como explicado.
  • Ticks em relação às barras M1 (K5). Para cada minuto da janela, os preços mais alto e mais baixo do gráfico em cada tick desse minuto são comparados com a máxima e a mínima da barra M1 da corretora. Cada tick, não apenas aqueles que alteraram o preço: o primeiro tick de um minuto muitas vezes altera apenas o preço de venda, e seu preço de compra ainda é a abertura da barra. Contar apenas os ticks que alteraram o preço produziu 144 discrepâncias falsas em um dia do EURUSD enquanto essa ferramenta estava sendo desenvolvida; contar todos os ticks não produziu nenhuma. Uma barra M1 sem nenhum tick abaixo dela é uma anomalia — ou seja, um minuto em que o Testador de Estratégias precisa inventar ticks —, assim como um minuto com ticks, mas sem barra, e um minuto cuja máxima ou mínima difira em mais de InpBarTolPoints.

A ferramenta verifica sua própria aritmética e imprime ambos os lados para cada símbolo: o número de resultados deve ser igual à soma dos onze contadores de resultados, e o número de linhas gravadas no arquivo de resultados para aquele símbolo deve ser igual a ambos.

Exemplo medido

Cinco símbolos do Market Watch de um terminal de demonstração da Exness (build 6230), com três dias cada, auditados em uma única execução em 04/10/2026 às 02:51, horário do servidor. Como se trata de um domingo, as janelas de câmbio e ouro terminam no último tick da sexta-feira, enquanto o BTCUSD, que é negociado no fim de semana, termina no momento da execução. Foram lidos 1.962.511 ticks em 1.297 ms.

símbolo janela (hora do servidor) ticks S, pontos reversões >= 2 S / 5 S / 10 S maior reversão, pontos silêncios > 60 s: explicados / inexplicáveis segundos inexplicáveis (mais longos) Barras M1 / minutos com ticks incompatibilidades M1 conclusões
XAUUSD 29/09 20:57 - 02/10 20:57 907 660 168 532 / 16 / 3 2.400 3 / 0 0 4.134 / 4.134 0 3
EURUSD 29/09 20:58 - 02/10 20:58 177 962 6 13/2/0 58 0 / 6 1.514.073 (439.640) 4.299 / 4.299 0 6
GBPUSD 29/09 20:58 - 02/10 20:58 215 516 7 14/8/2 75 0 / 4 1.602,183 (741,443) 4.295 / 4.295 0 6
USDJPY 29/09 20:58 - 02/10 20:58 321.026 7 124 / 23 / 0 67 0 / 11 1.397,153 (307,393) 4.305 / 4.305 0 11
BTCUSD 10,01 02:51 - 10,04 02:51 340 347 700 34 / 0 / 0 3.084 0 / 0 0 4.320 / 4.320 0 0

O que está limpo é a maior parte. Ao longo de 1.962.511 ticks, não há cotação igual ou inferior a zero, nem cotação cruzada ou bloqueada, nem tick que remonte no tempo, nem tick repetido e nem tick cujos dois campos de tempo sejam incompatíveis. Cada uma das 21.353 barras M1 possui ticks associados; cada minuto com ticks possui uma barra, e as máximas e mínimas da barra correspondem à cotação de compra mais alta de seus ticks até o último ponto. Neste servidor, as barras lidas pelos indicadores e os ticks reproduzidos pelo testador coincidem em todas as máximas e mínimas. Vale a pena saber disso, e não é algo que se deva presumir sobre um servidor que não tenha sido avaliado.

A tabela de sessões e o feed apresentam discrepâncias em todas as noites da janela. Para EURUSD, GBPUSD e USDJPY, essa corretora declara uma sessão de cotação das 00h00 às 24h00, de segunda a quinta-feira. Os ticks indicam o contrário. Em cada uma das três noites, o último tick antes da rolagem diária chega entre 20:59:52 e 20:59:58, e o seguinte, entre 21:04:28 e 21:12:18: de 4,5 a 12,4 minutos sem nenhuma cotação, dentro do que a corretora chama de sessão aberta. O mais longo é o GBPUSD em 01/10/2026, com 741,443 segundos, das 20h59min57,249 às 21h12min18,692. O USDJPY apresenta um segundo padrão após a rolagem de 29/09/2026: entre 21h15 e 21h29, ele fica em silêncio por pouco mais de um minuto sete vezes, de 60,001 a 60,007 segundos cada, e é daí que vêm sete de suas onze ocorrências. O ouro, no mesmo servidor, declara uma pausa das 20h58 às 22h, portanto, seus três silêncios de transição são explicados e não constituem resultados.

Isso é relevante sempre que um Expert Advisor confia na tabela de sessão para saber se o mercado está aberto. As barras coincidem com os ticks — também não há barras M1 nesses minutos, de modo que um backtest identifica a mesma lacuna —, mas um EA que analisa as sessões de cotação para decidir quando agir acredita que o mercado está cotando às 21h02, e em nenhuma das nove noites dos símbolos acima isso ocorreu.

Todas as maiores reversões ocorrem em um momento de divulgação de dados dos EUA. Todas as cinco reversões de pelo menos dez spreads medianos — três no XAUUSD, duas no GBPUSD — ocorrem dentro de oito segundos após as 12h30, horário do servidor, nos dias 30/09/2026 e 02/10/2026. O próprio calendário econômico do terminal lista divulgações dos EUA às 12h30 em ambos os dias. A maior delas, no ouro, ocorreu com três ticks em menos de um milissegundo:

símbolo;verificação;tempo_msc;hora;valor1;valor2;detalhe XAUUSD;reversão;1790771407860;30/09/2026 12h30min07,860;2400;141;p0 4198,315 p1 4195,774 p2 4198,174 d1 -2541 d2 2400 S 168

A oferta cai 2,541 e volta para 2,400, terminando 0,141 abaixo do ponto de partida (valor2), no mesmo milissegundo. Isso equivale a 14,3 spreads medianos. No gráfico M1, isso é imperceptível: a barra das 12h30 vai de 4192,325 a 4209,799, portanto a vela não apresenta nenhum vestígio disso. Em um teste com ticks reais, uma ordem de stop de venda ou um stop-loss situado entre 4195,774 e 4198,174 naquele momento — um trailing stop acompanhando a alta, por exemplo — é acionado por esse único tick.

tia-reversão-xauusd

XAUUSD, 29 ticks consecutivos em torno da maior reversão da alta, em ordem de chegada. Os três ticks registrados às 12h30min07,860 são 4198,315, 4195,774 e 4198,174. Os outros 26 ticks, das 12:30:07.610 às 12:30:08.663, representam um movimento rápido, porém comum, impulsionado por notícias, abrangendo 7,7 dólares. Esses dados foram extraídos dos ticks lidos pelo próprio servidor MCP do MetaTrader 5, e não dos arquivos da ferramenta.

Não é possível determinar, apenas a partir dos dados, se um tick desse tipo é um erro de registro ou uma negociação real em um mercado com pouca liquidez, e a ferramenta não tenta fazer isso. O que ela faz é contá-los, comparar seu tamanho com o spread do próprio símbolo e fornecer o carimbo de data/hora, para que você possa descobrir se o resultado de um backtest depende de alguns poucos deles. A distribuição é acentuada: no ouro, 532 reversões de pelo menos dois spreads, 16 de pelo menos cinco e 3 de pelo menos dez.

Verificando o relatório de forma independente

Cada contador na tabela acima foi recalculado por um programa que não compartilha nenhum código com a ferramenta e obtém seus ticks e barras de uma interface que a ferramenta nunca acessa. Um script em Python lê dos arquivos do EA apenas a janela, o ponto do símbolo e o modo do gráfico, os quatro limites e a tabela de sessões, e extrai ele mesmo os ticks brutos e as barras M1, por meio do servidor MCP integrado ao MetaTrader 5 (get_chart_ticks_history, get_chart_history). Em seguida, ele aplica as definições acima e faz a comparação.

Para a execução na tabela: 1.962.511 ticks extraídos, 31 campos de resumo por símbolo mais a tabela de 24 horas de cada símbolo (72 células por símbolo), 0 discrepâncias. Os 31 campos são 29 contadores, a contagem de linhas do arquivo de resultados e a identidade. Dois erros inseridos deliberadamente — um contador aumentado em 1, uma contagem de ticks por hora aumentada em 1 — foram ambos relatados. Um campo não foi recontado: a verificação do campo de tempo requer o membro “time” do MqlTick, que as linhas do MCP não contêm; portanto, seu valor zero depende exclusivamente do EA. O script também não pode verificar um símbolo cujo gráfico seja construído com base nos preços “Last”; nenhum dos cinco o é.

As próprias definições do script são validadas por um teste em 13 ticks criados manualmente, com todas as contagens esperadas calculadas no papel — uma repetição, uma reversão de 49 pontos, um tick fora de ordem, uma cotação cruzada e uma bloqueada, uma cotação com preço de venda igual a zero, dois silêncios dentro de uma sessão e um durante um intervalo entre sessões — além de um caso de dois ticks em que apenas o último segundo de um silêncio fica fora da sessão. 45 asserções, contadas pelo próprio teste. O fato de o EA aplicar os mesmos predicados é comprovado pela recontagem em dados reais, e não por esse teste.

Um zero confirmado em ambos os lados é apenas um zero. Nenhum tick cruzado, invertido, repetido ou não positivo e nenhuma incompatibilidade M1 ocorreram em nenhuma execução relacionada a este artigo; portanto, esses ramos estão definidos e foram recontados, mas nunca foram observados sendo acionados neste servidor.

Como usá-lo

  1. Anexe-o a qualquer gráfico; o próprio símbolo do gráfico é auditado, a menos que InpSymbols liste outros ou seja * (Market Watch). Leia o diário ou o painel.
  2. Defina InpDays para abranger o período do backtest de seu interesse. A janela sempre termina no último tick que o terminal possui.
  3. Observe primeiro os silêncios inexplicáveis e leia seus carimbos de data/hora no arquivo de resultados. Silêncios que se repetem no mesmo minuto todos os dias indicam que a programação do servidor está em desacordo com sua tabela de sessões; os espalhados valem a pena serem verificados em relação ao log de conexão do seu próprio terminal.
  4. Analise as reversões de dez spreads ou mais e, em seguida, observe as contagens de 2S e 5S para avaliar o formato da distribuição. Se os stops de uma estratégia estiverem a poucos spreads do preço, execute novamente o backtest excluindo os minutos sinalizados e compare os resultados.
  5. Qualquer incompatibilidade no M1 ou barra do M1 sem ticks indica um minuto em que o testador e o gráfico não coincidem, ou em que o testador inventa preços. Esses casos merecem uma consulta à corretora.
  6. Execute o backtest novamente após trocar de corretora ou servidor: a qualidade dos ticks é uma propriedade do histórico de um terminal em um determinado momento, não de um símbolo.

Entradas

entrada padrão significado
InpSymbols "" Símbolos: vazio = símbolo do gráfico, * = Market Watch, caso contrário, lista CSV
InpDays 3 Dias de histórico de ticks a serem auditados (terminando no último tick)
InpCheckQuotes true K1: cotações não positivas / cruzadas / bloqueadas
InpCheckTimes true K2: carimbos de data/hora invertidos, repetidos e inconsistentes
InpCheckReversals true K3: reversões de preço de um tick (picos)
InpReversalMult 10,0 K3: sinaliza reversões de pelo menos esse número de spreads medianos
InpReversalReturnFrac 0,25 K3: distância máxima de retorno ao ponto inicial, como porcentagem do movimento
InpCheckSilences true K4: intervalos entre os ticks em relação às sessões de cotação
InpSilenceSeconds 60 K4: um silêncio é um intervalo maior do que este, em segundos
InpCheckBars true K5: compara o máximo/mínimo do tick com as barras M1
InpBarTolPoints 0 K5: ignorar desvios de alta/baixa até esse número de pontos
InpChunkMinutes 360 Os ticks são lidos em blocos com este número de minutos
InpMaxExamples 5 Diário: número de resultados de exemplo impressos por verificação
InpWriteCsv true Gravar arquivos CSV com resumo, sessões, horas e resultados
InpShowPanel true Desenhar a tabela de resultados no gráfico
InpPanelCorner CORNER_LEFT_UPPER Canto do painel
InpPanelFontSize 8 Tamanho da fonte do painel
InpPanelX 10 Deslocamento X do painel, px
InpPanelY 18 Deslocamento do painel Y, px
InpRefreshMinutes 0 Reauditar a cada N minutos (0 = auditar uma vez)

Arquivos de saída

Todos os arquivos são gravados em MQL5\Files\TickIntegrityAuditor\, separados por ponto-e-vírgula, com uma linha de cabeçalho e o prefixo <símbolos>_<dias>d_<ID do gráfico>, de modo que duas instâncias nunca se sobrescrevam.

  • <prefixo>_<símbolo>_summary.csv — uma linha por símbolo: a janela em milissegundos, cada contador acima, os parâmetros utilizados e o resultado da verificação de identidade. Uma verificação desativada deixa suas células vazias em vez de gravar 0.
  • <prefixo>_<símbolo>_sessions.csv — as sessões de cotação declaradas pela corretora, uma linha por sessão (dia da semana, de, até em segundos).
  • <prefix>_<symbol>_hours.csv — por hora do servidor: ticks, silêncios inexplicáveis e seus segundos, reversões sinalizadas.
  • <prefix>_findings.csv — uma linha por constatação com o símbolo, a verificação, time_msc, a hora legível, dois valores e um detalhe em texto. Para uma reversão, o valor1 é seu tamanho e o valor2 é a distância até p0, ambos em pontos; para um silêncio, o valor1 é sua duração em segundos e o valor2 é o time_msc do tick que o encerrou.

Limites, explicados de forma clara

  • Ele audita os ticks que seu terminal mantém. Um histórico atualizado ou baixado novamente pode alterar todos os números, e um terminal que ficou offline gera silêncios que a corretora nunca teve.
  • A tabela de sessão é o próprio extrato da corretora. Um silêncio explicado é justificado apenas no sentido de que a corretora informou que não haveria cotações; um silêncio inexplicado é uma discrepância entre dois extratos da corretora, não uma prova de falha.
  • Uma reversão é um padrão, não um veredicto. A ferramenta não consegue distinguir uma cotação incorreta de uma negociação real; ela mede o volume e o tempo e deixa o julgamento a seu critério.
  • A janela é limitada a InpDays dias (no máximo 365). Os ticks são lidos em blocos, de modo que o uso de memória permanece baixo, mas uma janela longa em um símbolo movimentado leva proporcionalmente mais tempo.
  • Os símbolos representados graficamente pelo “Último preço” são auditados com base no “Último preço”. Nenhum símbolo desse tipo estava disponível neste servidor; portanto, esse ramo foi implementado, mas nunca foi executado, e a recontagem independente abrange apenas símbolos representados graficamente pelo “Preço de compra”.
  • Sem funções de negociação, sem DLL, sem acesso à rede: ele lê ticks, barras e tabelas de sessão, e grava arquivos CSV na pasta MQL5\Files.

Traduzido do inglês pela MetaQuotes Ltd.
Publicação original: https://www.mql5.com/en/code/78008

87.8 Percent from 2021 to YTD at 8.5 Percent MaxDD. The Nikkei EA That Only Buys When Volume Is Quiet 87.8 Percent from 2021 to YTD at 8.5 Percent MaxDD. The Nikkei EA That Only Buys When Volume Is Quiet

Um EA gratuito e totalmente aberto para o JPN225 (Nikkei 225) no timeframe M15. Compra quando o preço apresenta tendência de alta, o momentum não está exagerado e o volume está baixo. Backtest de 2022 a 2026: fator de lucro de 1,68, +18,5% ao ano, passou em 15 testes de estresse. Fechamento em patas às 17h.

Session Sweep Boxes Session Sweep Boxes

Traça caixas de variação das sessões da Ásia, Londres e Nova York e marca os “sweeps” de liquidez: uma barra fechada cuja sombra se estende além da máxima ou mínima de uma sessão concluída e volta a fechar dentro desse intervalo. Setas que não se reajustam, níveis de sessão estendidos, alertas e buffers compatíveis com iCustom.

Accumulation/Distribution 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) 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.