Ошибка в MQL5. Просьба к разработчикам исправить. Не можем торговать.

 

Здравствуйте. С некоторых времен, начиная с декабря или ноября прошлого года, начала наблюдаться следующая ошибка. Наш робот котировок готовит данные для торгового робота после окончания торгов на российской бирже. Соответственно, все расчеты вызываются в процедуре OnTimer. Так вот процедура CopyTime, вызванная из процедуры OnTimer, со второго дня работы терминала, начинает показывать некорректные значения, а возможно и процедуры CopyHigh, CopyLow, CopyClose, и т.д.

Я выделил предполагаемую ошибку в отдельный тестовый модуль и запустил его на выделенном сервере. Ошибка проявилась.
Код тестового модуля:

//+------------------------------------------------------------------+
//|                                                   test_error.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(60);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
long g_nOldDate = 19700101;

int g_nTimeOffset = 0;

void OnTimer()
{
   datetime dGMT = TimeGMT();
   MqlDateTime mdt_gmt;
   TimeToStruct(dGMT, mdt_gmt);
   
   long nNewDate = mdt_gmt.year * 10000 + mdt_gmt.mon * 100 + mdt_gmt.day;
   
   if (mdt_gmt.hour != 16 || nNewDate == g_nOldDate) return;
   g_nOldDate = nNewDate;
   
   datetime dCurDay[];
   CopyTime(Symbol(), PERIOD_D1, g_nTimeOffset, 1, dCurDay);
   MqlDateTime mdt_cur;
   TimeToStruct(dCurDay[0], mdt_cur);
   
   printf("The date today: GMT - %.04d.%.02d.%.02d, CopyTime - %.04d.%.02d.%.02d", 
      mdt_gmt.year, mdt_gmt.mon, mdt_gmt.day, 
      mdt_cur.year, mdt_cur.mon, mdt_cur.day);
}
//+------------------------------------------------------------------+

На второй день работы, этот советник начал выдавать некорректное значение даты, полученной из функции CopyTime (см. аттач)

Файлы:
2edjlb52.png  326 kb
 
ничего удивительного, на пример в мт4 онтаймер в тестере с момента сотворения мира не работает и никто не возникает, тестируйте свои функции в онтике, а потом просто замените на онтаймер
 
Aleksey Semenov:
ничего удивительного, на пример в мт4 онтаймер в тестере с момента сотворения мира не работает и никто не возникает, тестируйте свои функции в онтике, а потом просто замените на онтаймер

я подожду официального ответа разработчиков

 
Мне необходимо получать котировки и таймсерии в неторговое время. 
 
antru:
Мне необходимо получать котировки и таймсерии в неторговое время. 

Говорите ошибка проявляется именно на второй день?

В общем поставил Ваш код и свой

//+------------------------------------------------------------------+
//|                                                     CopyTime.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   datetime dGMT=TimeGMT();
   MqlDateTime mdt_gmt;
   TimeToStruct(dGMT,mdt_gmt);

   datetime dCurDay[];
   ResetLastError();
   int copy_time_d1=CopyTime(Symbol(),PERIOD_D1,0,1,dCurDay);
   if(copy_time_d1==-1)
     {
      Print(__FUNCTION__,", ERROR CopyTime: ",GetLastError());
      return;
     }

   MqlDateTime mdt_cur;
   TimeToStruct(dCurDay[0],mdt_cur);

   PrintFormat("The date today: GMT - %.04d.%.02d.%.02d, CopyTime - %.04d.%.02d.%.02d",
          mdt_gmt.year, mdt_gmt.mon, mdt_gmt.day,
          mdt_cur.year, mdt_cur.mon, mdt_cur.day);
  }
//+------------------------------------------------------------------+

на AFLT.MM,H1 , реал Just2Trade.


Завтра вечером посмотрю развитие ситуации.


 

Итак, мой терминал и операционная система:

2019.02.07 15:43:39.562 MetaTrader 5 x64 build 1981 started (MetaQuotes Software Corp.)
2019.02.07 15:43:39.565 Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i3-3120M  @ 2.50GHz, Memory: 2814 / 8077 Mb, Disk: 102 / 415 Gb, GMT+2
2019.02.07 15:43:39.565 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Был запущен мой код (принтовал каждый 60 секунд) и проверочный код.

В итоге, всё отработало правильно и без ошибок:

2019.02.07 18:59:41.995 test_error (AFLT.MM,H1) The date today: GMT - 2019.02.07, CopyTime - 2019.02.07
2019.02.07 19:27:48.958 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.07, CopyTime - 2019.02.07
2019.02.07 19:28:48.957 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.07, CopyTime - 2019.02.07
2019.02.07 19:29:48.957 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.07, CopyTime - 2019.02.07
***
2019.02.08 17:56:53.867 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.08, CopyTime - 2019.02.08
2019.02.08 17:57:53.885 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.08, CopyTime - 2019.02.08
2019.02.08 17:58:53.890 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.08, CopyTime - 2019.02.08
2019.02.08 17:59:53.883 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.08, CopyTime - 2019.02.08
2019.02.08 18:00:27.346 test_error (AFLT.MM,H1) The date today: GMT - 2019.02.08, CopyTime - 2019.02.08
2019.02.08 18:00:53.886 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.08, CopyTime - 2019.02.08
2019.02.08 18:01:53.892 CopyTime (AFLT.MM,H1)   The date today: GMT - 2019.02.08, CopyTime - 2019.02.08
 
antru:

Здравствуйте. С некоторых времен, начиная с декабря или ноября прошлого года, начала наблюдаться следующая ошибка. Наш робот котировок готовит данные для торгового робота после окончания торгов на российской бирже. Соответственно, все расчеты вызываются в процедуре OnTimer. Так вот процедура CopyTime, вызванная из процедуры OnTimer, со второго дня работы терминала, начинает показывать некорректные значения, а возможно и процедуры CopyHigh, CopyLow, CopyClose, и т.д.

Я выделил предполагаемую ошибку в отдельный тестовый модуль и запустил его на выделенном сервере. Ошибка проявилась.
Код тестового модуля:

На второй день работы, этот советник начал выдавать некорректное значение даты, полученной из функции CopyTime (см. аттач)

Укажите пожалуйста номер сборки (build) вашего терминала.

 

TimeGMT - почему вы работаете с GMT временем вместо времени сервера?

Так легко же получить дельту в несколько часов.

 

Прошел день. Ситуация еще хуже.

Скриншот бага и билд терминала см. аттач. (build 1940)


iCCI iRSI Mechanic

iCCI iRSI Mechanic

Файлы:
rrs9jbfk.png  50 kb
fdwrv85z1.png  39 kb
 

У вас дневной график открыт? Если нет, то возможно, что первый запрос возвращает устаревшие данные. Сделайте проверку на количество скопированных элементов и код последней ошибки.

Извиняюсь, вижу что проверка есть, но код ошибки лучше проверять даже если CopyTime возвращает 1.

 
Поскольку вижу, что проблема не общего характера, и присутствует, может быть, у меня одного, попробую вылечить ее тем способом, которым лечатся 90% проблем. Т.к. пользуюсь portable режимом терминала (на сервере несколько аккаунтов, работает несколько роботов, около трех или четырех терминалов от разных провайдеров постоянно запущено и есть плохой опыт использования под разными аккаунтами одного и того же экзешника), то есть способ, при котором, как я уже сказал, устраняются 90% возникающих проблем. Это перезапись терминала в новую папку со всеми вытекающими. Попробую сделать это.
Причина обращения: