Resultados errados de volume de compra pelo CTrade com ResultRetCode = TRADE_RETCODE_DONE

 

Por favor, como consigo acompanhar a compra "a mercado" pelo CTrade? Há situações frequentes em que o volume da compra não é retornado corretamente pelo Trade.RestultRetcode() mesmo com resultado TRADE_RETCODE_DONE. Inicialmente, julguei que fosse um problema da corretora Rico (XP), que às vezes efetua operações com diferentes taxas de latência em operações dentro da XP, menor que o tempo de atualização de algum cache de memória. Acrescentei um sleep(15000) de 15 segundos, mas continuo tendo problema com o resultado do volume negociado. No simulador não encontro problema nenhum.

Ademais, como rastrear os valores de cada "deal", quando é dividido em lotes de preços diferentes? No Journal ou "Terminal" aparecem as informações, mas como obtenho isso no código?

      if(!Trade.Buy(quantidadeAtivos, _Symbol, precoAskInteiro, 0, 0, "[COMPRA]"))
        {
         Print(_Symbol," Ordem de COMPRA primeira REJEITADA na estrutura do comando.", GetLastError());
         ResetLastError();
         return false;
        }
      Sleep(SONECA_TRADE); //para dar tempo da corretora atualizar cache.
      //ResultRetCode() é síncrono: espera até 1 minuto para surgir resultado da corretora.
      uint  resultado = Trade.ResultRetcode();
      Print(_Symbol, " Resultado ", resultado, " = ", Trade.ResultRetcodeDescription());

Print(_Symbol, " Volume comprado: ", Trade.ResultVolume(), " pelo preço R$", Trade.ResultPrice());
 
Zoltan Paulini:

Por favor, como consigo acompanhar a compra "a mercado" pelo CTrade? Há situações frequentes em que o volume da compra não é retornado corretamente pelo Trade.RestultRetcode() mesmo com resultado TRADE_RETCODE_DONE. Inicialmente, julguei que fosse um problema da corretora Rico (XP), que às vezes efetua operações com diferentes taxas de latência em operações dentro da XP, menor que o tempo de atualização de algum cache de memória. Acrescentei um sleep(15000) de 15 segundos, mas continuo tendo problema com o resultado do volume negociado. No simulador não encontro problema nenhum.

Ademais, como rastrear os valores de cada "deal", quando é dividido em lotes de preços diferentes? No Journal ou "Terminal" aparecem as informações, mas como obtenho isso no código?

Procura por OnTrade aqui no forum que tinha um exemplo de um colega sobre como rastrear as execuções. Essa forma colocando um Sleep entre as coisas é errado porque muitas vezes pra ter novos dados, a função que esta executando precisa terminar e na proxima chamada só que os dados são disponibilizados....

 
Ricardo Rodrigues Lucca #:

Procura por OnTrade aqui no forum que tinha um exemplo de um colega sobre como rastrear as execuções. Essa forma colocando um Sleep entre as coisas é errado porque muitas vezes pra ter novos dados, a função que esta executando precisa terminar e na proxima chamada só que os dados são disponibilizados....


Agradeço a resposta. A respeito do OnTrade(), como essa função poderia me ajudar? O código que mostrei, executo-o no OnTick().

Sobre o exemplo do colega a respeito de rastrear execuções: só me aparece sua resposta a esta minha pergunta. Poderia me passar alguma informação adicional para procurar? Nome, ou palavra-chave?

Minha pergunta é bem objetiva: como obtenho aquelas informações de "Deal" que o journal ou expert exibe ao executar uma ordem? Embora a função espere até 60 segundos (eu medi pela Rico), o CTrade.ResultRetcode() parece falhar em algumas situações, ou provavelmente eu precise tomar algum cuidado que me escapou. De qualquer modo, o Resultcode é incompleto, pois a execução no mercado pode dividir o lote em várias ordens com preços diferentes, e o Retcode() só me fornece um único preço (não reparei se é o último, ou o maior).

 
Zoltan PauliniPor favor, como consigo acompanhar a compra "a mercado" pelo CTrade? Há situações frequentes em que o volume da compra não é retornado corretamente pelo Trade.RestultRetcode() mesmo com resultado TRADE_RETCODE_DONE. Inicialmente, julguei que fosse um problema da corretora Rico (XP), que às vezes efetua operações com diferentes taxas de latência em operações dentro da XP, menor que o tempo de atualização de algum cache de memória. Acrescentei um sleep(15000) de 15 segundos, mas continuo tendo problema com o resultado do volume negociado. No simulador não encontro problema nenhum. Ademais, como rastrear os valores de cada "deal", quando é dividido em lotes de preços diferentes? No Journal ou "Terminal" aparecem as informações, mas como obtenho isso no código?

Acredito que você esteja procurando por HistoryDealGetDouble() . . .


Veja também:

 
Agradeço imensamente vossas respostas. @Vinicius Pereira De Oliveira acertou em cheio exatamente o que eu procurava. Eu tentava usar vários objetos, e a última resposta me estimulou a rastrear o HistoryDeal…() no header de CDealInfo. Agora descobri que o objeto declarado no header é quase inútil para os brasileiros (seria um bug no mql5?), pois nem inicializar o HistorySelect() ele realiza. Portanto, utilizando todas as funções de HistoryDeal…() antecedidas pelo HistorySelect(), é possível obter todas as informações que eu procuro sobre a execução da ordem. Caso eu venha converter ou derivar o cDealInfo para português, acrescentarei uma inicialização mais conveniente, mas parece desnecessário por causa da simplicidade dos comandos History…().
Respondendo minha própria pergunta, publico meu código corrigido para consulta de todos sobre este tema. Curioso que a lista de History…() sempre começa da informação mais antiga e termina na mais recente.
      if(!HistorySelect(0, TimeCurrent()))
     {
      Print("Erro ao carregar o histórico!");
      return;
     }

   int total_deals = HistoryDealsTotal();
   Print("Total de deals no histórico: ", total_deals);

   for(int j = 0; j < total_deals; j++)
     {
      ulong ticket = HistoryDealGetTicket(j);
      Print("Índice: ", j, " Ticket: ", ticket, " Símbolo: ",HistoryDealGetString(ticket,DEAL_SYMBOL));
      Print("  Ordem n.", HistoryDealGetInteger(ticket, DEAL_ORDER), " Tipo: ", 
      HistoryDealGetInteger(ticket, DEAL_TYPE) == DEAL_TYPE_BUY ? "compra" : "venda");
      Print("  Volume = ", (int)HistoryDealGetDouble(ticket, DEAL_VOLUME), " Preço = R$", HistoryDealGetDouble(ticket, DEAL_PRICE));
     }
 
Zoltan Paulini #:


Agradeço a resposta. A respeito do OnTrade(), como essa função poderia me ajudar? O código que mostrei, executo-o no OnTick().

Sobre o exemplo do colega a respeito de rastrear execuções: só me aparece sua resposta a esta minha pergunta. Poderia me passar alguma informação adicional para procurar? Nome, ou palavra-chave?

Minha pergunta é bem objetiva: como obtenho aquelas informações de "Deal" que o journal ou expert exibe ao executar uma ordem? Embora a função espere até 60 segundos (eu medi pela Rico), o CTrade.ResultRetcode() parece falhar em algumas situações, ou provavelmente eu precise tomar algum cuidado que me escapou. De qualquer modo, o Resultcode é incompleto, pois a execução no mercado pode dividir o lote em várias ordens com preços diferentes, e o Retcode() só me fornece um único preço (não reparei se é o último, ou o maior).

Isso, o Vinicus tem razão é OnTradeTransaction aquele codigo dele nessa resposta naquele ultimo link que ele colocou. Se olhar o código pra mim é a melhor forma de fazer o rastreamento. Eu tinha separado aquele codigo aqui e não lembrava o tópico.


Tu já deve ter experimentado nesse momento mas o HistorySelect serve pra filtrar por data que dai se quiser receber só as de hoje é facil controlar ali do que fazer uns ifs em baixo. Mas que bom que deu certo.

 
Ricardo Rodrigues Lucca #:
Isso, o Vinicus tem razão é OnTradeTransaction aquele codigo dele nessa resposta naquele ultimo link que ele colocou. Se olhar o código pra mim é a melhor forma de fazer o rastreamento. Eu tinha separado aquele codigo aqui e não lembrava o tópico.


Tu já deve ter experimentado nesse momento mas o HistorySelect serve pra filtrar por data que dai se quiser receber só as de hoje é facil controlar ali do que fazer uns ifs em baixo. Mas que bom que deu certo.


Encontrei uma informação valiosa de Vladimir nesse assunto a respeito do HistorySelect.

Essa recomendação fez meu algoritmo encontrar deals sumidos: utilizar SEMPRE o horário do servidor, e selecionar uma data para o futuro, para garantir a recuperação das informações:

HistorySelect(dataInicio - 60*60*24, TimeTradeServer()+60*60*24);

"Melhor sobrar do que faltar".