Получение списков доступных символов и Обзора рынка

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

int SymbolsTotal(bool selected)

Параметр selected задает, запрашиваются ли только символы в Обзоре рынка (true) или все доступные символы (false).

В паре с SymbolsTotal обычно используется еще одна функция — SymbolName: она возвращает название символа по его сквозному номеру (группировка хранения символов по логическим папкам здесь не учитывается, см. свойство SYMBOL_PATH).

string SymbolName(int index, bool selected)

Параметр index задает номер запрашиваемого символа. Значение index должно лежать в пределах от 0 до количества символов, с учетом контекста запроса, определяемого вторым параметром selected: true ограничивает перечисление символами, выбранными в Обзор рынка, в то время как false соответствует абсолютно всем символам (по аналогии с SymbolsTotal). Следовательно, при вызове SymbolName следует всегда указывать в selected такое же значение, как и при предыдущем вызове SymbolsTotal, использованном для определения диапазона индексов.

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

Важно отметить, что при включенной опции selected пара функций SymbolsTotal и SymbolName возвращает информацию для списка символов, реально актуализируемых терминалом, то есть символов, по которым производится постоянная синхронизация с сервером, а для MQL-программ доступна история котировок. Этот список может быть больше списка, видимого в Обзоре рынка, куда элементы добавляются явным образом: пользователем или MQL-программой (о том, как это делается — см. раздел Редактирование списка Обзора рынка). Такие невидимые в окне символы автоматически подключаются терминалом, когда они необходимы для расчета кросс-курсов. Среди свойств символов имеются два, позволяющие отличить явный выбор (SYMBOL_VISIBLE) от неявного (SYMBOL_SELECT) — они будут рассмотрены в разделе о проверке состояния символа. Строго говоря, для функций SymbolsTotal и SymbolName установка selected в true соответствует расширенному набору символов с взведенным свойством SYMBOL_SELECT, а не только тех, что имеют SYMBOL_VISIBLE равное true.

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

Порядок в общем списке Символов задается самим терминалом (содержимое и сортировка Обзора рынка на него не влияет).

В качестве примера рассмотрим простой скрипт SymbolList.mq5, который выводит в журнал доступные символы. Входной параметр MarketWatchOnly позволяет пользователю ограничить список только символами в Обзоре рынка (если параметр равен true) или получить полный список (false).

#property script_show_inputs
   
#include <MQL5Book/PRTF.mqh>
   
input bool MarketWatchOnly = true;
   
void OnStart()
{
   const int n = SymbolsTotal(MarketWatchOnly);
   Print("Total symbol count: "n);
   // пишем список символов в Обзоре рынка или всех доступных
   for(int i = 0i < n; ++i)
   {
      PrintFormat("%4d %s"iSymbolName(iMarketWatchOnly));
   }
   // намеренно запрашиваем вне диапазона, чтобы показать ошибку
   PRTF(SymbolName(nMarketWatchOnly)); // MARKET_UNKNOWN_SYMBOL(4301)
}

Ниже приводится пример журнала.

Total symbol count: 10
   0 EURUSD
   1 XAUUSD
   2 BTCUSD
   3 GBPUSD
   4 USDJPY
   5 USDCHF
   6 AUDUSD
   7 USDCAD
   8 NZDUSD
   9 USDRUB
SymbolName(n,MarketWatchOnly)= / MARKET_UNKNOWN_SYMBOL(4301)