Сила MetaTrader 5: от пошаговой отладки до защиты EX5 в одной среде
Введение
В мире алгоритмического трейдинга торговая идея — это лишь отправная точка. Реальная ценность продукта начинает создаваться не с момента написания первой строчки кода, а в процессе его многократной шлифовки, валидации и подготовки к «боевому» режиму.
Многие разработчики по инерции воспринимают MetaEditor как продвинутый текстовый редактор. Они годами используют ручные методы отладки: заполняют логи тысячами вызовов принтов, тратят часы на визуальное изучение текстовых файлов и гадают над причинами проскальзываний, ложных сигналов или зависаний циклов. Такой подход превращает разработку в бессистемный, хаотичный поиск, где тратится время — самый дефицитный ресурс. А стабильность кода остается под вопросом.
Для написания автоматической торговой системы важно иметь не только удобную среду разработки и мощный язык программирования, но и дополнительные инструменты для отладки и калибровки программы.
Система разработки и торговли MetaTrader 5 предлагает принципиально иной стандарт. Мощь платформы не только в выразительности языка MQL5, унаследованной от объектно-ориентированного С++, но и в скорости, с которой разработчик проходит свой цикл: «Поиск ошибок → Исправление → Ускорение работы кода → Защита конечной .ex5-программы».
Двигатель этого процесса MetaEditor — полнофункциональная интегрированная среда разработки (IDE), которая закрывает все этапы цикла разработки MQL5-приложения. В MetaEditor есть точные инструменты для каждого звена этой цепочки:
- Пошаговая отладка на реальных тиках;
- Аппаратное профилирование времени выполнения участков кода;
- Прямая интеграция с C++ DLL для ускорения важных с точки зрения времени выполнения расчетов;
- Облачная криптографическая защита бинарного кода.
Это не просто набор удобных функций, а выверенная последовательная система, которая сокращает время разработки и минимизирует риск потерпеть фиаско в реализации своих идей.
В этой статье разберем полный путь создания торгового робота — настройку проекта, отладку логики программы, выявление узких мест по производительности, вычленение математически тяжелых блоков в библиотеку DLL на C++ и финальная стадия — защита интеллектуальной собственности через MQL5 Cloud Protector.
Будем вести разработку своего индикатора на основе Bollinger Bands, который поставляется вместе с терминалом MetaTrader 5. Добавим в него отображение сигналов, интерактивные настройки и расчет результатов виртуальной торговли. Вы сможете на базе разработанного индикатора сделать свой — для проверки своих идей.

Рис.1: От идеи к профиту
Тестовый индикатор. Постановка задачи
Разработаем тестовый индикатор для отладки и профилирования. Индикатор должен работать по следующему алгоритму:
- Отображать стрелки сигналов Buy/Sell и точки для Stop/Take;
- Основа сигналов — стандартный индикатор Bollinger Bands (BB);
- Должно быть два режима сигналов — на отбой от верхней и нижней границ BB и на пробой границ.
На отбой:
- Если цена закрытия бара выше верхней границы BB, то сигнал Sell, Take на середину BB, Stop равен Take;
- Если цена закрытия бара ниже нижней границы BB, то сигнал Buy, Take на середину BB, Stop равен Take.
На пробой:
- Меняем Buy и Sell местами, меняем Take и Stop местами.
Сигнал на вход может быть только один, пока не сработал Take или Stop. Дальше цикл отслеживания сигналов и отображения стрелок начинается снова.
Если появляется противоположный сигнал на закрытии бара, то переворачиваться.
И несколько практических условий:
- Пропуск первых часов нового дня (количество пропускаемых часов нового дня задается);
- Не торговать в последний час перед закрытием;
- Закрывать в конце дня позиции (час окончания торгового дня задается).
Отображаем стрелки сигналов на графике:
- Buy — стрелка зеленая вверх;
- Sell — стрелка красная вниз;
- Stop — крестик желтый;
- Take — крестик синий.
Результат работы индикатора смотрим на рисунке ниже:

Рис. 2: Сигналы тестового индикатора
Полный код индикатора находится в файле BB_Signal_Indicator.mq5, приложенном к данной статье.
Настройка проекта. Фундамент разработки и отладки
Начнем с фундамента — как организовать проект. Предварительная конфигурация среды разработки экономит время работы еще до запуска первого теста.
Любой серьезный проект начинается не с написания первой строчки кода, а с создания правильной среды обитания для этого кода. MetaEditor, как полноценная IDE, предоставляет инструменты для автоматизации рутинных процессов, позволяя разработчику сосредоточиться на логике, а не на настройках графиков. Рассмотрим ключевые элементы, формирующие фундамент эффективной разработки.
Создание проекта: от одиночного файла к системе
Работа с одиночными .mq5-файлами допустима на этапе прототипирования, но для серьезной разработки необходим проект.
Проект — это отдельный файл с расширением .mproj, в котором хранятся настройки программы, параметры компиляции и информация обо всех используемых файлах. Для удобной работы с проектом предусмотрена отдельная вкладка в Навигаторе. В ней по категориям отображаются все используемые файлы: включаемые, ресурсные, заголовочные и т.д.
Как создать проект из исходного файла:
- В окне «Навигатор» выберите существующий MQ5-файл (в нашем случае BB_Signal_Indicator.mq5);
- В контекстном меню по клику правой кнопки мыши выберите пункт «Новый проект из исходного файла».
Автоматически создается файл с расширением .mqproj в том же каталоге:

Рис. 3: Создание проекта из исходного файла
Что дает проект:
- Централизованное управление всеми файлами программы;
- Автоматическое отслеживание зависимостей (#include, #resource);
- Отдельные настройки компиляции, не зависящие от исходного кода;
- Контроль версий и ведение журнала изменений.
Мастер позволяет создавать пустые проекты. Это удобно при нестандартных разработках с собственной структурой файлов, когда шаблоны по умолчанию не подходят. В этом случае создается только пустой файл настроек .mqproj. Файлы для исходного кода в последующем необходимо создать самостоятельно.
Примечания
- Если проект создается из существующего исходного файла, то название проекта берется из названия этого файла. Если создается новый проект, то предлагается задать название проекта в строке ввода.
- Дополнительно можно (и нужно) создать и задать директорию, где будут храниться все файлы и папки проекта.
Свойства проекта: централизованная конфигурация
Доступ к настройкам осуществляется через пункт контекстного меню проекта «Свойства». Это диалоговое окно заменяет ручное редактирование #property-директив в коде.

Рис. 4: Свойства проекта
Основные свойства:
- Тип программы — задает тип создаваемого при компиляции исполняемого модуля.
- Процессор — позволяет выбрать стандартный набор (X64 Regular) или один из расширенных наборов команд процессора, используемых при создании исполняемого модуля (компиляции).
- Копирайт — информация об авторских правах, аналогично свойству #property copyright в исходном коде.
- Ссылка — ссылка на сайт разработчика, аналогично свойству #property link в исходном коде.
- Версия — версия программы, аналогично свойству #property version в исходном коде.
- Иконка — иконка программы, аналогично свойству #property icon в исходном коде.
- Описание — описание программы, аналогично свойству #property description в исходном коде.
Свойства для задания оптимизации и производительности:
- Максимальная оптимизация — приложения с отключенной оптимизацией компилируются быстрее, но работают медленнее. Для отладки можно отключить, для релиза — желательно включить.
- Проверять вещественные делители — приложения с отключенной проверкой работают несколько быстрее, поскольку ошибки деления на ноль не проверяются при исполнении кода.
- Использовать кэш оптимизации (для советников) — при выполнении оптимизации тестер стратегий сохраняет все результаты выполненных проходов в кэш. Результаты сохраняются для каждого набора входных параметров. При повторной оптимизации на тех же параметрах это позволяет брать готовые результаты без затрат времени на повторные вычисления. Исключение — для математических вычислений, где могут потребоваться проводить расчеты независимо от наличия готовых результатов, отключите в проекте опцию «Использовать кэш оптимизации». При этом сами результаты тестирования все равно будут сохраняться в кэше, чтобы вы могли посмотреть все данные по выполненным проходам в отчете тестера стратегий.
Свойства для индикаторов:
- Рассчитывать на каждом тике в тестере — принудительно включает расчет индикаторов на каждом тике. Опция касается только работы в тестере стратегий, в платформе индикаторы всегда считаются на каждом поступившем тике.
Когда вы тестируете эксперт, использующий индикаторы, тестер стратегий рассчитывает значения индикаторов только при обращении к ним за данными — то есть только в тот момент, когда запрашиваются значения индикаторных буферов. Это дает существенное ускорение при тестировании и оптимизации, если эксперту не требуется получать значения индикатора на каждом тике. Если же расчет индикаторов на каждом тике необходим, включите для них данную опцию.
Индикаторы в тестере стратегий также принудительно считаются на каждом тике в следующих случаях:
- при тестировании в визуальном режиме;
- при наличии в индикаторе функций EventChartCustom(), OnChartEvent(), OnTimer();
- если индикатор создан компилятором с номером сборки (build) ниже 1916.
Примечание
Свойства в файле проекта имеют приоритет над свойствами, указанными в исходном коде. Если вы укажете свойства и в проекте и в исходном коде (даже отличающиеся), будут использованы свойства из проекта.
Управление файлами проекта в навигаторе

Автоматическое добавление:
- Файлы, подключаемые через директиву #include, автоматически появляются в разделе Dependencies навигатора;
- Заголовочные файлы добавляются в раздел Headers;
- Ресурсы (изображения, звуки и прочие), включенные через #resource, попадают в раздел Resources;
- MQ5-файлы с исходным кодом отображаются в разделе Sources.
Ручное добавление:
-
Через контекстное меню проекта «Добавить существующий файл» или «Добавить существующую папку». Команда «Добавить существующую папку» позволяет массово добавить в проект все поддерживаемые файлы из выбранного каталога.

Рис. 5: Ручное добавление
Примечание
При добавлении файла вручную он не включается каким-либо образом в код программы и не копируется в каталог проекта. Файл только привязывается к проекту для отображения в его навигаторе.
Удаление файлов — через контекстное меню проекта на выбранном файле «Удалить». При удалении файла из проекта система предлагает два варианта:
- «Убрать» — исключить файл из проекта, но файл останется на диске;
- «Удалить» — полностью удалить файл из проекта и с жесткого диска.
Будьте внимательны при удалении! Случайное удаление исходного файла может привести к потере кода.
Дополнительные разделы:
- «Settings and files» — сюда можно добавлять другие файлы, например, настройки для тестирования или шаблоны для графиков.
Используйте шаблон «debug.tpl»
Многие разработчики игнорируют файл с названием «debug.tpl», расположенный в директории «\profiles\templates» терминала. Это существенное упущение, снижающее производительность разработки и тестирования. Как это работает: при запуске отладки (клавиша F5) MetaEditor создает временный график в терминале MetaTrader 5. Если в папке шаблонов существует файл «debug.tpl», терминал автоматически применяет его настройки к этому графику.
Практическая ценность состоит в том, что вы можете заранее настроить в этом шаблоне все необходимые индикаторы, уровни, сетку и свойства графика. Например, если ваш робот торгует по Bollinger Bands, добавьте этот индикатор в шаблон. При каждом запуске отладки вы будете видеть график в настроенном виде и с индикатором, не тратя время на все настройки вручную.
Поскольку при отладке кода операция запуска по F5 повторяется множество раз, это заметно упрощает работу.
Предварительная конфигурация среды отладки
Настройки среды отладки находятся в меню MetaEditor: «Сервис» → «Настройки» → вкладка «Отладка/Профилирование». Задайте параметры «по умолчанию», которые будут использоваться при каждом запуске отладчика:

Рис. 6: Настройки среды отладки
Основные настройки отладки/профилирования:
- Символ — укажите нужный инструмент торговли, на котором предполагается использовать разработку (например, EURUSD) и период (таймфрейм) для вашей стратегии (например, H1 для среднесрочных систем).
- Дата — для отладки на истории можно сразу указать интересующий временной промежуток. На этом промежутке запускается визуальное тестирование в тестере стратегий.
- Включить оптимизацию при профилировании — для поиска «узких мест» отключите оптимизацию — так вы увидите, какие именно строки вашего кода потребляют наибольшее время. Однако итоговые цифры производительности будут отличаться от релизной версии: для финальных замеров включите оптимизацию обратно.
- Включить инлайнинг при профилировании — при инлайнинге код функций помещается непосредственно в место их вызова, что позволяет добиться существенного ускорения при работе программы. Однако это затрудняет профилирование функций. Чтобы получить отчет по «чистым» функциям, отключите инлайнинг.
- Использовать визуальный режим для отладки на истории — по умолчанию отладка осуществляется в не визуальном режиме тестера, однако вы можете вручную изменить это при помощи данной опции. Профилирование на исторических данных осуществляется в не визуальном режиме всегда.
Профилирование на исторических данных в визуальном режиме практически не имеет смысла, поскольку основные ресурсы тратятся на отрисовку, а не расчеты внутри MQL-программы. Для проверки графических функций (панелей, объектов и т.д.), как правило, достаточно режима реальных данных, где ваша программа просто запускается на обычном графике.
- Использовать указанные настройки — включить/отключить использование определенных настроек для отладки и профилирования программ. При запуске отладки или профилирования, программа будет запущена на графике c указанным символом и периодом. При отладке на истории указанные параметры используются для визуального тестирования. Если данная опция отключена, то все поля, расположенные ниже, недоступны для редактирования.
Если на вкладке «Отладка/Профилирование» не указаны символ и период графика, то по умолчанию будет использован первый по порядку символ в окне «Обзор рынка» и период H1.
Компиляция: Ошибки и Предупреждения
При нажатии клавиши F7 (выполняется команда «Компилировать исходный код в исполняемый .ex5-файл») вкладка «Инструменты/Ошибки» в окне MetaEditor может показать два типа сообщений:
- Errors (Ошибки) — не устранимые проблемы в коде, которые не позволяют создать .ex5-файл;
- Warnings (Предупреждения) — места в коде, которые потенциально могут вызвать проблемы при исполнении (например, использование не инициализированной переменной). Компилятор создает .ex5-файл, но выдает предупреждения.
Рекомендуется не игнорировать предупреждения. Наилучший подход при разработке в MetaEditor: считать код готовым к тестированию только при нулевом количестве Warnings (и нулевом количестве Errors, конечно). Настройка флагов компиляции в проекте позволяет сделать этот контроль строгим, превращая предупреждения в ошибки, что заставит разработчика устранить неоднозначности кода до его запуска.
Когда все файлы проекта написаны и находятся в своих папках, свойства отладки/профилирования настроены, шаблоны готовы, а компилятор выдает пустой лист без сообщений обошибок и предупреждений, можно приступать к самому важному этапу — поиску и устранению логических ошибок с помощью встроенного отладчика.
Пошаговая отладка: Рассмотрите свой код под микроскопом
На предыдущем этапе мы создали проект и заполнили его структуру разработанными файлами, но логика алгоритма все еще остается теоретической. Пошаговая отладка в MetaEditor это возможность заглянуть внутрь работающей программы, поставить её на паузу в любой момент времени и исследовать текущее состояние/значение переменных. Рассмотрим, как использовать встроенный отладчик для проверки логики MQL5-программы.
В MetaEditor есть два режима запуска программы для отладки — на реальных данных и на истории. Гибкость отладки заключается в его интеграции с торговым терминалом и тестером стратегий. Запуск в каждом из режимов решает свои задачи:
1. Отладка на реальных данных
Запускается при нажатии клавиши F5 на специальном графике в терминале, который получает тики от сервера брокера в реальном времени. Этот график открывается автоматически при старте отладки с настройками, заданными через файл-шаблон debug.tpl. Этот режим идеален для проверки реакции робота или индикатора на живые рыночные события, проверки работы с событиями интерфейса (OnChartEvent) или таймером (OnTimer).
Фактически, это запуск программы в работу. Вы видите, как код реагирует на приходящий тик прямо сейчас. Но, есть и небольшая «ложка дегтя»: скорость отладки ограничена скоростью поступления тиков.
При запуске эксперта в этом режиме, рядом с его названием в правом верхнем углу графика отображается дополнительно слово Debugging — это говорит о том, что данный график работает в режиме отладки.
2. Отладка на исторических данных
Запускается при нажатии комбинации клавиш Ctrl+F5 в тестере стратегий. Сохраненные тики последовательно подаются в эксперт или индикатор — прокручивается история за заданный интервал. Этот режим основной для проверки торговой логики. Позволяет прогнать алгоритм через годы истории за несколько минут и найти редкие торговые ситуации (например, поведение при гэпах или высокой волатильности).
В настройках MetaEditor можно включить визуальный режим, чтобы видеть график во время отладки — опция «Использовать визуальный режим для отладки на истории» на вкладке «Отладка/Профилирование».
Точки останова — остановись и подумай
Главный элемент отладки — точка останова (Breakpoint). Это метка на строке исходного кода, которая приказывает исполняющей среде MetaEditor/MetaTrader 5 приостановить выполнение программы при достижении этой (помеченной) строки. Переключается по двойному клику левой кнопки «мыши» по серому полю с номером строки или по нажатие клавиши F9 после установки курсора на нужную строку.

Зачем это нужно? Вместо того чтобы потом гадать, где и почему произошла ошибка, проверяйте заранее особо важные участки кода (например, блок расчета лота или проверку появления торгового сигнала). Отладчик останавливается перед выполнением помеченной строки и можно проверить входные переменные и промежуточные значения, прочитать содержимое строк и т.п. То есть, убедиться (или не убедиться), что все нужные переменные имеют правильные значения.
Навигация по коду — двигайся по шагам
Когда выполнение приостановлено, у разработчика есть полный контроль над своей программой. Единственное чего нельзя сделать, это править код «на лету» — все остальное можно. Используйте три команды для пошагового (построчного) выполнения кода программы:
- Шаг с заходом (Step Into — нажатие клавиши F11). Выполняется одна строка кода. Если на этой строке попадается вызов функции, то отладчик заходит внутрь этой функции и останавливается на её первой строчке. Далее можно двигаться пошагово по телу функции через клавиши F10 или F11.
- Шаг с обходом (Step Over — нажатие клавиши F10). Выполняется одна строка кода. Если на этой строке попадается вызов функции, то отладчик выполняет тело функции целиком без захода в нее и останавливается на следующей строке.
- Шаг наружу (Step Out — нажатие сочетания клавиш Shift+F11). Выполняется оставшаяся часть текущей функции и останавливается сразу после ее завершения в вызывающем коде.
Инструменты анализа кода — стек вызовов и наблюдение
Простой остановки недостаточно. Необходимо понимать текущее состояние программы. Для этого служит вкладка «Инструменты\Отладка».

Рис. 7: Инструменты анализа кода
Стек вызовов (окно Call Stack на рис.5) — это хронология выполнения программы. Стек показывает цепочку файлов и функций в них, которые привели к текущей точке останова. В верхней строке списка Call Stack отображается текущая выполняемая функция. На рис.5 это функция OnCalculate(). Внизу списка отображается точка входа. На рис.5 это также функция OnCalculate() — в данном случае, они совпадают. В первой колонке списка Call Stack отображается имя файла, где находится функция, а в последней колонке — номер строки в файле.
Двойной клик левой кнопки мыши по любой функции в стеке перебрасывает курсор в редакторе кода к строке, где эта функция была вызвана. Это незаменимый инструмент, когда надо понять сложную программу, где функции вызывают многократно друг друга.
Наблюдение (окно Watch на рис.5) — правая часть окна позволяет отслеживать значения переменных в реальном времени. Для добавления новой переменной для наблюдения выделите переменную в коде и нажмите комбинацию клавиш Shift+F9 (или выберите в контекстном меню пункт «Добавить наблюдение») — переменная добавится в список. После каждого шага (по F10 или по F11) наблюдаемые переменные обновляются — изменившиеся значения отображаются контрастным цветом.
Кроме значений и названий наблюдаемых переменных, в окне Watch отображается тип каждой переменной. Для массивов дополнительно пишется размерность и признак тайм-серии (Series), если он задан.
В окне Watch можно писать простые выражения вида «a+b» в список наблюдений и увидеть результат суммы без изменения кода. Раскрывающиеся списки позволяют просматривать содержимое структур и массивов.
Встроенный отладчик MetaEditor превращает поиск ошибок в осмысленный процесс. Вы контролируете время (период на истории или реальное), проникаете через пространство (стек вызовов) и наблюдаете материю (значения переменных). Это позволяет быстро находить и исправлять логические ошибки в программе.
Когда программа работает логически правильно, возникает другой вопрос: достаточно ли быстро? Если код корректен, но тормозит, чтобы понять в чем дело используйте следующий инструмент из арсенала MetaEditor — Профилировщик.
Поиск узких мест через профилировщик, или Как увеличить производительность программы
Проблема торможения программы в большинстве случаев связана с не оптимальностью написанного кода. Здесь на помощь приходит Профилировщик (Profiler) — инструмент, который позволяет измерить время выполнения каждой строки и функции кода.
Прежде чем заниматься измерением скорости участков программы, убедитесь, что оптимизации кода отключена. В настройках MetaEditor смотрите «Сервис/Настройки/вкладка Отладка/Профилирование». Почему это важно? Компилятор по умолчанию оптимизирует код: убирает лишние переменные, объединяет группы операций и делает функции встраиваемыми (инлайнинг).
Если включить профилирование для оптимизированного кода, результаты будут неоднозначны, так как реальная структура и последовательность выполнения программы будет отличаться от той, что вы видите в редакторе. Профилировщик должен работать с «честным» кодом.
Процесс профилирования на реальных данных
Для программ, работающих в режиме реального времени, критически важна скорость выполнения. Среда разработки MetaEditor позволяет удобно и быстро оценивать затраты времени на выполнение тех или иных участков программы. Для этого необходимо запустить профилирование кода и дать поработать программе некоторое время. Для профилировки индикатора будет достаточно нескольких минут.
Профилирование запускается командой меню MetaEditor: «Отладка/Начать профилирование на реальных данных» на специальном графике. Подходит для оценки реакции интерфейса или обработки входящих тиков.
Примечания
- После запуска дайте роботу поработать, чтобы были вызваны все критические функции: инициализация, расчет индикаторов, торговые операции. Если функция не была вызвана ни разу, то ее не будет в отчете.
-
Для получения наиболее точных данных рекомендуется не нажимать кнопку Stop — завершение отладки (сочетание клавиш Shift+F5), а удалить эксперт или индикатор с графика. Это гарантирует корректное завершение всех процессов и запись накопленной статистики.

Процесс профилирования на исторических данных
Профилирование на исторических данных запускается командой меню MetaEditor: «Отладка/Начать профилирование на исторических данных». В этом режиме процесс запускается в тестере стратегий. Это основной режим для поиска узких мест в программе, поскольку позволяет быстро прогнать программу на большом интервале времени.
Анализ результатов
После завершения профилирования результаты открываются во вкладке «Инструменты/Профилировщик». Здесь мы видим две основные метрики для каждой функции:
- Общая активность ЦП — показывает процент времени, которое функция проводила в стеке вызовов. Сюда входит время выполнения всей работы функции, включая время, потраченное на вызовы других функций.
- Собственная активность ЦП — показывает процент времени, потраченного исключительно на выполнение команд внутри самой функции, без учета вложенных вызовов.

Рис. 8: Результаты профилирования на реальных данных — функции по вызовам
Разбираемся с результатами профилирования
Обратимся к Рис. 6: зелеными стрелками отмечены три функции с наибольшей активностью. Это обработчики событий (у них иконки f→), которые используются в индикаторе. Это OnInit(), OnDeinit(), OnCalculate(). Первые две имеют «Общую активность» и «Собственную активность» близкими к нулю. Что не удивительно, поскольку они вызываются в начале работы программы и при её завершении и выполняют простые операции:
- OnInit() — задает параметры индикаторных буферов и создает хэндл стандартного индикатора Bollinger Bands;
- OnDeinit() — удаляет хэндл индикатора Bollinger Bands и стирает строку комментариев.
Третья функция OnCalculate() имеет «Общую активность» = 99.9%. Это тоже понятно: после успешного завершения функции OnInit(), индикатор находится почти все время в обработчике приходящих тиков и все процессорное время тратится на эту функцию.
Но, при высокой «Общей активности» OnCalculate() имеет низкую «Собственную активность = 0.23%. Это говорит о том, что сама функция быстрая, но она вызывает какую-то другую более медленную функцию. Если нужно оптимизировать, то не ее, а то, что она вызывает.
Для этого перейдем в режим отображения результатов профилирования «Функции по строкам»:

Рис. 9: Результаты профилирования на реальных данных — функции по строкам
Видим на Рис. 7, что наибольшую «Общую активность» имеет строка, где три раза вызывается функция копирования буферов стандартного индикатора: CopyBuffer(...). Эта функция системная, которая сама по себе быстрая, но вызывает внутренние функции ядра терминала. Их мы оптимизировать не можем, но можем уменьшить число пересылаемых данных (баров). Правда, не в нашем случае — здесь копируются только последние необработанные бары.
Таким образом, приходим к выводу, что наш простейший индикатор написан достаточно оптимально.
Экспорт данных
Для анализа результатов их можно экспортировать в форматы Open XML (Excel), HTML или CSV. Это полезно для сравнения производительности разных версий алгоритма или сохранения истории оптимизации проекта.
Но что делать, если вы нашли узкое место в программе, но оптимизировать его средствами MQL5 уже невозможно? Например, сложные статистические вычисления или криптографические расчеты занимают слишком много времени даже после оптимизации кода? В этом случае нужно выйти за пределы «песочницы» MetaEditor. Рассмотрим, как интегрировать мощь C++ прямо в MQL5-проект.
Интеграция с C++: когда MQL5 уступает место нативному коду
MQL5 позволяет выносить критически важные блоки в динамические библиотеки (DLL) на языке C++. Переходите там, где это надо, от интерпретируемого исполнения к «родному» машинному коду, получая прирост скорости. И здесь MetaEditor демонстрирует свою уникальность как среда разработки, стирая границы между языками.
Переход на C++ не должен быть самоцелью. Это компромисс между сложностью поддержки и скоростью выполнения. Используйте этот подход, если:
- Профилировщик показал, что функция потребляет несоразмерно много ресурсов CPU, и алгоритмически упростить ее нельзя.
- Вам необходимо использовать готовые решения (например, для машинного обучения или специфические математические пакеты), которые не имеют аналогов в MQL5.
Добавим в наш «подопытный» индикатор расчет и отображение результатов виртуальной торговли. Дату начала расчетов будем задавать во входных параметрах индикатора. Результат работы новой версии индикатора на рисунке ниже:

Рис. 10: Тестовый индикатор с расчетом статистики
Полный код индикатора находится в файле BB_Signal_Stat_Indicator_V2.mq5, приложенном к данной статье.
Прогоним индикатор через профилировщик:

Рис. 11: Профилирование индикатора с расчетом статистики на истории
У нас появилась функция расчета статистики CalculateVirtualStats(). Предположим, мы решили вынести ее в DLL — для будущего развития и усложнения расчетов в коммерческих версиях программы. В этом случае, для замены версии расчетной части статистики заменяется только DLL-библиотека без перекомпиляции всего проекта.
MetaEditor как редактор C++
Многие не знают, что MetaEditor — это не только редактор языка MQL. Он умеет работать с файлами исходных кодов на C++ (.cpp и .h) точно так же, как с файлами .mq5. Процесс создания библиотеки внутри MetaEditor:
- Создайте файл с расширением .cpp в папке вашего проекта (например, в разделе Libraries).
- Напишите код функции. Важно использовать соглашение вызова __stdcall или __cdecl, чтобы MQL5 мог корректно обращаться к библиотеке.
- Нажмите F7 (Компилировать). MetaEditor автоматически вызовет внешний компилятор и соберет .DLL файл. Для компиляции C++ кода MetaEditor использует установленный на вашем компьютере Microsoft Visual Studio (версии 2008 и выше, включая Express и Community).
Разрядность Visual Studio должна совпадать с разрядностью вашего MetaEditor, то есть у вас должна быть установлена 64-битная версия MS Visual Studio. MetaTrader 5 и Meta Editor поддерживают только 64-разрядные операционные системы Windows.
Для импорта функций из DLL в код на MQL5 используется следующая декларация:
//+------------------------------------------------------------------+ //| импорт функции из DLL | //+------------------------------------------------------------------+ #import "StatsCalculator.dll" void CalculateStatsDLL(const TradeRecord &p_history[],int p_trade_count,double initial_balance,VStatResult &res); #import
Здесь импортируется одна функция CalculateStatsDLL() — расчет статистики торговли по переданным виртуальным сделкам. Результаты расчета возвращаются через структуру VStatResult &res, она заполняется внутри DLL.
В коде индикатора нужно заменить функцию расчета статистики на следующий код:
//+------------------------------------------------------------------+ //| обертка для вызова функции из DLL | //+------------------------------------------------------------------+ void CalculateVirtualStats(const TradeRecord &p_history[],int p_trade_count,double initial_balance,VStatResult &res) { //--- проверка корректности количества сделок (сравнение массива с NULL в MQL5 запрещено) if(p_trade_count<=0) return; CalculateStatsDLL(p_history,p_trade_count,initial_balance,res); }
Здесь дополнительно проверяется, что массив со сделками не нулевой длины — дополнительная защита от ошибок. Полный код индикатора с работой через DLL находится в файле BB_Signal_Stat_Indicator_DLL.mq5, приложенном к данной статье.
Когда логика алгоритма отлажена, производительность оптимизирована, а нужные блоки вынесены в C++, наступает финальный этап — защита готового продукта. В коммерческом алготрейдинге исходный код стратегии является главным активом.
Защита итогового EX5: Облачный щит для интеллектуальной собственности
Несмотря на то, что исполняемый EX5-файл уже сам по себе надежно защищен от декомпиляции, коммерческое распространение требует дополнительных гарантий. Именно здесь должен использоваться сервис MQL5 Cloud Protector. Он предоставляет дополнительный, еще более высокий уровень защиты.
Как работает защита. Криптография без компромиссов
Многие разработчики с осторожностью относятся к облачным сервисам защиты, опасаясь утечки исходного кода. Сервис MQL5 Cloud Protector работает безопасно. Архитектура его создана так, чтобы полностью исключить эти риски:
- Локальная компиляция: Сначала программа компилируется в EX4/EX5-файл на компьютере пользователя. Дополнительная защита накладывается на уже скомпилированный файл — исходный код никуда не передается.
- Передача только бинарной части: исполняемая часть файла по защищенному соединению отправляется в онлайн-сервис, где она шифруется при помощи современных ассиметричных алгоритмов, а также подписывается уникальным приватным ключом.
- Нативная компиляция и шифрование: На стороне сервера применяется современное асимметричное шифрование. Код преобразуется в нативный машинный код — аналогичная защита используется в магазине торговых приложений MetaTrader Маркет. Единственное отличие от Маркета — итоговый файл не привязывается к конкретному компьютеру. Его можно запускать на любых компьютерах как обычные EX4/EX5-программы
Такая защита делает обратный инжиниринг и модификацию EX5-программы практически невозможной.
Интеграция защиты в исполняемый файл. Стандарт для коммерческой разработки
Чтобы получить исполняемый файл с дополнительной защитой, откройте проект или основной исходный файл MQL-программы и выполните команду меню «Сервис/MQL5 Cloud Protector». Запустится автоматический процесс компиляции и облачной обработки. Итоговый исполняемый файл будет создан в том же каталоге, что и проект/основной исходный файл MQ5:

Рис. 12: Интеграция зашиты в исполняемый файл
MQL5 Cloud Protector решает три основные задачи разработчика, связанные с распространением продукта:
- Невозможность декомпиляции;
- Гибкость распространения;
- Сохранение и рост производительности — в отличие от методов обфускации (запутывания кода), облачная нативная компиляция сохраняет или даже улучшает скорость работы за счет оптимизации на уровне машинных инструкций.
Защита финального исполняемого файла — это логическое завершение цикла, заявленного в начале статьи. С MQL5 Cloud Protector ваш продукт переходит из статуса прототипа в категорию защищенного коммерческого продукта, готового к масштабированию.
Заключение
В современном алготрейдинге, где конкуренция измеряется миллисекундами, а цена ошибки может стоить депозита, качество разработки определяется совершенством инструментов, которыми владеют программист и алготрейдер. Мы прошли весь путь создания MQL5-программы: от идеи до финальной криптографической защиты продукта.
Главный вывод, который следует этого пути, однозначен: MetaEditor — это аргумент в пользу выбора платформы MetaTrader 5 не меньший, чем сам язык MQL5. Язык программирования определяет границы того, что можно реализовать. Среда разработки определяет то, насколько быстро, надежно и качественно это будет сделано. MetaEditor придает процессу написания кода системность и дисциплину:
- Встроенный отладчик позволяет отказаться от эмпирического гадания на кофейной гуще логов в пользу точного анализа стека вызовов и состояний/значений переменных.
- Профилировщик дает объективные метрики эффективности, заменяя субъективные ощущения на точные цифры.
- Возможность интеграции с C++ через DLL снимает ограничения высокоуровневого языка для задач, требующих максимальной вычислительной мощности.
- MQL5 Cloud Protector снимает вопрос защиты интеллектуальной собственности, делая коммерческое распространение алгоритмов безопасным и легальным.
Разработчик, владеющий всеми этими инструментами, сокращает цикл от идеи до реализация до минимума, получая конкурентное преимущество. И этот цикл управляется через интерфейс MetaEditor.
Рекомендуемые материалы для изучения работы с MetaEditor и MetaTrader 5:
- Справка MetaEditor по Debug, Profiling, C++ DLL и Cloud Protector.
- Статья: Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Список файлов, приложенных к статье:
| Название файла | Описание |
|---|---|
| BB_Signal_Ind.mq5 | Код тестового индикатора, отображающего на графике сигналы в виде стрелок |
| BB_Signal_Stat_Indicator_V1.mq5 | Код тестового индикатора, отображающего на графике сигналы в виде стрелок и статистику виртуальной торговли |
| BB_Signal_Stat_Indicator_V2.mq5 | Код тестового индикатора, отображающего на графике сигналы в виде стрелок, статистику виртуальной торговли и кривую баланса |
| BB_Signal_Stat_Indicator_DLL.mq5 | Код тестового индикатора, отображающего на графике сигналы в виде стрелок, статистику виртуальной торговли, кривую баланса и использующий DLL-библиотеку |
| StatsCalculator.zip | Код для создания DLL-библиотеки расчета статистики виртуальной торговли в Visual Studio 2019 |
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Автоматизация торговых стратегий в MQL5 (Часть 27): Выявление и визуализация гармонического паттерна "Краб" на основе Price Action
Нейросети в трейдинге: Внимание, память и рыночные паттерны в GDformer (Global Dictionary)
Кодекс рыночных состояний в MQL5 (Часть 2): Побитовое обучение и мультипаттерны на примере Nvidia
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования

