Ошибка 4401 как сбросить без перезагрузки терминала?

 
При размещении советника на чарт возникла ошибка 4401: 

ERR_HISTORY_NOT_FOUND

4401

Запрашиваемая история не найдена


в строке программы:

            (SeriesInfoInteger(iSymbol,PERIOD_CURRENT,SERIES_TERMINAL_FIRSTDATE,iTerminalFirstDate))//Данные получены

по логике программы советник при такой ситуации у меня выгружается.

Многочисленные попытки загрузить советник давали аналогичную ошибку.

Тестовый советник:

int OnInit()
  {
//----- Ошибка 4401
      
      MqlRates iRates[];
      string iSymbol=Symbol();
      ResetLastError();
      Print("SERIES_TERMINAL_FIRSTDATE Error=",GetLastError()," Symbol=",iSymbol," Date=",(datetime)SeriesInfoInteger(iSymbol,PERIOD_CURRENT,SERIES_TERMINAL_FIRSTDATE));
      ResetLastError();
      Print("SERIES_SERVER_FIRSTDATE Error=",GetLastError()," Symbol=",iSymbol," Date=",(datetime)SeriesInfoInteger(iSymbol,PERIOD_CURRENT,SERIES_SERVER_FIRSTDATE));

      int iBarsCurrent=Bars(iSymbol,PERIOD_CURRENT);//Общее количество всех баров в истории терминала
      int inBars=100;
      Print("inBars=",inBars," iBarsCurrent=",iBarsCurrent);
      int iCopied=CopyRates(iSymbol,PERIOD_CURRENT,iBarsCurrent,inBars,iRates);//Запрос подкачки в терминал ещё inBars баров истории начиная с бара iBarsCurrent и дальше в прошлое
      
      ResetLastError();
      Print("SERIES_SYNCHRONIZED Error=",GetLastError()," Symbol=",iSymbol," Date=",SeriesInfoInteger(iSymbol,PERIOD_CURRENT,SERIES_SYNCHRONIZED));

      ResetLastError();
      Print("SERIES_TERMINAL_FIRSTDATE Error=",GetLastError()," Symbol=",iSymbol," Date=",(datetime)SeriesInfoInteger(iSymbol,PERIOD_CURRENT,SERIES_TERMINAL_FIRSTDATE));
      ResetLastError();
      Print("SERIES_SERVER_FIRSTDATE Error=",GetLastError()," Symbol=",iSymbol," Date=",(datetime)SeriesInfoInteger(iSymbol,PERIOD_CURRENT,SERIES_SERVER_FIRSTDATE));


//---
   return(INIT_SUCCEEDED);
  }

Выдавал аналогичные сообщения об ошибке 4401:

QF      0       17:37:19.818    TstData (EURUSD,M1)     SERIES_TERMINAL_FIRSTDATE Error=4401 Symbol=EURUSD Date=1970.01.01 00:00:00
LK      0       17:37:19.818    TstData (EURUSD,M1)     SERIES_SERVER_FIRSTDATE Error=0 Symbol=EURUSD Date=1999.03.05 00:00:00
FK      0       17:37:19.818    TstData (EURUSD,M1)     inBars=100 iBarsCurrent=256000
HP      0       17:37:19.818    TstData (EURUSD,M1)     SERIES_SYNCHRONIZED Error=0 Symbol=EURUSD Date=0
CF      0       17:37:19.818    TstData (EURUSD,M1)     SERIES_TERMINAL_FIRSTDATE Error=4401 Symbol=EURUSD Date=1970.01.01 00:00:00
NK      0       17:37:19.818    TstData (EURUSD,M1)     SERIES_SERVER_FIRSTDATE Error=0 Symbol=EURUSD Date=1999.03.05 00:00:00

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

OM      0       17:38:36.032    TstData (EURUSD,M1)     SERIES_TERMINAL_FIRSTDATE Error=0 Symbol=EURUSD Date=1999.03.05 00:00:00
NS      0       17:38:36.034    TstData (EURUSD,M1)     SERIES_SERVER_FIRSTDATE Error=0 Symbol=EURUSD Date=1999.03.05 00:00:00
LS      0       17:38:36.034    TstData (EURUSD,M1)     inBars=100 iBarsCurrent=256000
IH      0       17:38:36.034    TstData (EURUSD,M1)     SERIES_SYNCHRONIZED Error=0 Symbol=EURUSD Date=1
EM      0       17:38:36.034    TstData (EURUSD,M1)     SERIES_TERMINAL_FIRSTDATE Error=0 Symbol=EURUSD Date=1999.03.05 00:00:00
FS      0       17:38:36.034    TstData (EURUSD,M1)     SERIES_SERVER_FIRSTDATE Error=0 Symbol=EURUSD Date=1999.03.05 00:00:00

Вопрос:

Есть ли возможность каких-либо программных действий для инициализации истории терминала и устранении ошибки 4401 не прибегая к перезагрузке терминала?

 
Yury Kirillov:
При размещении советника на чарт возникла ошибка 4401: 

ERR_HISTORY_NOT_FOUND

4401

Запрашиваемая история не найдена


в строке программы:

по логике программы советник при такой ситуации у меня выгружается.

Многочисленные попытки загрузить советник давали аналогичную ошибку.

Тестовый советник:

Выдавал аналогичные сообщения об ошибке 4401:

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

Вопрос:

Есть ли возможность каких-либо программных действий для инициализации истории терминала и устранении ошибки 4401 не прибегая к перезагрузке терминала?

Эта ошибка, насколько я помню, преодолевается потиково. Т.е. получили ошибку - вышли из функции, на следующем тике снова выполнили запрос истории.

А вообще, чтобы поддерживать историю по чужому символу/периоду в актуальном состоянии, нужно вызывать Bars() с нужным символом/периодом раз в минуту. Можно через таймер настроить.

 
Alexey Kozitsyn:

Эта ошибка, насколько я помню, преодолевается потиково. Т.е. получили ошибку - вышли из функции, на следующем тике снова выполнили запрос истории.

А вообще, чтобы поддерживать историю по чужому символу/периоду в актуальном состоянии, нужно вызывать Bars() с нужным символом/периодом раз в минуту. Можно через таймер настроить.


Спасибо, возможно и так, но у меня ошибка возникает в секции OnInit(), поэтому потиково мне не очень подходит. Хотелось бы получить корректные данные уже при инициализации советника, а не в процессе его работы с тиками в OnTick().

 
Yury Kirillov:

Спасибо, возможно и так, но у меня ошибка возникает в секции OnInit(), поэтому потиково мне не очень подходит. Хотелось бы получить корректные данные уже при инициализации советника, а не в процессе его работы с тиками в OnTick().

Не уверен, что получение исторических данных в функции инициализации - хорошая затея. Она не должна для этого использоваться. Поясните, пожалуйста, какой в этом смысл?
 
Alexey Kozitsyn:
Не уверен, что получение исторических данных в функции инициализации - хорошая затея. Она не должна для этого использоваться. Поясните, пожалуйста, какой в этом смысл?

Хочу проверить достаточно ли данных например для рисования графических объектов. Почему бы не сделать это при инициализации? Почему терминал нельзя синхронизировать в OnInit() (и даже не синхронизировать, а просто проверить его состояние!!!)? Вроде бы нигде про такие ограничения не написано.

Я конечно сделаю повторную инициализацию в OnTick() при необходимости (если не удалась в OnInit()). Но есть определенные сомнения, что поможет. Так как я многократно повторно запускал советник, а ошибка повторялась до тех пор, пока не был перезагружен терминал.
 
Yury Kirillov:

Хочу проверить достаточно ли данных например для рисования графических объектов. Почему бы не сделать это при инициализации? Почему терминал нельзя синхронизировать в OnInit() (и даже не синхронизировать, а просто проверить его состояние!!!)? Вроде бы нигде про такие ограничения не написано.

Прочитайте здесь для чего можно использовать OnInit(). Тут, конечно, не запрещают получать историю в функции инициализации, но историю нужно сначала подготовить. Не факт, что в момент инициализации Вы получите доступ к необходимым данных. Лучше все проверки истории из блока инициализации вынести.
 
Alexey Kozitsyn:
Прочитайте здесь для чего можно использовать OnInit(). Тут, конечно, не запрещают получать историю в функции инициализации, но историю нужно сначала подготовить. Не факт, что в момент инициализации Вы получите доступ к необходимым данных. Лучше все проверки истории из блока инициализации вынести.

Алексей, проблема не в том, что нет доступа к данным, проблема в том что терминал однажды отказав в таком доступе не сбрасывает это состояние при новом старте советника. После перезагрузки терминала ошибка не возникает при многократных попытках запуска того же самого кода. То есть проблема в нестабильности поведения терминала. К сожалению ошибка очень трудно повторимая, поймать такую ситуацию повторно не могу.

 
Yury Kirillov:

Алексей, проблема не в том, что нет доступа к данным, проблема в том что терминал однажды отказав в таком доступе не сбрасывает это состояние при новом старте советника. После перезагрузки терминала ошибка не возникает при многократных попытках запуска того же самого кода. То есть проблема в нестабильности поведения терминала. К сожалению ошибка очень трудно повторимая, поймать такую ситуацию повторно не могу.

Если Вы считаете, что проблема в терминале, то лучше обратиться в сервисдеск.
 
Alexey Kozitsyn:
Если Вы считаете, что проблема в терминале, то лучше обратиться в сервисдеск.

Несомненно так бы и поступил, если бы повторяемость была. Не могу повторить ошибку. Могу лишь отметить, что она возникла при сильной активности рынка после нонфарма. Спасибо за участие, буду встраивать реинициализацию в OnTick() или OnTimer(), надеюсь в другой раз поможет, но уверенности нет.

 
Yury Kirillov:

Несомненно так бы и поступил, если бы повторяемость была. Не могу повторить ошибку. 

Юрий, это не ошибка. Это нормальная работа терминала. Алексей правильно сказал, что функция OnInit - не место для ожидания подкачки данных с сервера. Все это делается в OnTick или OnTimer. Да и отображать графические объекты в OnInit также не обязательно. Ведь они после этого могут быть кем-то уничтожены. А потому их снова нужно будет отображать в OnTick. Следовательно, OnInit для этих целей не подходит (если в OnTick все равно нужно проверять наличие объектов и заново их отображать при необходимости). Выход один - после запроса данных через CopyRates (не Bars, т. к. bars не инициирует подкачку данных) и получения отрицательного результата нужно уходить на ожидание окончания подкачки данных.
 
Ihor Herasko:
Выход один - после запроса данных через CopyRates (не Bars, т. к. bars не инициирует подкачку данных) и получения отрицательного результата нужно уходить на ожидание окончания подкачки данных.
Про Bars() не я придумал