
Понимание и эффективное использование тестера стратегий MQL5
Введение
Нам, как MQL5-программистам, необходимо хорошо понимать и использовать тестер стратегий, чтобы получать эффективные результаты. Используя этот ценный инструмент, мы можем получить важную информацию о производительности наших MQL5-программ, что повлияет на улучшение результатов торговли. Нам необходимо хорошо понимать ряд важных тем, прежде чем приступать к тестированию, например, работу со всеми типами ошибок. Еще одна тема, которую нам также необходимо хорошо понять, — это отладка, которая позволяет нам выполнять созданные программы в интерактивном режиме. Наконец самый важному и ценный инструмент — это тестер стратегий, позволяющий тестировать и оценивать созданные нами программы с наиболее интересными функциями, чем MetaTrader 4. Статья посвящена наиболее важным аспектам использования тестера стратегий MQL5. Мы рассмотрим следующие темы:
Предполагается, что вы уже знаете язык программирования MQL5 и умеете создавать программы. Это необходимые условия для понимания статьи. Всё необходимое для освоения языка можно найти в Документации. Также вы можете прочитать другие мои статьи об изучении основ программирования на MQL5 и о создании торговых систем на основе самых популярных технических индикаторов. Надеюсь, что они окажутся вам полезными.
Ошибки
Для начала поговорим об ошибках, которые можно обнаружить при создании, выполнении и запуске MQL5-программ. MQL5 сообщает нам об ошибках, но если мы не знаем, что они означают или где возникают, нам потребуется гораздо больше времени для их устранения.
При написании кода могут возникать ошибки и предупреждения компиляции. Мы также можем столкнуться с ошибками при выполнении программы MQL5, которые являются ошибками выполнения. Мы можем столкнуться и с другими типами ошибок, когда наша программа MQL5 пытается торговать. Это ошибки торгового сервера. Итак, мы рассмотрим следующие виды ошибок:
- Ошибки и предупреждения компиляции
- Ошибки выполнения
- Ошибки торгового сервера
Прежде чем писать об этих ошибках, важно знать, где они появляются. В MQL5 IDE в нижней части есть окно панели инструментов. Если его нет по умолчанию, его можно просмотреть одним из следующих способов:
1- Вид ==> Инструменты
2- Комбинация клавиш Ctrl+T
3- Иконка "Инструменты" на основной панели инструменты
Само окно выглядит так:
Ошибки и предупреждения компиляции:
При написании кода мы неизбежно допускаем ошибки в синтаксисе или опечатки, что в свою очередь приводит к ошибкам при компиляции. В этой части мы приведем наиболее популярные и часто встречающиеся ошибки такого типа. Программа не может быть скомпилирована до тех пор, пока ошибки не будут устранены. Наиболее частые ошибки такого типа:
Пропущенная точка с запятой (semicolon expected error):
Не поставлена точка с запятой в конце строки. Иногда также отсутствует левая скобка. Пример ошибки приведен ниже.
Ошибочный код:
int a=(2+1)
Само сообщение об ошибке выглядит так:
Правильный код:
int a=(2+1);
После исправления ошибки и компиляции окно выглядит так:
Лишний токен (unexpected token error):
Причина ошибки - отсутствие правой скобки в последней строке кода или лишняя левая скобка в текущей строке кода. Пример показан ниже:
Ошибочный код:
int a=(2+1;
Сообщение об ошибке:
Правильный код:
int a=(2+1);
Вкладка "Ошибки" после исправления и компиляции:
Необъявленный идентификатор (undeclared identifier error):
Ошибка такого типа возникает, когда мы используем переменную без ее предварительного объявления, поскольку мы должны объявить любую новую переменную перед ее использованием или присвоением ей какого-либо значения. Нам необходимо выбрать правильный и подходящий тип данных, который нам нужно вернуть в эту переменную, например, целое число или строку. Ниже приведен пример ошибки такого типа, возникающей при использовании новой переменной без ее объявления.
Ошибочный код:
a=5;
В предыдущем коде мы использовали переменную (a), присвоив ей значение 5, без ее объявления. Сообщение об ошибке выглядит так:
Как видите, в сообщении указана не только сама ошибка, но и переменная 'a', послужившая ее причиной.
Правильный код:
int a=5;
Ошибки в скобках (unbalanced left parenthesis error):
Ошибка возникает, если мы где-то забыли скобку или поставили лишнюю. Пример приведен ниже.
Ошибочный код:
bool a=7; if (a=5 a=5;
Отсутствие скобки привело сразу к двум ошибкам - unbalanced left parenthesis и some operator expected
Правильный код:
bool a=7; if (a=5) a=5;После исправления ошибки код компилируется нормально.
Неожиданное завершение программы (unexpected end of program error):
Иногда пропущенная закрывающая скобка приводит к неожиданному завершению программы. Пример приведен ниже.
Ошибочный код:
void OnStart() { bool a=7; if (a=5) a=5;
Пропущенная закрывающая скобка привела к двум ошибкам - unexpected end of program и unbalanced parentheses
Правильный код:
void OnStart() { bool a=7; if (a=5) a=5; }
После исправления ошибки код компилируется нормально.
Выражения на глобальном уровне не разрешены (expressions are not allowed on a global scope error):
Ошибка возникает, когда мы пропускаем левую скобку в составном операторе или указываем оператор или выражение вне области действия определенной функции, поскольку нам необходимо использовать выражения только в пределах области действия функции. Пример приведен ниже.
Ошибочный код:
int a=(7+5); if (a<7) a=7; }
Мы пропустили открытие (}), что изменило область и привело к ошибке Expressions are not allowed on a global scope. Так выглядит сообщение об ошибке на вкладке "Ошибки".
Правильный код:
int a=(7+5); if (a<7) { a=7; }
После исправления ошибки код компилируется нормально.
Ошибка подсчета параметров (wrong parameters count error):
Ошибка возникает, если мы используем предопределенную или пользовательскую функцию с определенными параметрами и не указываем эти параметры должным образом, указывая слишком много или слишком мало параметров. Пример ошибки приведен ниже.
Код с ошибкой:
Если мы создали функцию myVal для возврата целочисленного значения результата суммирования двух целочисленных значений, означает ли это что у нас есть два параметра в этой функции? Когда мы вызываем эту функцию, используя параметры, отличные от этих двух параметров, мы получим такой же тип ошибки, как и в следующем коде
void OnStart() { int example=myVal(10); } //+------------------------------------------------------------------+ int myVal(int a, int b) { return a+b; }
Скомпилировав код, получим ошибку:
Правильный код:
Нам нужно использовать указанные параметры созданной функции, как показано ниже.
void OnStart() { int example=myVal(10,20); } //+------------------------------------------------------------------+ int myVal(int a, int b) { return a+b; }
После исправления ошибки код компилируется нормально.
Пропущен оператор (some operator expected error):
Пропущен или ошибочно помещен оператор. Пример приведен ниже.
Код с ошибкой:
int a= 7 10;
В коде пропущен оператор между двумя числами, что и приводит к ошибке:
Правильный код:
int a= 7+10;
После исправления ошибки код компилируется нормально.
Это наиболее распространенные ошибки компиляции. Однако кроме ошибок, есть еще предупреждения. Они отображаются в информационных целях. Ниже приведен код, который вызовет предупреждение на вкладке "Ошибки"
int a;
Мы получим предупреждение о том, что переменная 'a' не используется, поскольку мы объявили новую переменную 'a', но мы не используем ее и не присваиваем ей значение.
Ниже приведены ссылки на соответствующие разделы коммуникации:
Несколько советов, которые могут оказаться очень для устранения этих ошибок в случае их возникновения:
- Начинайте исправлять их с начала, так как это может устранить все последующие ошибки.
- Двойной щелчок по строке ошибки на вкладке "Ошибки" панели инструментов сразу переведет вас на строку кода, в которой возникла проблема.
Мы рассмотрели ошибки, которые можно получить на первом этапе при написании кода программы MQL5. Теперь обратимся к ошибкам, которые могут возникнуть во время выполнения.
Ошибки выполнения:
Как уже упоминалось, ошибки выполнения — это ошибки, которые возникают во время выполнения MQL5-программы. Эти ошибки не помешают компиляции кода без ошибок, но он не будет выполняться так, как нам нужно. Мы можем найти эти ошибки в журнале в виде сообщений с указанием причины ошибки, а также строки, содержащей ошибку в исходном коде.
Примеры таких ошибок:
Код ошибки | Причина ошибки |
---|---|
4007 | Недостаточно памяти для перераспределения массива либо попытка изменения размера статического массива |
4101 | Ошибочный идентификатор графика |
4301 | Неизвестный символ |
4754 | Ордер на найден |
5120 | Внутренняя ошибка базы данных |
Вы можете просмотреть эти коды с помощью функции GetLastError(), добавляя метод обработки ошибок в вашу программу. Также вы можете увидеть эти ошибки, просматривая вкладку "Журнал" во время тестирования или вкладку "Эксперты" во время выполнения программы на графике. Все ошибки выполнения с кодами представлены в документации по MQL5 здесь:
https://www.mql5.com/ru/docs/constants/errorswarnings/errorcodes
Программа не завершает свою работу при ошибке выполнения, за исключением нескольких критических ошибок, например, при выходе за пределы массива (array out-of-range).
Ошибки торгового сервера:
Этот тип ошибок возникает на этапе исполнения сделки в структуре торгового запроса MqlTradeRequest при использовании функции OrderSend(). Такие ошибки можно увидеть на вкладке "Журналы" при тестировании или на вкладке "Эксперты" при выполнении программы на графике. Примеры ошибок:
Код ошибки | Причина ошибки |
---|---|
10006 | Запрос отклонен |
10032 | Операция разрешена только для реальных счетов |
10033 | Достигнут лимит на количество отложенных ордеров |
10034 | Достигнут лимит на объем ордеров и позиций для данного символа |
10041 | Запрос на активацию отложенного ордера отклонен, а сам ордер отменен |
Все коды можно посмотреть в документации по MQL5 здесь:
https://www.mql5.com/ru/docs/constants/errorswarnings/enum_trade_return_codes
Отладка
Отладчик MQL5 можно использовать для выполнения созданной программы на исторических или текущих данных. Ниже показаны кнопки отладчика в панели инструментов MetaEditor
1- Начало/продолжение отладки на исторических данных
2- Начало/продолжение отладки на реальных данных
3- Приостановка выполнения программы
4- Завершение отладки
При запуске отладки на исторических данных сразу же начнется тестирование программы на истории. При отладке на текущих данных программа запускается на текущем графике.
Тестер стратегий
Тестер стратегий - самый важный и ценный инструмент MetaTrader 5. Он лучше своего предшественника в MetaTrader 4 и помимо прочего располагает мультивалютным тестированием. Открыть его можно одним из указанных способов:
1- Комбинация Ctrl+R при открытом MetaTrader 5.
2- Вид ==> Тестер стратегий.
Тип тестирования можно выбрать на вкладке "Обзор"
Там же мы можем выбрать, что нам нужно протестировать. Как только мы это сделаем, откроется вкладка "Настройки" с предопределенными настройками на основе того, что мы выбрали для тестирования.
- Одиночный - тестирование советников без визуализации.
- Индикатор - тестирование индикатора.
- Визуализация - тестирование в режиме визуализации. Позволяет увидеть, как программа реагирует на данные в соответствии со своими инструкциями.
- Стресс-тест с задержками - тестирование с задержками.
- Варианты оптимизации (полная, генетическая, форвард-оптимизация).
- Сканер рынка - тестирование сканирования рынка.
- Расчет математики - проверка математических расчетов.
Предыдущие результаты - росмотреть предыдущие результаты тестирования. Вы также можете выполнить поиск конкретного предыдущего теста через строку поиска под опциями тестирования.
На вкладке "Настройки" мы увидим следующее:
- 1. Советник - выбрать файл программы, которую нужно протестировать.
- 2. IDE - открыть исходный код выбранной программы.
- 3. Сохранить/загрузить определенные настройки.
- 4. Символ - выбрать символ для тестирования.
- 5. Выбрать таймфрейм для тестирования.
- 6. Характеристики выбранного символа.
- 7. Интервал - выбрать период тестирования.
- 8. Выбрать стартовый период тестирования.
- 9. Выбрать конечный период тестирования.
- 10. Форвард - выбрать необходимую долю периода оптимизации, которая будет выделена для форвардного тестирования.
- 11. Выбрать начальную дату форварда.
- 12. Задержки и 13. Приблизиться к реальным данным и реальному исполнению.
- 13. Приблизиться к реальным данным и реальному исполнению.
- 13/2. Моделирование - выбрать модель тестирования (на каждом тике и т.д.).
- 14. Включите опцию для отображения прибыли в пипсах.
- 15. Начальный депозит.
- 16. Выбрать валюту депозита.
- 17. Плечо.
- 18. Оптимизация - использовать оптимизацию (поговорим о ней подробнее позже).
- 19. Включите опцию, если вам необходимо визуализировать сделки или исполнение во время тестирования.
На вкладке "Параметры" можно проверить, есть ли в тестируемой программе редактируемые входные данные.
При клике на кнопке "Старт" происходит тестирование программы. При включенной визуализации мы увидим график с вкладками. "Торговля" отображает совершённые сделки, если они были. На вкладке "История" отображаются закрытые или отмененные ордера. "Операции" показывают все операции. В "Журнале" выводятся сообщения программы и другая служебная информация. Работу программы также можно отслеживать на вкладке "График" в тестере стратегий.
После завершения тестирования вся необходимая статистика отображается на вкладке "Бэктест"
В зависимости от тестируемой программы, данные на вкладке "Бэктест" будут выглядеть так же или отличаться от тех, что вы видите в предыдущем примере.
Функция оптимизации включает в себя широкий диапазон различных параметров и входных данных, а также проверку входных данных и всех возможных комбинаций этих входных данных, чтобы выбрать наилучшие результаты. Модель оптимизации можно выбрать на вкладке настроек
Наиболее важные элементы, которые нам необходимо проверить после тестирования:
- Чистая прибыль - рассчитывается путем вычитания валового убытка из валовой прибыли.
- Просадка - максимальный убыток на счете во время работы.
- Прибыльность - отношение валовой прибыли к валовому убытку.
- Матожидание выигрыша - средняя прибыль или убыток сделки.
- Фактор восстановления - определяет, насколько хорошо протестированная стратегия восстанавливается после потерь.
Заключение
Мы рассмотрели тестер стратегий, являющийся одним из самых важных и ценных инструментов, который нам всем необходимо освоить при разработке любой программы MQL5. Также мы рассмотрели некоторые смежные темы, которые помогут понимать и эффективно использовать этот инструмент. Мы узнали о типах ошибок, с которыми можем столкнуться при разработке MQL5-программ:
- Ошибки и предупреждения компиляции.
- Ошибки выполнения.
- Ошибки торгового сервера.
Также мы рассмотрели процесс отладки во встроенном отладчике и подробно прошлись по основным возможностям тестера стратегий, включая его режимы работы и отчеты о тестировании.
Я надеюсь, что эта статья поможет вам создавать и эффективно тестировать качественные MQL5-программы. Возможно, вас заинтересуют другие мои статьи, например, о создании торговых систем на основе самых популярных технических индикаторов.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/12635





- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования