Possível atraso de dados com SYMBOL_BID / SYMBOL_ASK

 

Na abertura do dólar futuro de hoje observei um comportamento estranho no meu EA. O contrato DOLQ15 abriu a  3219,50 (08/07/2015 @ 09:00). Meu EA enviou uma ordem de venda a mercado com SL = 3214,00, portanto incorreto, causando a rejeição da ordem. Essa ordem foi enviada às  09:00:43.

Meu cálculo de SL para a venda usa a chamada  SymbolInfoDouble(_Symbol,SYMBOL_ASK) para recuperar o topo do book e acrescenta um delta ao preço retornado. Dado que o mercado abriu a 3219,50 o SL nunca poderia ter sido menor que esse valor (a mínimina dos primeiros 5 min foi de 3216,50, também maior que o valor do meu SL).

A menos que eu esteja perdendo algum detalhe, minha conclusão foi de que o preço retornado não correspodeu ao último valor real do mercado.

Alguém com experiência neste assunto ou sugestão de como prevenir a situação de acontecer novamente?

 

Obrigado pela ajuda,

Fábio 

 

Boa tarde Fabio,

eu ja vi acontecer do mt5 processar ticks entre o leilão de abertura e até antes, por volta das 08:55. Pelo o que você me disse, eu concluo que aconteceu a mesma coisa com você, ele retornou o valor de ASK enquanto ainda estava no leilão, levando a uma ordem de venda com os parâmetros incorretos.

Dependendo de como for o seu EA, uma simples função para determinar o início de funcionamento do EA já bastaria.

Uma coisa que eu achei mais efetivo e tem funcionado muito bem pra mim, foi verificar o spread de bid e ask no horário de abertura.

Eu não cheguei a encontrar uma função embutida no mt5 pra te dizer se realmente o mercado saiu do leilão ou não, mas essas duas formas acima tem funcionado muito bem...


Um abraço,

Romeu.

 
Romeu Bertho:

Boa tarde Fabio,

eu ja vi acontecer do mt5 processar ticks entre o leilão de abertura e até antes, por volta das 08:55. Pelo o que você me disse, eu concluo que aconteceu a mesma coisa com você, ele retornou o valor de ASK enquanto ainda estava no leilão, levando a uma ordem de venda com os parâmetros incorretos.

Dependendo de como for o seu EA, uma simples função para determinar o início de funcionamento do EA já bastaria.

Uma coisa que eu achei mais efetivo e tem funcionado muito bem pra mim, foi verificar o spread de bid e ask no horário de abertura.

Eu não cheguei a encontrar uma função embutida no mt5 pra te dizer se realmente o mercado saiu do leilão ou não, mas essas duas formas acima tem funcionado muito bem...


Um abraço,

Romeu.

Boa tarde Romeu,

A idéia de verificar o spread é boa. Obrigado pela dica!

abs.,
Fábio 

 
Romeu Bertho:

Boa tarde Fabio,

eu ja vi acontecer do mt5 processar ticks entre o leilão de abertura e até antes, por volta das 08:55. Pelo o que você me disse, eu concluo que aconteceu a mesma coisa com você, ele retornou o valor de ASK enquanto ainda estava no leilão, levando a uma ordem de venda com os parâmetros incorretos.

Dependendo de como for o seu EA, uma simples função para determinar o início de funcionamento do EA já bastaria.

Uma coisa que eu achei mais efetivo e tem funcionado muito bem pra mim, foi verificar o spread de bid e ask no horário de abertura.

Eu não cheguei a encontrar uma função embutida no mt5 pra te dizer se realmente o mercado saiu do leilão ou não, mas essas duas formas acima tem funcionado muito bem...


Um abraço,

Romeu.

Olá Romeu:

Sou programador, então linguagem é uma questão de conhecer as "coisas" que ela te oferece...

Eu tenho tido problemas com Ask e Bid em conta demo e real em diversos horários do dia, pelo que pude perceber existem 3 formas de se obter essas informações:

