Robô fica trancado por alguns minutos quando solicita Séries Temporais (iClose, iOpen e semelhantes)

 

Bom dia, 


Tenho um loop com diversos ativos, e quando o MT5 não recebe os candles da corretora e o código solicita a função 'iClose" por exemplo o robô trava por alguns minutos. (Porque não tem candles).

Já tentei usar IBars para verificar os candles e se caso fosse "0" ele retiraria do array o ativo com problema, mas tambem não funciona o iBars e trava o código. 

Alguem já passou por isso? como posso estar verificando o ativo de outra forma se tem historico de candles? 

Em anexo um exemplo de ativo que existe negociação, DOM etc, mas não recebe os candles da corretora, no caso esse é um dos ativos que ocorre o problema.

Arquivos anexados:
 
Diego MarquezBom dia, Tenho um loop com diversos ativos, e quando o MT5 não recebe os candles da corretora e o código solicita a função 'iClose" por exemplo o robô trava por alguns minutos. (Porque não tem candles). Já tentei usar IBars para verificar os candles e se caso fosse "0" ele retiraria do array o ativo com problema, mas tambem não funciona o iBars e trava o código. Alguem já passou por isso? como posso estar verificando o ativo de outra forma se tem historico de candles? Em anexo um exemplo de ativo que existe negociação, DOM etc, mas não recebe os candles da corretora, no caso esse é um dos ativos que ocorre o problema.

Boa tarde, teste também as funções abaixo, por exemplo, lembrando sempre de verificar o retorno das mesmas (retornam -1 no caso de um erro):

CopyRates

Obtém dados históricos da estrutura Rates para um ativo e período especificados em um array

CopySeries

Obtém no conjunto de arrays especificado as séries temporais sincronizadas da estrutura MqlRates para o símbolo-período especificado na quantidade especificada.

CopyTime

Obtém dados históricos sobre hora de abertura de barras para um ativo e período especificados em um array

CopyOpen

Obtém dados históricos sobre preço de abertura de barras para um ativo e período especificados em um array

CopyHigh

Obtém histórico de dados sobre preço de barra máximo para um ativo e período especificados em um array

CopyLow

Obtém histórico de dados sobre preço de barra minimo para um ativo e período especificados em um array

CopyClose

Obtém histórico de dados sobre preço de fechamento de barra para um ativo e período especificados em um array

 
Diego Marquez:

Bom dia, 


Tenho um loop com diversos ativos, e quando o MT5 não recebe os candles da corretora e o código solicita a função 'iClose" por exemplo o robô trava por alguns minutos. (Porque não tem candles).

Já tentei usar IBars para verificar os candles e se caso fosse "0" ele retiraria do array o ativo com problema, mas tambem não funciona o iBars e trava o código. 

Alguem já passou por isso? como posso estar verificando o ativo de outra forma se tem historico de candles? 

Em anexo um exemplo de ativo que existe negociação, DOM etc, mas não recebe os candles da corretora, no caso esse é um dos ativos que ocorre o problema.

Eu tive que usar isso aqui https://www.mql5.com/pt/docs/series/seriesinfointeger para verificar a primeira barra que o servidor tem e dai tentar puxar os dados só quando eu sei que tem uma quantidade suficiente. Se o simbolo não estiver sincronizado dai tem que jogar ele no market watch pelo que reparei antes de pedir a cotação, ou usar o iBars. Até esses copy* eu ja vi travar e não tem muito o que fazer é esperar o timeout ou olhar antes se havia informação e pular se não houver. Todos meus scanners aqui na primeira passagem do mt5 aberto dão uma engasgada, mas depois vai suave então nunca me empenhei em considerar um problema...
Documentação sobre MQL5: Séries Temporais e Acesso a Indicadores / SeriesInfoInteger
Documentação sobre MQL5: Séries Temporais e Acesso a Indicadores / SeriesInfoInteger
  • www.mql5.com
Retorna informações sobre o estado de dados históricos. Existem 2 variantes de chamada da função. Retorna...
 

Todas as funções "i" dependem de chamadas ao servidor, a documentação é bem clara nisso. Se você não fizer um tratamento de acordo, você está frito.


O grande problema com esta abordagem é que o MQL5 não é verdadeiramente orientado a Eventos, portanto você NUNCA vai saber se tudo está carregado e certo... tem que fazer MIL gambiarras para garantir a carga dos dados...

É por isso que o MQL5 é extremamente complexo de programar...

;)

Razão: