Проверка состояния символа

Ранее мы рассмотрели несколько функций, связанных с состоянием символа. Напомним, что для проверки существования символа используется — SymbolExist, а для включения или исключения из списка Обзора рынкаSymbolSelect. Среди свойств символа есть несколько аналогичных по назначению флагов, использование которых имеет как плюсы, так и минусы по сравнению с вышеупомянутыми функциями.

В частности, свойство SYMBOL_SELECT позволяет узнать, выбран ли указанный символ в Обзоре рынка, в то время как функция SymbolSelect меняет это свойство.

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

Все флаги представляют собой логические значения, получаемые через функцию SymbolInfoInteger.

Идентификатор

Описание

SYMBOL_EXIST

Признак того, что символ с заданным именем существует

SYMBOL_SELECT

Признак того, что символ выбран в Обзор рынка

SYMBOL_VISIBLE

Признак того, что заданный символ отображается в Обзоре рынка

Особый интерес представляет SYMBOL_VISIBLE. Дело в том, что некоторые символы (как правило, это кросс-курсы, которые необходимы для расчёта маржинальных требований и прибыли в валюте депозита) выбираются в Обзор рынка автоматически и при этом не отображаются в списке, видимом пользователю. Для отображения такие символы должны быть выбраны явно (пользователем или программно). Таким образом, именно свойство SYMBOL_VISIBLE позволяет определить, виден ли символ в окне: оно может оказаться равным false у некоторых элементов списка, полученного с помощью пары функций SymbolsTotal и SymbolName с параметром selected равным true.

Рассмотрим простой скрипт (SymbolInvisible.mq5), который ищет в терминале неявным образом выбранные символы, то есть такие, которые не отображаются в Обзоре рынка (SYMBOL_VISIBLE сброшен), но тем не менее для них SYMBOL_SELECT равно true.

#define PUSH(A,V) (A[ArrayResize(AArraySize(A) + 1) - 1] = V)
   
void OnStart()
{
   const int n = SymbolsTotal(false);
   int selected = 0;
   string invisible[];
   // цикл по всем имеющимся символам
   for(int i = 0i < n; ++i)
   {
      const string s = SymbolName(ifalse);
      if(SymbolInfoInteger(sSYMBOL_SELECT))
      {
         selected++;
         if(!SymbolInfoInteger(sSYMBOL_VISIBLE))
         {
            // собираем в массив выбранные, но невидимые символы
            PUSH(invisibles);
         }
      }
   }
   PrintFormat("Symbols: total=%d, selected=%d, implicit=%d",
      nselectedArraySize(invisible));
   if(ArraySize(invisible))
   {
      ArrayPrint(invisible);
   }
}

Попробуйте откомпилировать и запустить скрипт на разных счетах. Ситуация, когда символ выбран неявным образом встречается не всегда. Например, если в Обзоре рынка выбраны тикеры российских голубых фишек, которые котируются в рублях, а торговый счет в валюте (например, доллары или евро, но не рубли), то символ "USDRUB" будет выбран автоматически. Разумеется, при этом предполагается, что он не был ранее добавлен в Обзор рынка явным образом. Тогда получим в журнале результат такого вида:

Symbols: total=50681, selected=49, implicit=1
"USDRUB"