Capturando eventos no livro de ofertas (DOM) através do MetaTrader

 

Prezados, após algumas discussões acerca da capacidade da ferramenta MetaTrader para processar eventos baseados em ticks, surgiram também questões relativas ao melhor método para processar eventos baseados no livro de ofertas (DOM) do MetaTrader.

Como se sabe, o livo de ofertas pode sofrer diversas alterações, mesmo que novos negócios não ocorram. Logo, a frequência de informações que ocorrem no livro de ofertas (DOM) é razoavelmente maior que a frequência de ticks.

Especificamente nós gostaríamos de testar qual das funções de manipulação de evento é mais adequada para capturar (e processar) mudanças no livro de ofertas (DOM). Temos três candidatos: OnCalculate( ), OnTick( ) e OnBookEvent( ). A descrição de cada uma dessas funções de manipulação de evento pode ser lida no link que disponibilizei logo acima.

Para realizar os testes, nosso moderador Alain Verleyen já prontamente disponibilizou dois arquivos para teste: um indicador e um expert advisor. O motivo para a existência desses dois arquivos é simples: indicadores no MetaTrader não são capazes de processar OnBookEvent( ). Assim, os testes serão feitos da seguinte maneira:

■ O indicator Indicador_Teste.mq5 irá processar (contar) eventos no DOM através da função de manipulação de eventos OnCalculate( ).

■ O Expert Advisor EA_Teste.mq5 irá processar (contar) eventos no DOM através das funções de manipulação de eventos OnTick( ) e OnBookEvent( ).

Para que não ocorram erros na instalação dos arquivos, é fundamental que eles sejam colocados nas pastas certas!!! O arquivo Indicador_Teste.mq5 deve ser colocado (e compilado) na pasta MQL5\Indicators\, enquanto que o arquivo EA_Teste.mq5 deve ser colocado (e compilado) na pasta MQL5\Experts\.

IMPORTANTE: Os resultados finais, tanto para o indicador quanto para o Expert Advisor, serão impressos na aba "Experts" do terminal MetaTrader apenas quando eles forem terminados !!! Logo, é aconselhável que os arquivos rodem durante o mesmo intervalo de tempo, preferencialmente durante todo o horário de negociação do ativo que está sendo testado.

Seguem os arquivos em anexo. Aguardamos as contribuições da comunidade MetaTrader em português!

Abraços,
Malacarne

Arquivos anexados:
 

Hoje infelizmente eu peguei o mercado após a abertura, portanto não conseguirei fazer os testes. Mas a partir da próxima semana irei colocar meus resultados aqui.

Abraços,
Malacarne 

 
Malacarne:

Today unfortunately I caught the market after opening, so will not be able to do the tests. But starting next week I will post my results here.

Hugs,
Malacarne

Normally, I will post results for PETR4 this evening.
 

Meus resultados de hoje para PETR4:

Expert advisor 

EventoValor
Início10:24:09
Fim17:19:07
OnTick()17.177
OnBookEvent()67.693 
OnCalculate()27.614 

 
Indicador 

EventoValor
Início09:24:22
Fim17:23:48
OnTick()-
OnBookEvent()-
OnCalculate()28.481 
 

Meus resultados de hoje para WING14:

Expert advisor 

EventoValor
Início10:19:58
Fim17:26:07
OnTick()33.936
OnBookEvent()137.450
OnCalculate()86.293

 
Indicador 

EventoValor
Início08:59:27
Fim17:26:07
OnTick()-
OnBookEvent()-
OnCalculate()98.214
 
angevoyageur :
Normally, I will post results for PETR4 this evening.
2013/12/20 21:15:16 TestEvents (PETR4, D1) Começando ... 2013/12/20 01:14:02
2013/12/20 21:15:16 TestEvents (PETR4, D1) Tick eventos Processado = 17308
2013/12/20 21:15:16 TestEvents (PETR4, D1) Book eventos Processado = 68195
2013/12/20 21:15:16 TestEvent (PETR4, D1) Calculate eventos processados ​​= 28169
2013/12/20 21:15:16 TestEvent (PETR4, D1) Final ... 2013/12/20 18:01:20

Evento Valor
Início 01:14:02
Fim 18:01:20
OnTick () 17 308
OnBookEvent ()   68 195
OnCalculate () 28 169
Tick Volume
24 975
 
Malacarne:

Prezados, após algumas discussões acerca da capacidade da ferramenta MetaTrader para processar eventos baseados em ticks, surgiram também questões relativas ao melhor método para processar eventos baseados no livro de ofertas (DOM) do MetaTrader.

Malacarne, conte comigo, para variar vou participar desse tópico também! ;-) 

