Свойства пользовательских символов

Во введении в данную главу мы уже упоминали пользовательские символы — символы, для которых котировки создаются непосредственно в терминале по команде пользователя или программным способом.

В виде пользовательского символа легко сформировать, например, синтетический инструмент на основе формулы, включающей другие символы Обзора рынка — это доступно пользователю непосредственно в интерфейсе терминала.

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

Чтобы в алгоритмах можно было отличить стандартный символ от пользовательского, в MQL5 имеется свойство SYMBOL_CUSTOM — это логический признак того, что символ является пользовательским.

Если для символа задана формула, она доступна через строковое свойство SYMBOL_FORMULA. В формулах, как известно, можно использовать имена других символов, а также математические функции и операторы. Вот несколько примеров:

  • Синтетический символ: "@ESU19"/EURCAD
  • Календарный спред: "Si-9.13"-"Si-6.13"
  • Индекс евро: 34.38805726 * pow(EURUSD,0.3155) * pow(EURGBP,0.3056) * pow(EURJPY,0.1891) * pow(EURCHF,0.1113) * pow(EURSEK,0.0785)

Указание формулы удобно для пользователя, но, как правило, не используется из MQL-программ, поскольку они могут рассчитывать формулы непосредственно в коде, с нестандартными функциями и с большим контролем, в частности, на каждом тике, а не по таймеру 1 раз в 100мс.

Проверим работу со свойствами в скрипте SymbolFilterCustom.mq5: он выводит в журнал все пользовательские символы и их формулы (если есть).

input bool UseMarketWatch = false;
   
void OnStart()
{
   SymbolFilter f;                // объект фильтра
   string symbols[];              // массив для имен символов
   string formulae[];             // массив для формул
   
   // применяем фильтр и заполняем массивы
   f.let(SYMBOL_CUSTOMtrue)
   .select(UseMarketWatchSYMBOL_FORMULAsymbolsformulae);
   const int n = ArraySize(symbols);
   
   PrintFormat("===== %s custom symbols =====",
      (UseMarketWatch ? "Market Watch" : "All available"));
   PrintFormat("Total symbols: %d"n);
   
   for(int i = 0i < n; ++i)
   {
      Print(symbols[i], " "formulae[i]);
   }
}

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

===== All available custom symbols =====
Total symbols: 1
synthEURUSD SP500m/UK100