Проверка истории котировок MT5

 
Много написано статей про проверку загруженных котировок и их готовность для использования функциями типа iTime, iBarShift и т.п., но я так и не уяснил для себя четкий алгоритм позволяющий:

1. Удостовериться, что котировки загружены с сервера

2. Котировки готовы для использования

3. Загрузить недостающий исторические котировки (при первом включении, обрыве соединения, получения ошибки о недоступности истории от функций iTime, iBarShift  ...)

Причем интересует все выше описанное не только для других таймфреймов одноразово, но и текущий на котором работает индикатор (советник) онлайн.

Понятно, что главная сложность в асинхронном режиме получения истории и подготовки котировок формата hc.
Просьба поделиться кто как решает эту задачу?
 
Petr Vorob'ev:
Много написано статей про проверку загруженных котировок и их готовность для использования функциями типа iTime, iBarShift и т.п., но я так и не уяснил для себя четкий алгоритм позволяющий:

1. Удостовериться, что котировки загружены с сервера

2. Котировки готовы для использования

3. Загрузить недостающий исторические котировки (при первом включении, обрыве соединения, получения ошибки о недоступности истории от функций iTime, iBarShift  ...)

Причем интересует все выше описанное не только для других таймфреймов одноразово, но и текущий на котором работает индикатор (советник) онлайн.

Понятно, что главная сложность в асинхронном режиме получения истории и подготовки котировок формата hc.
Просьба поделиться кто как решает эту задачу?

https://www.mql5.com/ru/docs/constants/tradingconstants/enum_series_info_integer
простых решений нет. Лично я использую таймер для получения всех котировок. 
Не уверен, что будет правильно использовать это решение, но изучить его стоит.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
При доступе к таймсериям для получения дополнительной информации об инструменте используется функция SeriesInfoInteger() . В качестве параметра...
 
Nikolai Semko #:
Не уверен, что будет правильно использовать это решение, но изучить его стоит.

Это естественно изучил, но как раз оно то и не подходит, так как не работает (заведомо) для текущего инструмента в том же потоке. 

 
Для более предметного обсуждения набросал пример с функцией проверки / загрузки истории.
Жду комментариев предложений.
Файлы:
 
внес изменения для загрузки при пересчете котировок
Файлы:
 
Petr Vorob'ev #:
Для более предметного обсуждения набросал пример с функцией проверки / загрузки истории.
Жду комментариев предложений.

Что-то кода много у тебя ))
Попробуй так.
Запрашивая время текущего бара iTime(symb, tf, 0);
В данном случае, терминал сам автоматически инициирует подгрузку истории. 
Возможно iTime() будет не корректно использовать, если в терминале уже есть часть истории, не проверял досконально, просто привёл пример.
Если iTime() будет некорректен в использовании, то переделать запрос по TimeCurrent(), но по тому-же смыслу проверки на ошибку.

void LoadHist(string symb, ENUM_TIMEFRAMES tf)
{
   ResetLastError();
   iTime(symb, tf, 0);
   int err = GetLastError();
   
   while(err != ERR_SUCCESS)
   {
      Print("Error: Data for symbol = ", symb, " period = ", EnumToString(tf), " not loaded. Loading data...");
      Sleep(5000);
      
      ResetLastError();
      iTime(symb, tf, 0);
      err = GetLastError();
   }
}
 
Проверил iTime(, , 0); 
Да, эта функция не годится когда в истории терминала есть какая-то часть истории.
Функция возвращает последнее известное значение в истории.
И GetLastError возвращает 0, т.е. ошибки нет, что не подходит для условия в цикле while.

Тогда переделывать вызов времени бара по TimeCurrent.
 

Итак привожу код который загружает историю в индикаторе.
Особенности: по факту в независимости от исходного ограничения по требуемому количеству баров, загружает все. Т.к. на данном этапе не понятно как определить этот лимит по дате или количеству реально существующих баров на сервере. Возможно от ограничения вообще лучше отказаться, чтобы не получить ошибку или подтормаживание на этапе дозагрузки остатка истории в будущем.

Активность коллег не высокая, но может все таки кто то выскажется...
Файлы:
 
Petr Vorob'ev:
Много написано статей про проверку загруженных котировок и их готовность для использования функциями типа iTime, iBarShift и т.п., но я так и не уяснил для себя четкий алгоритм позволяющий:

1. Удостовериться, что котировки загружены с сервера

2. Котировки готовы для использования

3. Загрузить недостающий исторические котировки (при первом включении, обрыве соединения, получения ошибки о недоступности истории от функций iTime, iBarShift  ...)

Причем интересует все выше описанное не только для других таймфреймов одноразово, но и текущий на котором работает индикатор (советник) онлайн.

Понятно, что главная сложность в асинхронном режиме получения истории и подготовки котировок формата hc.
Просьба поделиться кто как решает эту задачу?

Посмотрите главу в книге, в частности место с описанием QuoteRefresh.mqh

Учебник по MQL5: Создание прикладных программ / Создание пользовательских индикаторов / Мультивалютные и мультитаймфреймовые индикаторы
Учебник по MQL5: Создание прикладных программ / Создание пользовательских индикаторов / Мультивалютные и мультитаймфреймовые индикаторы
  • www.mql5.com
До сих пор мы рассматривали индикаторы, работающие с котировками или тиками символа, являющегося текущим символом графика. Однако иногда необходимо...