Отладка и профилирование

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

Напомним, что в редакторе MetaEditor есть 2 команды в меню Отладка:

  • Начать/Продолжить на реальных данных (F5);
  • Начать/Продолжить на исторических данных (Ctrl-F5).

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

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

Вы можете заранее поставить точки остановки (F9) на операторах, в районе которых предположительно что-то начинает работать не так. Тестер приостановит процесс по достижении указанного места в исходном коде.

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

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

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

  • Начать профилирование на реальных данных;
  • Начать профилирование на исторических данных;

Для профилирования программа также предварительно перекомпилируется с особыми установками, поэтому не забывайте после завершения отладки или профилирования вновь откомпилировать программу в обычном режиме (особенно если её планируется отправить клиенту или загрузить в MQL5 Маркет).

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

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

На стадии компиляции отладочную и рабочую версию программы можно формировать по-разному за счет макроопределений препроцессора _DEBUG и _RELEASE.

На стадии выполнения программы её режимы можно отличить с помощью опций функции MQLInfoInteger.

В следующей таблице сведены все доступные сочетания, влияющие на особенности среды исполнения.

Среда исполнения \ флаги

MQL_DEBUG

MQL_PROFILER

Штатный(release)

Онлайн

+

+

+

Тестер
(MQL_TESTER)

+

+

+

Тестер
(MQL_TESTER+MQL_VISUAL_MODE)

+

-

+

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

Отладка не допускается в процессе оптимизации, включая и специальные обработчики OnTesterInit, OnTesterDeinit, OnTesterPass. При необходимости, для проверки их работоспособности предусмотрите вызов их кода по другим условиям.