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

 

Uma ideia: um Emulador de Ticks

Criei uma nova versão do Tick Count, visando aumentar ainda mais sua velocidade e verificar se realmente para WINZ13 não acontecem perdas de leitura na OnTick().

Se esse não é o limite, agora diria que está muito próximo. 

Com isso foram feitas as seguintes melhorias:

1) É feita uma emulação dos ticks (mesmo que eles não cheguem através do OnTick()) através de um loop de leitura de preços em SymbolInfoTick(). Esse algoritmo inteligente detecta a variação de preço dentro da OnTick(), verificando se não ocorreu uma mudança antes da saída dela e atualizando os cálculos caso positivo. O valor de retentativa é hardcoded e definido como 100 nessa primeira versão.  

2) Foi removida a TimeCurrent() e inserido um Timer() de 1 minuto, eliminando o atraso dessa rotina. Na prática, o único atraso possível agora é na exibição das mensagens a cada minuto.

Fiz testes com EUR/USD em MetaQuotes-Demo dessa versão e, como planejado, em 10 minutos ela já leu 4 ticks a mais que a versão anterior.

Será que essa versão vai resolver a questão de ticks que chegam juntos ??? Só com mais testes, mas estou otimista de ter encontrado um algoritmo para isso. 

Obs 1: amanhã vou testar ela com o WINZ13 e PETR4, o código fonte está abaixo (além do novo arquivo abaixo, que estou chamando de tick_count_2.mq5).

Obs 2: na nova Tick Count 2 (com Emulador de Ticks) não existem parâmetros de entrada, é só largar no gráfico. 

#property version   "2.01"
#property description  "Trajecta - Minimalist Tick Counter with Tick Emulator"

// global
int tick=0,min=0,minuto=-1,minutoTimer=0,cont=0,cont_max=0,cont_min=10000,avg=0,cont_tick=0;
double avgAsk=0,avgBid=0;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//----
   EventSetTimer(60); //--- create timer
   return(INIT_SUCCEEDED);
//----
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//----
   minutoTimer++;
   if (minutoTimer>59) minutoTimer=0;
//----
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlTick realTick;
   if (tick>0) {
      cont++; tick++;
      double ask=-1,bid=-1;
      for (int retry=0; retry<100; retry++) {
         if (SymbolInfoTick(Symbol(),realTick)) {
            if (ask!=realTick.ask || bid!=realTick.bid) {
               if (ask>0) {
                  cont++; tick++;
               }
               ask=realTick.ask;
               bid=realTick.bid;
               cont_tick++;
               avgAsk+=ask;
               avgBid+=bid;
            }
         }
      }
   }
   if (minutoTimer!=minuto) {
      if (cont_tick>0) {
         avgAsk/=cont_tick;
         avgBid/=cont_tick;
      }
      else {
         avgAsk=0; avgBid=0;
      }
      cont_tick=0;
      minuto=minutoTimer;
      if (cont>cont_max) cont_max=cont; if (cont<cont_min) cont_min=cont;
      if (min>0) avg=tick/min;
      Comment("Tick Count - ",Symbol()," - Minutes: ",min," >> Ticks: ",tick," - Cont: ",cont," - Min: ",cont_min," - Max: ",cont_max,
         " - Avg.Tick: ",avg," (Avg.Ask: ",DoubleToString(avgAsk,5),", Avg.Bid: ",DoubleToString(avgBid,5),")");
      if (tick==0) tick++;
      min++; cont=0; avgAsk=0; avgBid=0;
   }
//---
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
Ola Rogério, qual período(TF) devo usar para essa leitura?
 
Rodrigo:
Ola Rogério, qual período(TF) devo usar para essa leitura?

Qualquer TF... entretanto, qualquer que seja o TF escolhido, o ideal é que você não modifique o tempo gráfico de nenhum gráfico com o ativo que está sendo testado, pois essa mudança pode resetar alguns scripts e expert advisors (confesso que ainda não testei no EA do Figurelli... mas ainda assim é bom evitar...)

Abraços,
Malacarne 

 
figurelli:

Uma ideia: um Emulador de Ticks

Criei uma nova versão do Tick Count, visando aumentar ainda mais sua velocidade e verificar se realmente para WINZ13 não acontecem perdas de leitura na OnTick().

Se esse não é o limite, agora diria que está muito próximo. 

Com isso foram feitas as seguintes melhorias:

1) É feita uma emulação dos ticks (mesmo que eles não cheguem através do OnTick()) através de um loop de leitura de preços em SymbolInfoTick(). Esse algoritmo inteligente detecta a variação de preço dentro da OnTick(), verificando se não ocorreu uma mudança antes da saída dela e atualizando os cálculos caso positivo. O valor de retentativa é hardcoded e definido como 100 nessa primeira versão.  

2) Foi removida a TimeCurrent() e inserido um Timer() de 1 minuto, eliminando o atraso dessa rotina. Na prática, o único atraso possível agora é na exibição das mensagens a cada minuto.

Fiz testes com EUR/USD em MetaQuotes-Demo dessa versão e, como planejado, em 10 minutos ela já leu 4 ticks a mais que a versão anterior.

Será que essa versão vai resolver a questão de ticks que chegam juntos ??? Só com mais testes, mas estou otimista de ter encontrado um algoritmo para isso. 

Obs 1: amanhã vou testar ela com o WINZ13 e PETR4, o código fonte está abaixo (além do novo arquivo abaixo, que estou chamando de tick_count_2.mq5).

Obs 2: na nova Tick Count 2 (com Emulador de Ticks) não existem parâmetros de entrada, é só largar no gráfico. 

Figurelli,

