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

Пользовательские символы обладают теми же свойствами, что и символы, предоставленные брокером. Чтение их свойств выполняется стандартными функциями, рассмотренными в главе про финансовые инструменты.

Для установки свойств пользовательских символов предназначена группа CustomSymbolSet-функций, по одной функции для значений основополагающих типов (целочисленных, вещественных, строковых).

bool CustomSymbolSetInteger(const string name, ENUM_SYMBOL_INFO_INTEGER property, long value)

bool CustomSymbolSetDouble(const string name, ENUM_SYMBOL_INFO_DOUBLE property, double value)

bool CustomSymbolSetString(const string name, ENUM_SYMBOL_INFO_STRING property, string value)

Все функции устанавливают для пользовательского символа с именем name значение свойства property в значение value. Все существующие свойства сгруппированы в перечисления ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE, ENUM_SYMBOL_INFO_STRING, которые были поэлементно рассмотрены в разделах вышеупомянутой главы.

Функции возвращают признак успеха (true) или ошибки (false). Одна из вероятных проблем для ошибок заключается в том, что не все свойства разрешено менять. При попытке установить "read-only" свойство получим ошибку CUSTOM_SYMBOL_PROPERTY_WRONG (5307). Если пытаться записать в свойство недопустимое значение, получим ошибку CUSTOM_SYMBOL_PARAMETER_ERROR (5308).

Следует учесть, что минутная и тиковая история пользовательского символа полностью удаляется, если в спецификации символа изменить любое из следующих свойств:

  • SYMBOL_CHART_MODE — тип цены, который используется для построения баров (Bid или Last)
  • SYMBOL_DIGITS — количество знаков после запятой в значениях цены
  • SYMBOL_POINT — значение одного пункта
  • SYMBOL_TRADE_TICK_SIZE — значение одного тика, минимально допустимое изменение цены
  • SYMBOL_TRADE_TICK_VALUE — стоимость изменения цены в один тик (см. также SYMBOL_TRADE_TICK_VALUE_PROFIT, SYMBOL_TRADE_TICK_VALUE_LOSS)
  • SYMBOL_FORMULA — формула для расчета цены

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

Редактирование отдельных свойств наиболее востребовано для модификации созданных ранее по образцу пользовательских символов (после указания третьего параметра origin в функции CustomSymbolCreate).

В других случаях массовое изменение свойств может вызывать неочевидные эффекты. Дело в том, что свойства внутренне связаны между собой и изменение одного из них может требовать определенного состояния других свойств, чтобы операция завершилась успешно. Более того, установка одних свойств приводит к автоматическим изменениям других.

Наиболее простой пример: после установки свойства SYMBOL_DIGITS вы обнаружите, что изменилось также и свойство SYMBOL_POINT. Менее очевидный случай: присваивание SYMBOL_CURRENCY_MARGIN или SYMBOL_CURRENCY_PROFIT не имеет эффекта для символов Forex, так как система считает, что имена валют занимают, соответственно первые 3 и последующие 3 буквы в названии ("XXXYYY[suffix]"). Ирония здесь заключается в том, что непосредственно после создания "пустого" символа, он по умолчанию считается символом Forex, и потому для него нельзя задать эти свойства, не изменив предварительно рынок.

При копировании или установке свойств символа следует учитывать, что платформа подразумевает некоторые нюансы. В частности, свойство SYMBOL_TRADE_CALC_MODE имеет по умолчанию значение 0 (сразу после создания символа, но до установки какого-либо свойства), а 0 в перечислении ENUM_SYMBOL_CALC_MODE соответствует элементу SYMBOL_CALC_MODE_FOREX. Вместе с тем, для форексных символов подразумеваются особые правила именования в виде XXXYYY (где XXX и YYY — коды валют) плюс опциональный суффикс. Поэтому, если не изменить заранее SYMBOL_TRADE_CALC_MODE на другой требуемый режим, подстроки задаваемого названия символа (первая и вторая тройка символов) автоматически попадут в свойства базовой валюты (SYMBOL_CURRENCY_BASE) и валюты прибыли (SYMBOL_CURRENCY_PROFIT). Например, если задать имя "Dummy", оно разрежется на 2 псевдо-валюты "Dum" и "my".

Еще один нюанс заключается в том, что прежде чем устанавливать значение SYMBOL_POINT с точностью N знаков после запятой, нужно обеспечить SYMBOL_DIGITS не менее N.

К книге прилагается скрипт CustomSymbolProperties.mq5, который позволяет поэкспериментировать с созданием копий символа текущего графика и изучить на практике возникающие эффекты. В частности, можно выбрать название символа, его путь и направление обхода (установки) всех поддерживаемых свойств — прямое или обратное с точки зрения нумерации свойств в языке. В скрипте используется специальный класс CustomSymbolMonitor, являющийся оберткой вышеупомянутых встроенных функций: мы опишем его позднее.