Para ser franco, não confio nem um pouco nas informações de profundidade de mercado (DoM) (seja a plataforma que for), até porque é facilmente manipulada pelos robôs, principalmente de alta freqüencia (conheço diversos algoritmos para fazer isso), mas como entra a questão de qualidade do MT5, vou tentar ajudar no que estiver a meu alcance.

Quando o DoM foi lançado no MT5 eu percebi que havia uma grande dificuldade de encontrar brokers com ele ativo, foi até uma surpresa ver no Brasil, já desde o começo (o que considero muito válido).

Mas vamos ao que interessa, que é a análise a partir dos dados apresentados por ti.

O primeiro ponto, e sugestão, é coletarmos de mais de uma fonte. No Brasil acredito que só temos na corretora, mas no Forex temos vários brokers para medir também. Claro, isso irá demandar testes em instrumentos internacionais.

Seja como for, pelos resultados, o OnTick() está processando sempre mais eventos, correto?

Minha segunda sugestão é, além dos testes individuais, criarmos um quarto item que seria a combinação de todos, ou seja, OnTick()+OnBookEvent()+OnCalculate() e ver qual o total deles (obviamente, mudando o algoritmo e não simplesmente somando os resultados finais) para medir o TopMost, ou número máximo que a plataforma consegue capturar (pelo menos com esses algoritmos).

Tenho a impressão que não vais escapar de fazer um algoritmo somando todos os eventos.

Por fim, talvez vocês tenham a resposta para isso, mas quais desses eventos podem ser ou não mascarados pela plataforma? Ou seja, se tivermos esse nível de informação, possivelmente ele irá ajudar no entendimento do melhor desempenho do OnTick(), que me parece ser o evento menos mascarável na plataforma.

Abs. 

 
figurelli:

Malacarne, conte comigo, para variar vou participar desse tópico também! ;-) 

Para ser franco, não confio nem um pouco nas informações de profundidade de mercado (DoM) (seja a plataforma que for), até porque é facilmente manipulada pelos robôs, principalmente de alta freqüencia (conheço diversos algoritmos para fazer isso), mas como entra a questão de qualidade do MT5, vou tentar ajudar no que estiver a meu alcance.

Quando o DoM foi lançado no MT5 eu percebi que havia uma grande dificuldade de encontrar brokers com ele ativo, foi até uma surpresa ver no Brasil, já desde o começo (o que considero muito válido).

Mas vamos ao que interessa, que é a análise a partir dos dados apresentados por ti.

O primeiro ponto, e sugestão, é coletarmos de mais de uma fonte. No Brasil acredito que só temos na corretora, mas no Forex temos vários brokers para medir também. Claro, isso irá demandar testes em instrumentos internacionais.

Seja como for, pelos resultados, o OnTick() está processando sempre mais eventos, correto?

Minha segunda sugestão é, além dos testes individuais, criarmos um quarto item que seria a combinação de todos, ou seja, OnTick()+OnBookEvent()+OnCalculate() e ver qual o total deles (obviamente, mudando o algoritmo e não simplesmente somando os resultados finais) para medir o TopMost, ou número máximo que a plataforma consegue capturar (pelo menos com esses algoritmos).

Tenho a impressão que não vais escapar de fazer um algoritmo somando todos os eventos.

Por fim, talvez vocês tenham a resposta para isso, mas quais desses eventos podem ser ou não mascarados pela plataforma? Ou seja, se tivermos esse nível de informação, possivelmente ele irá ajudar no entendimento do melhor desempenho do OnTick(), que me parece ser o evento menos mascarável na plataforma.

Abs. 

Grande Figurelli, é muito bom contar contigo nas discussões sobre o livro de ofertas (DOM)!

Entretanto, com relação à quantidade de eventos processados, OnTick() pelo que pudemos ver é justamente a função que captura menos eventos. Isso já era de se esperar, em minha opinião, pois o evento OnTick() realmente só roda (ou deveria rodar) quando ocorre um novo negócio (tick). No caso de OnBookEvent() ao longo do dia acontecem diversas ordens "sniper", "ghost", etc, (que você já deve dominar muitíssimo bem...) que são capturadas por OnBookEvent(), mas não afetam OnTick().

Aí já surge minha primeira dúvida... pra mim é claro a natureza tanto de OnTick() quanto de OnBookEvent(). Mas OnCalculate() fica numa espécie de "metade do caminho" entre os dois primeiros, sendo que o evento manipulado por OnCalculate(), pelo menos pra mim, não é muito claro...

A documentação diz "Isso (o evento calculate) geralmente acontece quando um novo preço (tick) é recebido para o ativo"... mas qual preço?? Pelo visto apenas as melhores ofertas de compra e venda (bid & ask)? Enfim, essa pra mim é, até agora, uma das frases mais obscuras do manual MetaTrader, principalmente por conta da palavra "geralmente"...

Se você ou o Alain tiverem alguma opinião a respeito de OnCalculate(), seria muitíssimo interessante compartilhar essa informação aqui no tópico!

Abraços,
Malacarne 

 
Malacarne :

Grande Figurelli, é muito bom contar contigo nas discussões sobre o livro de ofertas (DOM)!

Entretanto, com relação à quantidade de eventos processados, OnTick() pelo que pudemos ver é justamente a função que captura menos eventos. Isso já era de se esperar, em minha opinião, pois o evento OnTick() realmente só roda (ou deveria rodar) quando ocorre um novo negócio (tick). No caso de OnBookEvent() ao longo do dia acontecem diversas ordens "sniper", "ghost", etc, (que você já deve dominar muitíssimo bem...) que são capturadas por OnBookEvent(), mas não afetam OnTick().

Aí já surge minha primeira dúvida... pra mim é claro a natureza tanto de OnTick() quanto de OnBookEvent(). Mas OnCalculate() fica numa espécie de "metade do caminho" entre os dois primeiros, sendo que o evento manipulado por OnCalculate(), pelo menos pra mim, não é muito claro...

A documentação diz " Isso (o evento calculate) geralmente acontece quando um novo preço (tick) é recebido para o ativo "... mas qual preço?? Pelo visto apenas as melhores ofertas de compra e venda (bid & ask)? Enfim, essa pra mim é, até agora, uma das frases mais obscuras do manual MetaTrader, principalmente por conta da palavra "geralmente"...

Se você ou o Alain tiverem alguma opinião a respeito de OnCalculate(), seria muitíssimo interessante compartilhar essa informação aqui no tópico!

Abraços,
Malacarne 

Desculpe, mas eu não tenho nenhuma informação especial sobre isso.
 
Malacarne:

Grande Figurelli, é muito bom contar contigo nas discussões sobre o livro de ofertas (DOM)!

Entretanto, com relação à quantidade de eventos processados, OnTick() pelo que pudemos ver é justamente a função que captura menos eventos. Isso já era de se esperar, em minha opinião, pois o evento OnTick() realmente só roda (ou deveria rodar) quando ocorre um novo negócio (tick). No caso de OnBookEvent() ao longo do dia acontecem diversas ordens "sniper", "ghost", etc, (que você já deve dominar muitíssimo bem...) que são capturadas por OnBookEvent(), mas não afetam OnTick().

Aí já surge minha primeira dúvida... pra mim é claro a natureza tanto de OnTick() quanto de OnBookEvent(). Mas OnCalculate() fica numa espécie de "metade do caminho" entre os dois primeiros, sendo que o evento manipulado por OnCalculate(), pelo menos pra mim, não é muito claro...

A documentação diz "Isso (o evento calculate) geralmente acontece quando um novo preço (tick) é recebido para o ativo"... mas qual preço?? Pelo visto apenas as melhores ofertas de compra e venda (bid & ask)? Enfim, essa pra mim é, até agora, uma das frases mais obscuras do manual MetaTrader, principalmente por conta da palavra "geralmente"...

Se você ou o Alain tiverem alguma opinião a respeito de OnCalculate(), seria muitíssimo interessante compartilhar essa informação aqui no tópico!

Abraços,
Malacarne 

É verdade, eu olhei os 68K da OnBookEvent() e escrevi a OnTick() !!! 

Quanto ao OnCalculate(), estamos falando dos dois links abaixo, correto:

https://www.mql5.com/en/docs/basis/function/events (inglês)

https://www.mql5.com/pt/docs/basis/function/events (português)

A tradução me parece perfeita para a frase original ("This usually happens when a new tick is received for the symbol, for which the indicator is calculated").

Se eu seguir o manual "ao pé da letra", posso considerar que a OnCalculate() é apenas a OnTick() dos indicadores, e é chamada a cada novo tick.

Mas na prática como a maioria dos indicadores processam diversos períodos a cada tick (conforme o horizonte programado), e não apenas o momento presente, como na maioria dos EAs, acredito que o "usually" ou "geralmente" talvez indique que não vai conseguir processar todos.

Note que a palavra "preço" só aparece na tradução em português, e com Tick entre parênteses.

E, portanto, me parece ser algo relacionado apenas ao tick e nenhum pouco ao livro de ofertas.

Documentation on MQL5: Language Basics / Functions / Event Handling Functions
Documentation on MQL5: Language Basics / Functions / Event Handling Functions
  • www.mql5.com
Language Basics / Functions / Event Handling Functions - Documentation on MQL5
 

ressucitando o tópico rs

 

Existe alguma forma de capturar OnBookEvent() nos testes? ou apenas rodando em um terminal? estou implementando uma estratégia baseada em book para operar "ativos de baixa volatilidade" (micos) mas ta complicado de testar rs

Razão: