Dúvida sobre a função SLEEP

 

Olá pessoal, espero que esteja tudo bem com vocês. 


Estou tendo problemas com o MT5 após o mesmo fechar uma ordem milissegundos depois, pois faço a consulta no histórico antes de cada negociação.


Por exemplo, estou com a posição 5 em aberto e no meu histórico tem as posições  1,2,3,4 já fechadas ... no exato momento que essa posição 5 é fechada eu já faço um PositionSelect (que me retorna FALSE, que é oque exatamente eu espero), mas quando eu executo o HistorySelect ... essa posição 5 ainda não foi registrada lá e o algoritmo acaba pegando as informações da última posição que ele encontra que no caso é a 4 erroneamente. 

OBS.: Isso não ocorre sempre, mas sempre que ocorre acaba me dando dor de cabeça.


A solução que pensei é colocar um SLEEP de 500 milissegundos antes de fazer a consulta do HistorySelect, mas ao meu ver isso não seria uma boa prática rs. Alguém teria alguma ideia melhor por gentileza?


Em relação a conexão, já uso a melhor possível acredito eu ... VPS em SP com 1.5 ms ... acredito não ser possível melhorar isso sem maiores investimentos. 

 
investimentosjean:


Olá,

bom isso acontece quando ocorre atraso no DEAL da execução da ordem , o DEAL é quem atualiza o históricos. Pois bem, é estranho e vai contra o manual que diz que a atualização da posição é última etapa na execução de uma transação, pois não é assim que acontece na DEAL tipo OUT.


When handling transactions of TRADE_TRANSACTION_REQUEST type, it is necessary to analyze the second and third parameters of the OnTradeTransaction() function – request and result – to receive additional information.

Sending a buy trade request leads to a chain of trade transactions on a trading account: 
1) request is accepted for processing, 
2) an appropriate purchase order is created for the account,
3) the order is then executed, 
4) the executed order is removed from the list of active ones, 
5) adding to the history of orders, 
6) the subsequent transaction is added to history and 
7) a new position is created. All these stages are trade transactions. The arrival of each such transaction to the terminal is the TradeTransaction event. Priority of these transactions' arrival at the terminal is not guaranteed. 
Thus, you should not expect that one group of transactions will arrive after another one when developing your trading algorithm.


Eu passei a usar o on OnTradeTransaction() para capturar os DEAL(s) OUT e assim verificar que uma posição/ordem (out) foi totalmente executada e abandonei o PositionSelect() para verificar fechamento de uma posição.

Razão: