Режимы работы терминала и программы

Среда MetaTrader 5 обеспечивает решение различных задач на стыке трейдинга и программирования, что обуславливает необходимость нескольких режимов работы как самого терминала, так и конкретной программы.

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

Всё это описывается несколькими флагами, каждый из которых содержит значение логического типа: true или false.

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

Описание

MQL_DEBUG

программа работает в режиме отладки

MQL_PROFILER

программа работает в режиме профилирования кода

MQL_TESTER

программа работает в тестере

MQL_FORWARD

программа выполняется в процессе форвардного тестирования

MQL_OPTIMIZATION

программа выполняется в процессе оптимизации

MQL_VISUAL_MODE

программа выполняется в режиме визуального тестирования

MQL_FRAME_MODE

эксперт выполняется на графике в режиме сбора фреймов результатов оптимизации

TERMINAL_VPS

терминал работает на виртуальном сервере MetaTrader Virtual Hosting (MetaTrader VPS)

Флаги MQL_FORWARD, MQL_OPTIMIZATION, MQL_VISUAL_MODE подразумевают наличие взведенного флага MQL_TESTER.

Некоторые попарные сочетания флагов являются взаимоисключающими, то есть такие флаги не могут быть включены одновременно.

В частности, наличие MQL_FRAME_MODE исключает MQL_TESTER, и наоборот. MQL_OPTIMIZATION исключает MQL_VISUAL_MODE, а MQL_PROFILER исключает MQL_DEBUG.

Все флаги, относящиеся к тестированию (MQL_TESTER, MQL_VISUAL_MODE), мы изучим в разделах, посвященных экспертам и, отчасти, индикаторам. Все, что касается оптимизации экспертов (MQL_OPTIMIZATION, MQL_FORWARD, MQL_FRAME_MODE), будет освещено в отдельном разделе.

Сейчас познакомимся с принципами чтения флагов на примере режимов отладки (MQL_DEBUG) и профилирования (MQL_PROFILER). Заодно вспомним, как данные режимы активируются из редактора MetaEditor (подробности смотрите в документации, а разделах Отладка и Профилирование).

Для этой цели подготовлен скрипт EnvMode.mq5.

void OnStart()
{
   PRTF(MQLInfoInteger(MQL_TESTER));
   PRTF(MQLInfoInteger(MQL_DEBUG));
   PRTF(MQLInfoInteger(MQL_PROFILER));
   PRTF(MQLInfoInteger(MQL_VISUAL_MODE));
   PRTF(MQLInfoInteger(MQL_OPTIMIZATION));
   PRTF(MQLInfoInteger(MQL_FORWARD));
   PRTF(MQLInfoInteger(MQL_FRAME_MODE));
}

Прежде чем запускать программу, следует проверить настройки для отладки/профилирования. Для этого выполните в MetaEditor команду Сервис -> Настройки и посмотрите значения полей на закладке Отладка/Профилирование. Если включена опция Использовать указанные настройки, то именно значения нижележащих полей будут влиять на то, на графике какого финансового инструмента и с каким таймфреймом будет запускаться программа. Если опция отключена, будет использован первый финансовый инструмент в Обзоре рынка и таймфрейм H1.

На данном этапе выбор опции не принципиален.

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

В журнале MetaTrader 5 (закладка Эксперты) мы должны увидеть следующее:

MQLInfoInteger(MQL_TESTER)=0 / ok
MQLInfoInteger(MQL_DEBUG)=1 / ok
MQLInfoInteger(MQL_PROFILER)=0 / ok
MQLInfoInteger(MQL_VISUAL_MODE)=0 / ok
MQLInfoInteger(MQL_OPTIMIZATION)=0 / ok
MQLInfoInteger(MQL_FORWARD)=0 / ok
MQLInfoInteger(MQL_FRAME_MODE)=0 / ok

Флаги всех режимов сброшены, за исключением MQL_DEBUG.

Теперь запустим тот же скрипт из Навигатора в MetaTrader 5 (достаточно перетащить его мышью на любой график). Мы получим почти идентичный набор флагов, но MQL_DEBUG на этот раз будет равен 0 (потому что программа выполнялась штатным образом, а не под отладчиком).

Обратите внимание, что запуск программы с отладкой предваряется её перекомпиляцией в особом режиме, когда в выполняемый файл добавляется служебная информация, позволяющая проводить отладку. Такой бинарный файл больше по размеру и работает медленнее обычного. Поэтому после завершения отладки, перед использованием в реальной торговле, передачей заказчику или загрузкой в Маркет, программу следует перекомпилировать командой Файл -> Компилировать (F7).
 
Метод компиляции не влияет напрямую на свойство MQL_DEBUG. Отладочная версия программы, как мы видим, может быть запущена в терминале без отладчика, и MQL_DEBUG в этом случае будет сброшен. Определить способ компиляции позволяют два встроенных макроса: _DEBUG и _RELEASE (см. раздел Предопределенные константы). Они являются константами, а не функциями, потому что данное свойство "зашивается" в программу на стадии компиляции и затем не может измениться (в отличие от среды исполнения).

Теперь выполним в MetaEditor команду Отладка -> Начать профилирование на реальных данных. Особого смысла профилировать столь простой скрипт, разумеется, нет, но наша задача сейчас — убедиться в том, что в свойствах среды включится соответствующий флаг. И действительно, против MQL_PROFILER теперь стоит единица.

MQLInfoInteger(MQL_TESTER)=0 / ok
MQLInfoInteger(MQL_DEBUG)=0 / ok
MQLInfoInteger(MQL_PROFILER)=1 / ok
...

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

В принципе отладка и профилирование могут выполняться как онлайн, так и в тестере (MQL_TESTER) на исторических данных, однако тестер поддерживает лишь эксперты и индикаторы. Поэтому на примере скрипта невозможно увидеть взведенный флаг MQL_TESTER или MQL_VISUAL_MODE.

Как известно, MetaTrader 5 позволяет тестировать торговые программы в быстром режиме (без графика) и в визуальном режиме (на отдельном графике). Именно во втором случае и будет включено свойства MQL_VISUAL_MODE. Его имеет смысл проверять, в частности, для отключения манипуляций с графическими объектами в отсутствии визуализации.

Для отладки на истории в визуальном режиме необходимо предварительно включить опцию Использовать визуальный режим для отладки на истории в диалоге настроек MetaEditor. Аналитические программы (индикаторы) тестируются всегда в визуальном режиме.

Имейте в виду, что отладка онлайн небезопасна для торгующих экспертов.