Проверка актуальности данных по символу

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

bool SymbolIsSynchronized(const string name)

Функция возвращает true, если локальные данные по символу с именем name синхронизированы с данными на торговом сервере.

В разделе Получение характеристик массивов котировок было представлено, среди прочих свойств таймсерий, свойство SERIES_SYNCHRONIZED, которое возвращает более узкий по своему смыслу признак синхронизированности: он распространяется на конкретное сочетание символа и таймфрейма. В отличие от этого свойства, функция SymbolIsSynchronized возвращает признак синхронизированности общей истории символа.

Построение всех таймфреймов запускается только после завершения скачивания истории. Из-за многопоточной архитектуры и параллельных вычислений в терминале может сложиться ситуация, когда SymbolIsSynchronized вернет true, а для какого-либо таймфрейма на том же символе свойство SERIES_SYNCHRONIZED будет временно равно false.

Посмотрим, как новая функция работает в индикаторе SymbolListSync.mq5. Он предназначен для периодической проверки всех символов из Обзора рынка на синхронизированность. Период проверки задается пользователем в параметре SyncCheckupPeriod в секундах. Он обуславливает запуск таймера в OnInit.

#property indicator_chart_window
#property indicator_plots 0
   
input int SyncCheckupPeriod = 1// SyncCheckupPeriod (seconds)
   
void OnInit()
{
   EventSetTimer(SyncCheckupPeriod);
}

В обработчике OnTimer в цикле вызываем SymbolIsSynchronized и собираем в общую строку все несинхронизированные символы, после чего они выводятся в комментарии и в журнале.

void OnTimer()
{
   string unsynced;
   const int n = SymbolsTotal(true);
   // проверяем все символы в Обзоре рынка
   for(int i = 0i < n; ++i)
   {
      const string s = SymbolName(itrue);
      if(!SymbolIsSynchronized(s))
      {
         unsynced += s + "\n";
      }
   }
      
   if(StringLen(unsynced) > 0)
   {
      Comment("Unsynced symbols:\n" + unsynced);
      Print("Unsynced symbols:\n" + unsynced);
   }
   else
   {
      Comment("All Market Watch is in sync");
   }
}

Например, если добавить в Обзор рынка отсутствовавший ранее символ (Brent), получим запись такого вида:

Unsynced symbols:
Brent

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