1)  SymbolInfoTick (que é mais recomendada pela Metaquotes  e que para mim falha mais - primeira observação - https://www.mql5.com/pt/docs/marketinformation/symbolinfodouble);

2)  SymbolInfoDouble(_Symbol,SYMBOL_ASK) e

3) MarketBookGet.

Estou testando aqui e em conta demo as abordagens 2 e 3 parecem estar funcionando, mas fica a pergunta a você e aos demais: Qual vocês aconselham para a conta real?  

 Outra coisa: tenho escrito uma quantidade razoável de código defensivo, para rodar nas 3 situações: Backtest, demo e real.  Vocês também tem enfrentado este problema?

Obrigado. 

Documentação sobre MQL5: Informações de Mercado / SymbolInfoDouble
Documentação sobre MQL5: Informações de Mercado / SymbolInfoDouble
  • www.mql5.com
Informações de Mercado / SymbolInfoDouble - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader5
 
mrtasso:

Olá Romeu:

Sou programador, então linguagem é uma questão de conhecer as "coisas" que ela te oferece...

Eu tenho tido problemas com Ask e Bid em conta demo e real em diversos horários do dia, pelo que pude perceber existem 3 formas de se obter essas informações:

1)  SymbolInfoTick (que é mais recomendada pela Metaquotes  e que para mim falha mais - primeira observação - https://www.mql5.com/pt/docs/marketinformation/symbolinfodouble);

2)  SymbolInfoDouble(_Symbol,SYMBOL_ASK) e

3) MarketBookGet.

Estou testando aqui e em conta demo as abordagens 2 e 3 parecem estar funcionando, mas fica a pergunta a você e aos demais: Qual vocês aconselham para a conta real?  

 Outra coisa: tenho escrito uma quantidade razoável de código defensivo, para rodar nas 3 situações: Backtest, demo e real.  Vocês também tem enfrentado este problema?

Obrigado. 

Olá mrtasso,

Com relação às medidas de segurança em robôs, dê uma lida nesse post:

https://www.mql5.com/pt/forum/23409

Com relação à forma de capturar o bid/ask, as três formas devem funcionar, sendo a mais comum a primeira abordagem citada por você. 

Abraços,
Malacarne 

Um checklist dos riscos dos robôs antes de operar em conta real
Um checklist dos riscos dos robôs antes de operar em conta real
  • www.mql5.com
Existe um modo de pânico no Expert Advisor para administrar situações de risco de perda de capital por falhas ou erros dos algoritmos? - - Categoria: geral
 
Rodrigo Malacarne:

Olá mrtasso,

Com relação às medidas de segurança em robôs, dê uma lida nesse post:

https://www.mql5.com/pt/forum/23409

Com relação à forma de capturar o bid/ask, as três formas devem funcionar, sendo a mais comum a primeira abordagem citada por você. 

Abraços,
Malacarne 

Olá Malacarne:

Obrigado pelo link, eu já vasculhei bastante o fórum e já havia visto este post, meu EA é bem seguro, por exemplo: já desliguei a maquina e liguei novamente e ele recupera o estado sem problemas.

Eu entendo que as 3 formas de captura deveriam funcionar, mas para mim não estão funcionando.

Fica a pergunta:  Alguém mais tem tido problemas com elas?  Já perdi algumas centenas de reais com este "bug" (a ordem não entra com erro de Price, ST e/ou TP).  Eu sei que para aprender tem custo rsrsrs, mas queria saber o que o pessoal está usando e se está funcionando.

Somente mais uma informação:  quando uso o SymbolInfoTick o Last também falha em algumas ocasiões, passei a usar a estrutura MqlRates e a principio resolveu.

Mais uma vez obrigado Malacarne.

 
mrtasso:

Olá Malacarne:

Obrigado pelo link, eu já vasculhei bastante o fórum e já havia visto este post, meu EA é bem seguro, por exemplo: já desliguei a maquina e liguei novamente e ele recupera o estado sem problemas.

