iClose(), iTime(), CopyRates() etc. takes seconds and crashes EA and MT5

 

Hi,

I reported this issue already one year ago to MetaQuotes but never got a helpful response. Sometimes - don´t ask me when - a simple execution of functions like iClose(), iTime() or CopyRates(), CopyTime() whatever takes more than 30 seconds until the code-pointer returns. And of course, when you execute several commands in a row, the EA crashes. 

It happens with several brokers - only on live accounts - and with several symbols and all MT5 versions. I just never saw it with real futures, but with almost any other. It happens with a local internet connect, with a VPS, with my environment and with environment of customers, very rare, but it happens and only with MT5, not MT4. I already implemented a measurement and a forced termination of the EA, when the measurement detects a timeout (>4 seconds).

This is pretty annoying and I am sure, this is general problem of MT5, not a broker specific. 

Any hints?

Thank you. 

 
Doerk Hilger: And of course, when you execute several commands in a row, the EA crashes.
  1. Probably because you aren't checking return codes and eventually getting a divide by zero or array exceeded.
  2. On MT5: Unless the chart is that specific pair/TF, you must Synchronize the terminal Data from the Server.
              Timeseries and Indicators Access /  Data Access - Reference on algorithmic/automated trading language for MetaTrader 5
              Synchronize Server Data with Terminal Data - Symbols - General - MQL5 programming forum
 

Doerk Hilger:

Any hints?

I've got home-made indicators that use all of these: iClose(), iHigh(), iLow(), CopyRates(), CopyTime(), iBarShift(), Bars(), BarsCalculated().

I've never get the behavior you mention.

Perhaps you could build a minimal example EA or indicator in which this happens and post the code.

 
Doerk Hilger:

Hi,

I reported this issue already one year ago to MetaQuotes but never got a helpful response. Sometimes - don´t ask me when - a simple execution of functions like iClose(), iTime() or CopyRates(), CopyTime() whatever takes more than 30 seconds until the code-pointer returns.

What kind of call to these functions ? Multi-symbol or chart symbol ? Multi-timeframes or chart timeframe ? Executed where (OnTick, OnTimer...) ?

What is returned by the function ? Is there are error reported ?

And of course, when you execute several commands in a row, the EA crashes. 

Why "of course" ? a crash is never "of course". What are you calling an "EA crash" exactly ? Is there anything in the log ?

Is it a single EA instance or several ? If several, how much ? Are they accessing the same data ?

 
Alain Verleyen:

What kind of call to these functions ? Multi-symbol or chart symbol ? Multi-timeframes or chart timeframe ? Executed where (OnTick, OnTimer...) ?

What is returned by the function ? Is there are error reported ?

Why "of course" ? a crash is never "of course". What are you calling an "EA crash" exactly ? Is there anything in the log ?

Is it a single EA instance or several ? If several, how much ? Are they accessing the same data ?

1. Only chart symbol

2. No error code at all, just a massive delay

3. Nothing in the log

4. Happens on single instance

5. The code is called during OnTimer() and OnTick(), its simple:


datetime   _iTime(string symbolname, ENUM_TIMEFRAMES tf, int shift=0)
   {
      return iTime(symbolname,tf,shift));
   }

and with measurement using also CopyTime

long quotes_suspend_time=0;
#define QUOTES_MEASURE_TIME_INIT(retval) long t_begin = ::GetTickCount(); if (quotes_suspend_time>0 && t_begin-quotes_suspend_time<4000) { Print("Critical error: Timeout reading bar data!"); return retval; }
#define QUOTES_MEASURE_TIME_UPDATE long t_measure = ::GetTickCount(); quotes_suspend_time = (t_measure-t_begin>1000) ? t_measure : 0;

datetime   _iTime(string symbolname, ENUM_TIMEFRAMES tf, int shift=0)
   {
      //--- Get out with error when suspended
      QUOTES_MEASURE_TIME_INIT(0)
      //---
      datetime dt[];
      
      if (CopyTime(symbolname,tf,shift,1,dt)<0)
         return 0;
      QUOTES_MEASURE_TIME_UPDATE
      return dt[0];
   }
 
William Roeder:
  1. Probably because you aren't checking return codes and eventually getting a divide by zero or array exceeded.
  2. On MT5: Unless the chart is that specific pair/TF, you must Synchronize the terminal Data from the Server.
              Timeseries and Indicators Access /  Data Access - Reference on algorithmic/automated trading language for MetaTrader 5
              Synchronize Server Data with Terminal Data - Symbols - General - MQL5 programming forum

#2

Thank you! Will try this and keep this topic updated. 

The EA analyzes history data, but normally not more than two weeks from the past. But anyway, who knows and maybe this is the solution.

But anyway, if such data is not present, shouldn´t these function return an error instead of freezing the EA?
 
Doerk Hilger:
But anyway, if such data is not present, shouldn´t these function return an error instead of freezing the EA?

Typically:

ERR_HISTORY_NOT_FOUND    4401    Requested history not found

Look for it using GetLastError(). Perhaps something like this:

datetime   _iTime(string symbolname, ENUM_TIMEFRAMES tf, int shift=0)
   {
      //--- Get out with error when suspended
      QUOTES_MEASURE_TIME_INIT(0)
      //---
      datetime dt[];
      
      ResetLastError();
      int copied = CopyTime(symbolname,tf,shift,1,dt);
      int lastError = GetLastError();
      if ( copied < 0 )
      {
         PrintFormat("error [%d]", lastError);
         return 0;
      }
      QUOTES_MEASURE_TIME_UPDATE
      return dt[0];
   }
 
Anthony Garot:

Typically:

ERR_HISTORY_NOT_FOUND    4401    Requested history not found

Look for it using GetLastError(). Perhaps something like this:

Thanks, I updated the function.

But anyway, this must be a kind of a bug, because I still have this issue and it happens from time to time and it happens when the Shift-value is ZERO.

This morning, EA is running since 48 hours, just like that in the middle of nothing, everything freezes and the function reports a timeout at _iTime(symbol,PERIOD_CURRENT,0). This should never happen, in no circumstance. 

 
Doerk Hilger:

Thanks, I updated the function.

But anyway, this must be a kind of a bug, because I still have this issue and it happens from time to time and it happens when the Shift-value is ZERO.

This morning, EA is running since 48 hours, just like that in the middle of nothing, everything freezes and the function reports a timeout at _iTime(symbol,PERIOD_CURRENT,0). This should never happen, in no circumstance. 

Without a testcase code I am afraid they will not investigate this issue.
 
The code above is all which is used. I execute it in OnIint() to check upfront if there are issues. Thats it. 
 
Doerk Hilger:
The code above is all which is used. I execute it in OnIint() to check upfront if there are issues. Thats it. 

I will not build an EA from snippet of code to help you.

Please provide an testcase EA, I will try to reproduce your issue, and then report it to Metaquotes. Otherwise I can't help sorry.

Reason: