Описательные свойства символов

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

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

Описание

SYMBOL_BASIS

Имя базового актива для производного инструмента

SYMBOL_CATEGORY

Название категории, к которой принадлежит финансовый инструмент

SYMBOL_COUNTRY

Страна, к которой отнесен финансовый инструмент

SYMBOL_SECTOR_NAME

Сектор экономики, к которому относится финансовый инструмент

SYMBOL_INDUSTRY_NAME

Отрасль экономики или вид промышленности, к которой относится финансовый инструмент

SYMBOL_BANK

Источник текущей котировки

SYMBOL_DESCRIPTION

Строковое описание символа

SYMBOL_EXCHANGE

Название биржи или торговой площадки, на которой торгуется символ

SYMBOL_ISIN

Уникальный 12-разрядный буквенно-цифровой код в системе международных идентификационных кодов ценных бумаг — ISIN (International Securities Identification Number)

SYMBOL_PAGE

Адрес интернет страницы с информацией по символу

SYMBOL_PATH

Путь в дереве символов

Другой случай, когда программа может применить анализ этих свойств, возникает при поиске курса пересчета из одной валюты в другую. Мы уже знаем, как найти инструмент с необходимым сочетанием базовой и котировочной валюты, но сложность в том, что таких инструментов может найтись несколько. Тогда и может помочь чтение свойств вроде SYMBOL_SECTOR_NAME (нужно искать "Currency" или синоним — уточните в спецификации вашего брокера) или SYMBOL_PATH.

Путь SYMBOL_PATH содержит всю иерархию папок в каталоге символов, внутри которых содержится конкретный символ: имена папок разделены обратной косой чертой ('\\') по аналогии с файловой системой. Последний элемент пути — это непосредственно название символа.

Для некоторых строковых свойств имеются аналоги среди целочисленных свойств. В частности, вместо SYMBOL_SECTOR_NAME вы можете использовать свойство SYMBOL_SECTOR, которое возвращает элемент перечисления ENUM_SYMBOL_SECTOR со всеми поддерживаемыми секторами. По аналогии для SYMBOL_INDUSTRY_NAME имеется похожее свойство SYMBOL_INDUSTRY с типом перечисления ENUM_SYMBOL_INDUSTRY.

При необходимости MQL-программа может выяснить даже цвет фона, используемого при отображении символа в Обзоре рынка, — достаточно прочитать свойство SYMBOL_BACKGROUND_COLOR. Это позволит тем программам, которые создают на графике собственный интерфейс с помощью графических объектов (диалоговые окна, списки и пр.), сделать его унифицировано с родными элементами управления терминала.

Рассмотрим пример скрипта SymbolFilterDescription.mq5, который выводит для символов Обзора рынка 4 предопределенных текстовых свойства. Первое из них — SYMBOL_DESCRIPTION (не путать с названием самого символа), и именно по нему будет выполняться сортировка результирующего списка. Остальные три для ознакомления: SYMBOL_SECTOR_NAME, SYMBOL_COUNTRY, SYMBOL_PATH. Все значения заполняются специфическим образом у каждого брокера (могут быть разночтения для одного и того же тикера).

Кроме того, мы оставили за кадром, что в нашем классе SymbolFilter на самом деле реализована особая перегрузка метода equal для сравнения строк: она поддерживает поиск на вхождение подстроки с шаблоном, в котором символом подстановки '*' обозначается 0 или несколько произвольных символов. Например, "*ian*" найдет все символы, в которых встречается подстрока "ian" (в любом месте), а "*Index" — только строки, оканчивающиеся на "Index".

Такая возможность напоминает поиск по подстроке в самом диалоге Символы, доступном пользователям. Правда там не нужно указывать подстановочный символ, потому что всегда ищется подстрока. В алгоритме, с которым можно ознакомиться в исходных кодах (SymbolFilter.mqh), мы оставили возможность искать либо полное соответствие (символов '*' нет), либо подстроку (есть хотя бы одна звездочка).

Сравнение делается с учетом регистра. При необходимости легко адаптировать код для сравнения без различения строчных и прописных букв.

Учитывая новую возможность, определим входную переменную для искомой строки в описании символов. Если переменная пуста, будут выводиться все символы Обзора рынка.

input string SearchPattern = "";

Далее все привычно.

void OnStart()
{
   SymbolFilter f;                      // объект фильтра
   string symbols[];                    // массив имен
   string text[][4];                    // массив векторов с данными
   
   // свойств для чтения
   ENUM_SYMBOL_INFO_STRING fields[] =
   {
      SYMBOL_DESCRIPTION,
      SYMBOL_SECTOR_NAME,
      SYMBOL_COUNTRY,
      SYMBOL_PATH
   };
   
   if(SearchPattern != "")
   {
      f.let(SYMBOL_DESCRIPTIONSearchPattern);
   }
   
   // применяем фильтр и получаем отсортированные по описанию массивы
   f.select(truefieldssymbolstexttrue);
   
   const int n = ArraySize(symbols);
   PrintFormat("===== Text fields for symbols (%d) ====="n);
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i] + ":");
      ArrayPrint(text0NULLi10);
   }
}

Вот возможный вариант списка (с сокращениями).

===== Text fields for symbols (16) =====
AUDUSD:
"Australian Dollar vs US Dollar" "Currency"   ""   "Forex\AUDUSD"
EURUSD:
"Euro vs US Dollar" "Currency"   ""   "Forex\EURUSD"     
UK100:
"FTSE 100 Index" "Undefined"   ""   "Indexes\UK100" 
XAUUSD:
"Gold vs US Dollar" "Commodities"   ""   "Metals\XAUUSD"    
JAGG:
    "JPMorgan U.S. Aggregate Bond ETF"  "Financial"
    "USA"   "ETF\United States\NYSE\JPMorgan\JAGG"
NZDUSD:
"New Zealand Dollar vs US Dollar" "Currency"   ""   "Forex\NZDUSD"
GBPUSD:
"Pound Sterling vs US Dollar" "Currency"   ""   "Forex\GBPUSD"
SP500m:
"Standard & Poor's 500" "Undefined"   ""   "Indexes\SP500m"
FIHD:
    "UBS AG FI Enhanced Global High Yield ETN" "Financial"
    "USA"   "ETF\United States\NYSE\UBS\FIHD"         
...

Если введем строку поиска "*ian*" во входную переменную SearchPattern, получим следующий результат.

===== Text fields for symbols (3) =====
AUDUSD:
"Australian Dollar vs US Dollar" "Currency"   ""   "Forex\AUDUSD"
USDCAD:
"US Dollar vs Canadian Dollar" "Currency"   ""   "Forex\USDCAD"
USDRUB:
"US Dollar vs Russian Ruble" "Currency"   ""   "Forex\USDRUB"