Eu entendo que as 3 formas de captura deveriam funcionar, mas para mim não estão funcionando.

Fica a pergunta:  Alguém mais tem tido problemas com elas?  Já perdi algumas centenas de reais com este "bug" (a ordem não entra com erro de Price, ST e/ou TP).  Eu sei que para aprender tem custo rsrsrs, mas queria saber o que o pessoal está usando e se está funcionando.

Somente mais uma informação:  quando uso o SymbolInfoTick o Last também falha em algumas ocasiões, passei a usar a estrutura MqlRates e a principio resolveu.

Mais uma vez obrigado Malacarne.

Olá mrtasso,

O que exatamente você quer dizer quando diz que as funções não estão funcionando? Talvez você consiga uma resposta melhor para o problema se puder incluir um trecho/exemplo de código e os erros que estão ocorrendo. De qualquer forma, vale salientar que a escolha entre as 3 formas de acesso deveria ser dirigida pela sua necessadide, já que cada uma produz um resultado diferente: SymbolInfoTick() retorna a estrutura MqlTick, SymbolInfoDouble() pode ser usado para recuperar apenas um lado do topo do book e MarketBookGet() retorna a profundidade do book.

Abs.,
Fábio 

 
Fabio Bissolotti:

Olá mrtasso,

O que exatamente você quer dizer quando diz que as funções não estão funcionando? Talvez você consiga uma resposta melhor para o problema se puder incluir um trecho/exemplo de código e os erros que estão ocorrendo. De qualquer forma, vale salientar que a escolha entre as 3 formas de acesso deveria ser dirigida pela sua necessadide, já que cada uma produz um resultado diferente: SymbolInfoTick() retorna a estrutura MqlTick, SymbolInfoDouble() pode ser usado para recuperar apenas um lado do topo do book e MarketBookGet() retorna a profundidade do book.

Abs.,
Fábio 

Olá Fábio:

Não apresenta erros, os valores são errados (delay?), ocasionado entradas equivocadas no mercado.

Discordo de você quando diz que retornam valores de melhores BIDs e ASKs diferentes.  Todas as formas deveriam retornar o mesmos valores de topo para BID e ASK, mas isso não acontece. 

Você pode obter os melhores BID e ASK  com  MarketBookGet() com este código: 

      MqlBookInfo BookInfo[];
      if (MarketBookGet(_Symbol,BookInfo))
      {
         for(int i = 0; i < ArraySize(BookInfo)-1; i++)
         {
            if(BookInfo[i].type != BookInfo[i+1].type)
            {
               Ask = BookInfo[i].price;
               Bid = BookInfo[i+1].price;
               break;
            }
         }
      }

 Desisti de usar BID / ASK e alterei a minha estratégia para usar Last que pela estrutura MqlRates parece funcionar bem.

 Obrigado Fábio pelas suas colocações.

 Abs, 

 
mrtasso:

Olá Fábio:

Não apresenta erros, os valores são errados (delay?), ocasionado entradas equivocadas no mercado.

Discordo de você quando diz que retornam valores de melhores BIDs e ASKs diferentes.  Todas as formas deveriam retornar o mesmos valores de topo para BID e ASK, mas isso não acontece. 

Você pode obter os melhores BID e ASK  com  MarketBookGet() com este código: 

 Desisti de usar BID / ASK e alterei a minha estratégia para usar Last que pela estrutura MqlRates parece funcionar bem.

 Obrigado Fábio pelas suas colocações.

 Abs, 

Quando eu disse que as funções retornam resultados diferentes eu me referia à estrutura da resposta. Claro que o conteúdo do topo do book em todas elas deveria ser idêntico em um dado momento. Meu ponto foi no sentido de que, por exemplo, se você não pretende usar todos os níveis do book no EA então, provavelmente MarketBookGet() não deveria ser cogitado já que trará um overhead maior. Desculpe se o texto não foi claro o suficiente. De qualquer forma, fiquei curioso para saber se essa diferença também estaria presente no meu ambiente e executei o script abaixo contra o DOL:

void OnStart()
  {
//---
    double _bid_price = SymbolInfoDouble(_Symbol,SYMBOL_BID);
    double _ask_price = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
    Print("==> Usando SymbolInfoDouble... bid=", _bid_price, " ask=", _ask_price);
    
    MqlTick _tick;
    SymbolInfoTick(_Symbol, _tick);
    Print("==> Usando SymbolInfoTick... bid=", _tick.bid, " ask=", _tick.ask);
  }

 No meu caso os resultados foram idênticos para SymbolInfoDouble e SymbolInfoTick:

EJ      0       14:21:34.421    MDRequest (DOLQ15,M5)   ==> Usando SymbolInfoDouble... bid=3370.5 ask=3371.5
IN      0       14:21:34.421    MDRequest (DOLQ15,M5)   ==> Usando SymbolInfoTick... bid=3370.5 ask=3371.5

 Deixei de fora o teste com o MarketBookGet() porque esse método não funciona com scripts. Quando sobrar um tempo pretendo fazer uma nova comparação em um EA de testes. Valeria a pena deixar o EA executando por um tempo, comparando os resultados e buscando por diferença de valores. Talvez uma carga maior de CPU ou de rede interfira no resultado.

 
Fabio Bissolotti:

Quando eu disse que as funções retornam resultados diferentes eu me referia à estrutura da resposta. Claro que o conteúdo do topo do book em todas elas deveria ser idêntico em um dado momento. Meu ponto foi no sentido de que, por exemplo, se você não pretende usar todos os níveis do book no EA então, provavelmente MarketBookGet() não deveria ser cogitado já que trará um overhead maior. Desculpe se o texto não foi claro o suficiente. De qualquer forma, fiquei curioso para saber se essa diferença também estaria presente no meu ambiente e executei o script abaixo contra o DOL:

 No meu caso os resultados foram idênticos para SymbolInfoDouble e SymbolInfoTick:

 Deixei de fora o teste com o MarketBookGet() porque esse método não funciona com scripts. Quando sobrar um tempo pretendo fazer uma nova comparação em um EA de testes. Valeria a pena deixar o EA executando por um tempo, comparando os resultados e buscando por diferença de valores. Talvez uma carga maior de CPU ou de rede interfira no resultado.

Posso perguntar de onde você retirou essa informação?

MarketBookGet funciona perfeitamente em scripts...

Abraços,
Malacarne

 
Rodrigo Malacarne:

Posso perguntar de onde você retirou essa informação?

MarketBookGet funciona perfeitamente em scripts...

Abraços,
Malacarne

Olá Rodrigo,

Claro que pode perguntar...

Primeiro foi testando, usando o exemplo da própria documentação:

   MqlBookInfo priceArray[];
   bool getBook=MarketBookGet(NULL,priceArray);
   if(getBook)
     {
      int size=ArraySize(priceArray);
      Print("MarketBookInfo for ",Symbol());
      for(int i=0;i<size;i++)
        {
         Print(i+":",priceArray[i].price
               +"    Volume = "+priceArray[i].volume,
               " type = ",priceArray[i].type);
        }
     }
   else
     {
      Print("Could not get contents of the symbol DOM ",Symbol());
     }

No meu caso esse código em script sempre retorna a msg "Could not get contents of the symbol DOM".

Ao mesmo tempo,  a página de documentação para o método MarketBookGet traz a seguinte nota:

Note

The Depth of Market must be pre-opened by the MarketBookAdd() function. 

 Resumindo um pouco, pressupõe-se que o MarketBookGet() deva ser chamado de OnBookEvent(), que também conforme a doc, só está disponível em indicadores e experts (não em scripts).

 

Se a conclusão estiver errada e houver uma forma de chamar o método de scripts, então agradeço se você puder esclarecer.

 

Abs.,
Fábio 

Razão: