Тип и лицензия программы

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

Однако некоторые функции разрешено использовать только в программах определенных типов. Например, функцию OrderCalcMargin нельзя использовать в индикаторах. Хотя это ограничение не представляется фундаментально обоснованным, разработчик универсального алгоритма подсчета залоговых средств, который может быть встроен не только в эксперты, но и в индикаторы, должен учитывать этот нюанс и предоставлять для индикаторов альтернативный способ расчета.

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

Для определения типа программы существует свойство MQL_PROGRAM_TYPE в ENUM_MQL_INFO_INTEGER. Возможные значения свойства описаны в перечислении ENUM_PROGRAM_TYPE.

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

Значение

Описание

PROGRAM_SCRIPT

1

скрипт

PROGRAM_EXPERT

2

эксперт

PROGRAM_INDICATOR

4

индикатор

PROGRAM_SERVICE

5

сервис

Во фрагменте журнала, приведенном в предыдущем разделе, мы видели что свойство PROGRAM_SCRIPT равно 1, потому что наш тест является скриптом. Для получения строкового описания можно применить функцию EnumToString.

ENUM_PROGRAM_TYPE type = (ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE);
Print(EnumToString(type));

Другим свойством MQL-программы, которое удобно анализировать для включения/отключения тех или иных возможностей, является тип лицензии. Как известно, MQL-программы могут распространяться свободно или в рамках онлайн магазина MQL5 Маркет. Более того, программа в магазине может быть куплена или скачана в виде демо-версии. Эти факторы легко проверить и, по желанию, адаптировать алгоритмы под них. Для этих целей существует свойство MQL_LICENSE_TYPE в ENUM_MQL_INFO_INTEGER, использующее в качестве типа перечисление ENUM_LICENSE_TYPE.

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

Значение

Описание

LICENSE_FREE

0

бесплатная неограниченная версия

LICENSE_DEMO

1

демо-версия платного продукта из Маркета, работает только в тестере стратегий

LICENSE_FULL

2

купленная лицензионная версия, допускает не менее 5 активаций (может быть увеличено продавцом)

LICENSE_TIME

3

версия с ограничением по времени (пока не реализовано)

Здесь важно отметить, что лицензия относится к тому двоичному ex5-модулю, из которого делается запрос с помощью MQLInfoInteger(MQL_LICENSE_TYPE). Внутри библиотеки данная функцию вернет собственную лицензию библиотеки, а не основной программы, к которой подключена библиотека.

В качестве примера для проверки обеих функций раздела, к книге прилагается простой сервис EnvType.mq5. Он не содержит рабочего цикла и потому сразу же завершится после выполнения двух инструкций в OnStart.

#property service
   
void OnStart()
{
   Print(EnumToString((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)));
   Print(EnumToString((ENUM_LICENSE_TYPE)MQLInfoInteger(MQL_LICENSE_TYPE)));
}

Чтобы упростить его запуск, то есть исключить необходимость создавать экземпляр службы и запускать его через контекстное меню Навигатора в терминале, предлагается воспользоваться отладчиком: достаточно в MetaEditor открыть исходный код и выполнить команду Отладка -> Начать на реальных данных (F5, или кнопка в инструментальной панели).

Мы должны получить в журнале записи:

EnvType (debug)        PROGRAM_SERVICE
EnvType (debug)        LICENSE_FREE

Здесь наглядно видно, что тип программы — это сервис, а лицензия — фактически отсутствует (свободное пользование).