confesso que eu também já havia pensado em fazer a coisa no "hard mode"... em um dos indicadores que eu uso, implementei uma espécie de "filtro de tick" dentro de OnCalculate( ) para tentar evitar a perda dos mesmos... A estrutura era basicamente assim:

//--- VARIÁVEL GLOBAL
long FiltroDeTick = 0;

int OnCalculate(...)
  {
   //---
   CopyRates(_Symbol,_Period,0,1,LastRate);
   //---
   if(FiltroDeTick != LastRate[0].tick_volume)
     {

      //--- Lógica do indicador

     }
   FiltroDeTick = LastRate[0].tick_volume;
  }

Entretanto, mesmo com essa lógica de fazer a coisa no "hard mode", o indicador continuava perdendo ticks de maneira assustadora...

Confesso que não cheguei a implementar essa lógica em um Expert Advisor baseado em OnTick( ).

Vamos torcer pra dar certo! Vou rodar seu novo EA e te digo meus resultados amanhã.

Abraços,
Malacarne 

 

Correção: tinha um Print de debug no meu código (na versão 2.00), agora removi e atualizei o post para a versão 2.01, favor utilizar essa nova versão do Tick Emulator Tabajara!

Segue abaixo o resultado do code profiler dessa versão:

Note-se que como a SymbolInfoTick() está dentro da OnTick(), ela praticamente é a única executando e encarregada de não perder um tick sequer (seja real ou virtual).  

 

 
Malacarne:

Figurelli,

confesso que eu também já havia pensado em fazer a coisa no "hard mode"... em um dos indicadores que eu uso, implementei uma espécie de "filtro de tick" dentro de OnCalculate( ) para tentar evitar a perda dos mesmos... A estrutura era basicamente assim:

Entretanto, mesmo com essa lógica de fazer a coisa no "hard mode", o indicador continuava perdendo ticks de maneira assustadora...

Confesso que não cheguei a implementar essa lógica em um Expert Advisor baseado em OnTick( ).

Vamos torcer pra dar certo! Vou rodar seu novo EA e te digo meus resultados amanhã.

Abraços,
Malacarne 

Malacarne, muito bem, mas a diferença da minha ideia está no loop contínuo, que irá priorizar a SymbolInfoTick() em relação a qualquer outro processamento do EA. Comecei com um loop de 100, mas aumentando esse valor mais intensivo será o processamento de ticks virtuais.

Vamos ver amanhã o que acontece. 

 
figurelli :

Malacarne, muito bem, mas a diferença da minha ideia está no loop contínuo, que irá priorizar a  SymbolInfoTick() em relação a qualquer outro processamento do EA. Comecei com um loop de 100, mas aumentando esse valor mais intensivo será o processamento de ticks virtuais.

Vamos ver amanhã o que acontece. 

A idéia é boa, mas a sua implementação não lhe dará melhores resultados como anteriormente para PETR "ou WINZ13. Por quê? Porque quando Depth of Market está ativo para um símbolo, uma marca não é apenas uma mudança na compra / venda. Você pode verificar essa última afirmação, olhando no log do Malacarne , por exemplo.

Infelizmente eu não tenho a hora de trabalhar sobre este assunto, por enquanto.

 
angevoyageur:

A idéia é boa, mas a sua implementação não lhe dará melhores resultados como anteriormente para PETR "ou WINZ13. Por quê? Porque quando Depth of Market está ativo para um símbolo, uma marca não é apenas uma mudança na compra / venda. Você pode verificar essa última afirmação, olhando no log do Malacarne , por exemplo.

Infelizmente eu não tenho a hora de trabalhar sobre este assunto, por enquanto.

Alain, interessante, podemos ter ticks sem alterações de preço (ask/bid), mas apenas por mudanças no DOM?

Quando tiveres mais tempo para trabalhares no assunto por favor manda mais informações sobre o relacionamento com o DOM porque podemos colocar ele nos testes.

Obrigado. 

 

Malacarne e Alain, os valores não mudaram muito com a versão 2.0 do EA, realmente o problema parece que não está no processamento dos ticks.

Mas me chamou a atenção que PETR4 teve mais que WINZ13 hoje, ver totais nesse momento (17h50). 

PETR4 16.575 Ticks

WINZ13  12.530 Ticks

Vamos ver os números de vocês, mas minha conclusão é que o servidor não está mandando realmente todos Ticks.

E a meu ver chegamos em um ponto em a que causa do problema só a Corretora/MQ pode identificar. 

Da minha parte, agora temos que parar os testes e aguardar alguma melhoria futura, não vejo porque continuar testando sem haver uma correção antes. 

Seja como for, espero que de alguma forma esses testes contribuam para a melhoria de qualidade da operação do MT5 no Brasil. Abs.


 
figurelli:

Malacarne e Alain, os valores não mudaram muito com a versão 2.0 do EA, realmente o problema parece que não está no processamento dos ticks.

Mas me chamou a atenção que PETR4 teve mais que WINZ13 hoje, ver totais nesse momento (17h50). 

PETR4 16.575 Ticks

WINZ13  12.530 Ticks

Vamos ver os números de vocês, mas minha conclusão é que o servidor não está mandando realmente todos Ticks.

E a meu ver chegamos em um ponto em a que causa do problema só a Corretora/MQ pode identificar. 

Da minha parte, agora temos que parar os testes e aguardar alguma melhoria futura, não vejo porque continuar testando sem haver uma correção antes. 

Seja como for, espero que de alguma forma esses testes contribuam para a melhoria de qualidade da operação do MT5 no Brasil. Abs.


Prezado Figurelli,

hoje foi vencimento de contratos futuros de índice... por isso a liquidez em WINZ13 secou tanto... mas por favor dê uma olhada em WING14... 67.150 negócios no dia!!!

Abraços,
Malacarne 

Razão: