Metodologia de teste de qualidade de dados - página 3

 

Resultado parcial da primeira hora de pregão (na verdade os 64 primeiros minutos) em WINZ13, usando o EA do Figurelli:

Computador 1 (servidor) - terminal 1: 1.537 ticks
Computador 1 (servidor) - terminal 2: [sem querer compilei o EA no meio da contagem...]

Computador 2 (laptop) - terminal 1: 1.418 ticks
Computador 2 (laptop) - terminal 2: 1.400 ticks

Para PETR4 vai tudo rodar normalmente assim que o pregão abrir daqui a pouco.

Abraços,
Malacarne 

 
Malacarne:

Resultado parcial da primeira hora de pregão (na verdade os 64 primeiros minutos) em WINZ13, usando o EA do Figurelli:

Computador 1 (servidor) - terminal 1: 1.537 ticks
Computador 1 (servidor) - terminal 2: [sem querer compilei o EA no meio da contagem...]

Computador 2 (laptop) - terminal 1: 1.418 ticks
Computador 2 (laptop) - terminal 2: 1.400 ticks

Para PETR4 tá vai tudo rodar normalmente assim que o pregão abrir daqui a pouco.

Abraços,
Malacarne 

Malacarne, para mim deu uma diferença no WINZ13 de 2.996 para 3.045 no mesmo computador e duas instâncias de MT5.

Mesmo na mesma instância acontecem diferenças, mas menores em torno de 20 ticks.

No PETR4 em 30 min obtive 550 e 544 ticks no mesmo computador e duas instâncias de MT5.

O problema é que 2 ticks perdidos são suficientes para falhar qualquer estratégia ou transação, se nesses ticks existir uma variação muito grande de preços (ou seja, sempre é um risco).

Apesar de ainda ser cedo para qualquer conclusão, e o mercado estar abrindo ainda, estou curioso para ver os resultados do teu Script, porque ou o meu EA tem bug ou parece que a maior diferença que tu percebeu até agora é devido à gravação em disco.  

 

Estou tendencioso a acreditar que seu EA não tem bug, até porque ele não faz nenhuma operação em disco e ainda por cima trabalha no modo OnTick( ) !!! Na minha humilde opinião duas coisas podem ser a causa do problema:

1) as informações transmitidas do servidor para os terminais MT5 não têm a mesma qualidade/velocidade...

2) tanto OnTick( ) como OnCalculate( ) não são velozes o suficiente para processar informações de alta frequência recebidas do mercado...

Segundo Alain, o problema não está em OnCalculate( )... mas agora estamos trabalhando no modo OnTick( ) !!! Enfim, eu já havia (há algum tempo) percebido essa diferença, que bom que você agora também pode confirmar que ela existe!

Abraços,
Malacarne 

 

Resultado parcial da primeira hora de negociação em PETR4, usando o EA do Figurelli:

Servidor - Terminal 1: 1.336 ticks
Servidor - Terminal 2: 1.312 ticks

Laptop - Terminal 1: 1.197 ticks
Laptop - Terminal 2: 1.196 ticks

Screenshots em anexo.

Abraços,
Malacarne

P.S.: reparem também as diferenças no valor máximo... 

Testes no servidor

Testes no laptop 

 
Malacarne:

Estou tendencioso a acreditar que seu EA não tem bug, até porque ele não faz nenhuma operação em disco e ainda por cima trabalha no modo OnTick( ) !!! Na minha humilde opinião duas coisas podem ser a causa do problema:

1) as informações transmitidas do servidor para os terminais MT5 não têm a mesma qualidade/velocidade...

2) tanto OnTick( ) como OnCalculate( ) não são velozes o suficiente para processar informações de alta frequência recebidas do mercado...

Segundo Alain, o problema não está em OnCalculate( )... mas agora estamos trabalhando no modo OnTick( ) !!! Enfim, eu já havia (há algum tempo) percebido essa diferença, que bom que você agora também pode confirmar que ela existe!

Abraços,
Malacarne 

Malacarne, tem lógica nos itens 1) e 2), mas vamos precisar das coletas do teus script para comparar e balizar essas informações.

E por essa lógica, quando enfrentarmos os horários críticos do mercado essa diferença será ainda maior.  

 
Parece que você não pode esperar o fim do teste
 
Malacarne :

Estou tendencioso a acreditar que seu EA não tem bug, até porque ele não faz nenhuma operação em disco e ainda por cima trabalha no modo OnTick( ) !!! Na minha humilde opinião duas coisas podem ser a causa do problema:

1) as informações transmitidas do servidor para os terminais MT5 não têm a mesma qualidade/velocidade...

2) tanto OnTick( ) como OnCalculate( ) não são velozes o suficiente para processar informações de alta frequência recebidas do mercado...

Segundo Alain, o problema não está em OnCalculate( )... mas agora estamos trabalhando no modo OnTick( ) !!! Enfim, eu já havia (há algum tempo) percebido essa diferença, que bom que você agora também pode confirmar que ela existe!

Abraços,
Malacarne 

Sobre o segundo ponto, há talvez algum mal-entendido ...

OnTick () e OnCalculate () são manipuladores de eventos. É para o codificador que preenche estas funções a ter em conta a velocidade de execução de seu código. É por isso, sugiro que alguma mudança no seu código no primeiro EA você postou aqui. Toda saída, independentemente de qual tipo (impressão, comentário, arquivo ...) são muito demorado, por isso, uma EA que quer processar os Ticks, a saída tem que ser deixado para um mínimo.

Você pode usar o profiler para verificar a velocidade de execução do seu código : Eu fiz o teste com tanto seu código e que de Figurelli.

Seu código estava correndo cerca de 12 minutos, com perfis, você pode ver os resultados na figura seguinte:


Função OnTick () foi executado 521 vezes, e leva 36 170 micro segundos (µS) para processá-lo. É uma média de 69,5 µS por OnTick chamada. Como você pode ver a parte mais demorada código é o FileWrite () com quase 90% do tempo.

Por comparaison, consulte o profiling do código Figurelli (10 minutos de marcha):

Resultado: 463 OnTick () pede um tempo de processamento de 2 215 µS, portanto, uma média de um pouco menos de 5μs por chamada. Ainda função de comentários () leva mais do que 40% do tempo.

 
angevoyageur:

Sobre o segundo ponto, há talvez algum mal-entendido ...

OnTick () e OnCalculate () são manipuladores de eventos. É para o codificador que preenche estas funções a ter em conta a velocidade de execução de seu código. É por isso, sugiro que alguma mudança no seu código no primeiro EA você postou aqui. Toda saída, independentemente de qual tipo (impressão, comentário, arquivo ...) são muito demorado, por isso, uma EA que quer processar os Ticks, a saída tem que ser deixado para um mínimo.

Você pode usar o profiler para verificar a velocidade de execução do seu código : Eu fiz o teste com tanto seu código e que de Figurelli.

Seu código estava correndo cerca de 12 minutos, com perfis, você pode ver os resultados na figura seguinte:


Função OnTick () foi executado 521 vezes, e leva 36 170 micro segundos (µS) para processá-lo. É uma média de 69,5 µS por OnTick chamada. Como você pode ver a parte mais demorada código é o FileWrite () com quase 90% do tempo.

Por comparaison, consulte o profiling do código Figurelli (10 minutos de marcha):

Resultado: 463 OnTick () pede um tempo de processamento de 2 215 µS, portanto, uma média de um pouco menos de 5μs por chamada. Ainda função de comentários () leva mais do que 40% do tempo.

Alain, muito boa a idéia de utilizar o profiling do depurador e o cálculo de tempo médio por chamada (69,5μs no Script e 5μs no EA). 

No caso do EA, poderia ficar ainda mais rápido fazendo os cálculos (e exibição de comentários) de hora em hora ao invés de minuto a minuto.

Também me chamou a atenção o tempo da TimeCurrent, isso também dá para diminuir, mudando um pouco a forma de contabilização dos ticks. 

Mas vamos fazer mais amostras para ver se essas alterações seriam realmente úteis.  

 

Olá Alain,

muito obrigado pelo seu comentário! Eu já conhecia essa ferramenta do MetaEditor, mas confesso que ainda não tinha feito uso dela para analisar meu próprio código...

Após seu excelente comentário , vejo que FileWrite( ) consome bastante tempo durante a passagem por dentro de OnTick( ). Entretanto, não podemos comparar o FileWrite( ) dentro do meu código com o Comment( ) no código do Figurelli, uma vez que este último é atualizado apenas uma vez por minuto, enquanto que FileWrite é feito a cada tick...

Ainda assim, gostaria de esclarecer que FileWrite( ) está sendo utilizado apenas para "gravar" informações do mercado para futura consulta, pois originalmente o que me levou a questionar a qualidade dos dados foi justamente um simples cálculo que estava sendo feito de forma errada dentro de um indicator criado por mim e baseado em ticks.

Ainda assim, mesmo sendo extremamente veloz o processamento dentro de OnTick( ) e OnCalculate( ), caso os dados recebidos do servidor fossem exatamente iguais não deveria haver diferença nos valores calculados tanto pelo meu script quanto pelo EA do Figurelli...

Entretanto, após seu comentário confesso que estou mais inclinado a acreditar que a causa do problema é a baixa qualidade de dados recebidos do servidor, e não a velocidade de processamento do MetaTrader...

Mais uma vez, obrigado pela sua excelente contribuição!

Abraços,
Malacarne 

P.S.: estou esperando o fechamento do pregão de hoje para postar na íntegra todos os arquivos gerados pelo meu script. Aí sim poderemos fazer comparações mais detalhadas! 

 

Vamos para nomes Rogério, Rodrigo,

Para mim, tem sempre ser óbvio que você sempre perder alguns carrapatos. A grande questão era "qual parte (percentagem de carrapatos), você pode permitir que a perda". Eu sei 3 razões para a perda de alguns carrapatos:

  1. Os ticks são enviados pelo corretor, mas por um motivo ou outro não chegam plataforma MT5. Isso pode ser, por exemplo, uma perda de conexão ou computador problema, eu realmente não sei as razões, mas é irrelevante, alguns ticks são perdidas desta forma.
  2. Como eu aponto mais cedo , se nova cotação chega quando OnTick () é executado, este Tick está perdido. Então, a consideração do post anterior. Este ponto vem diretamente de como o processo MT5 evento Tick.
  3. Em terceiro lugar, se vários ticks chega simultaneamente (quase), mesmo que OnTick () não está funcionando, apenas a última será processado. Aqui é uma mistura de razões externas e internas.

Há, possivelmente, outra razão para perder Tick, mas apenas Metaquotes pode responder, eu acho.

Sobre a qualidade dos ticks recebidos, a única maneira de ter respostas definitivas seria comparar o que é recebido para que o corretor enviou, mas provavelmente não é possível.

Vamos ver qual é a conclusão que podemos tirar nossos testes atuais.

P.S: Eu tenho uma referência sobre o ponto 3, mas eu não encontrá-lo no momento. Ok, eu achei, da seção russa.

Razão: