English 中文 Español Deutsch 日本語 Português
preview
Понимание и эффективное использование тестера стратегий MQL5

Понимание и эффективное использование тестера стратегий MQL5

MetaTrader 5Тестер | 14 сентября 2023, 10:34
1 253 1
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Введение

Нам, как MQL5-программистам, необходимо хорошо понимать и использовать тестер стратегий, чтобы получать эффективные результаты. Используя этот ценный инструмент, мы можем получить важную информацию о производительности наших MQL5-программ, что повлияет на улучшение результатов торговли. Нам необходимо хорошо понимать ряд важных тем, прежде чем приступать к тестированию, например, работу со всеми типами ошибок. Еще одна тема, которую нам также необходимо хорошо понять, — это отладка, которая позволяет нам выполнять созданные программы в интерактивном режиме. Наконец самый важному и ценный инструмент — это тестер стратегий, позволяющий тестировать и оценивать созданные нами программы с наиболее интересными функциями, чем MetaTrader 4. Статья посвящена наиболее важным аспектам использования тестера стратегий MQL5. Мы рассмотрим следующие темы:

Предполагается, что вы уже знаете язык программирования MQL5 и умеете создавать программы. Это необходимые условия для понимания статьи. Всё необходимое для освоения языка можно найти в Документации. Также вы можете прочитать другие мои статьи об изучении основ программирования на MQL5 и о создании торговых систем на основе самых популярных технических индикаторов. Надеюсь, что они окажутся вам полезными.

Ошибки

Для начала поговорим об ошибках, которые можно обнаружить при создании, выполнении и запуске MQL5-программ. MQL5 сообщает нам об ошибках, но если мы не знаем, что они означают или где возникают, нам потребуется гораздо больше времени для их устранения.

При написании кода могут возникать ошибки и предупреждения компиляции. Мы также можем столкнуться с ошибками при выполнении программы MQL5, которые являются ошибками выполнения. Мы можем столкнуться и с другими типами ошибок, когда наша программа MQL5 пытается торговать. Это ошибки торгового сервера. Итак, мы рассмотрим следующие виды ошибок:

  • Ошибки и предупреждения компиляции
  • Ошибки выполнения
  • Ошибки торгового сервера

Прежде чем писать об этих ошибках, важно знать, где они появляются. В MQL5 IDE в нижней части есть окно панели инструментов. Если его нет по умолчанию, его можно просмотреть одним из следующих способов:

1- Вид ==> Инструменты

Инструменты

2- Комбинация клавиш Ctrl+T

3- Иконка "Инструменты" на основной панели инструменты

Инструменты 2

Само окно выглядит так:

Инструменты 3

Ошибки и предупреждения компиляции:

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

Пропущенная точка с запятой (semicolon expected error):

Не поставлена точка с запятой в конце строки. Иногда также отсутствует левая скобка. Пример ошибки приведен ниже.

Ошибочный код:

int a=(2+1)

Само сообщение об ошибке выглядит так:

semicolon expected

Правильный код:

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

unexpected end of program

Правильный код:

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', но мы не используем ее и не присваиваем ей значение.

 warning

Ниже приведены ссылки на соответствующие разделы коммуникации:

Несколько советов, которые могут оказаться очень для устранения этих ошибок в случае их возникновения:

  • Начинайте исправлять их с начала, так как это может устранить все последующие ошибки.
  • Двойной щелчок по строке ошибки на вкладке "Ошибки" панели инструментов сразу переведет вас на строку кода, в которой возникла проблема.

Мы рассмотрели ошибки, которые можно получить на первом этапе при написании кода программы 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

  •   1. Советник - выбрать файл программы, которую нужно протестировать.
  •   2. IDE - открыть исходный код выбранной программы.
  •   3. Сохранить/загрузить определенные настройки.
  •   4. Символ - выбрать символ для тестирования.
  •   5. Выбрать таймфрейм для тестирования.
  •   6. Характеристики выбранного символа.
  •   7. Интервал - выбрать период тестирования.
  •   8. Выбрать стартовый период тестирования.
  •   9. Выбрать конечный период тестирования.
  •  10. Форвард - выбрать необходимую долю периода оптимизации, которая будет выделена для форвардного тестирования.
  •  11. Выбрать начальную дату форварда.
  •  12. Задержки, можно выбрать близкие к реальным данным и реальному исполнению.
  •  13. Приблизиться к реальным данным и реальному исполнению.
  •  13/2. Моделирование - выбрать модель тестирования (на каждом тике и т.д.).
  •  14. Включите опцию для отображения прибыли в пипсах.
  •  15. Начальный депозит.
  •  16. Выбрать валюту депозита.
  •  17. Плечо.
  •  18. Оптимизация - использовать оптимизацию (поговорим о ней подробнее позже).
  •  19. Включите опцию, если вам необходимо визуализировать сделки или исполнение во время тестирования.


На вкладке "Параметры" можно проверить, есть ли в тестируемой программе редактируемые входные данные.

При клике на кнопке "Старт" происходит тестирование программы. При включенной визуализации мы увидим график с вкладками. "Торговля" отображает совершённые сделки, если они были. На вкладке "История" отображаются закрытые или отмененные ордера. "Операции" показывают все операции. В "Журнале" выводятся сообщения программы и другая служебная информация. Работу программы также можно отслеживать на вкладке "График" в тестере стратегий.

После завершения тестирования вся необходимая статистика отображается на вкладке "Бэктест"

Тестер3

Tester4

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

Функция оптимизации включает в себя широкий диапазон различных параметров и входных данных, а также проверку входных данных и всех возможных комбинаций этих входных данных, чтобы выбрать наилучшие результаты. Модель оптимизации можно выбрать на вкладке настроек

Тестер5

Тестер6

Наиболее важные элементы, которые нам необходимо проверить после тестирования:

  • Чистая прибыль - рассчитывается путем вычитания валового убытка из валовой прибыли.
  • Просадка - максимальный убыток на счете во время работы.
  • Прибыльность - отношение валовой прибыли к валовому убытку.
  • Матожидание выигрыша - средняя прибыль или убыток сделки.
  • Фактор восстановления - определяет, насколько хорошо протестированная стратегия восстанавливается после потерь.  


Заключение

Мы рассмотрели тестер стратегий, являющийся одним из самых важных и ценных инструментов, который нам всем необходимо освоить при разработке любой программы MQL5. Также мы рассмотрели некоторые смежные темы, которые помогут понимать и эффективно использовать этот инструмент. Мы узнали о типах ошибок, с которыми можем столкнуться при разработке MQL5-программ:

  • Ошибки и предупреждения компиляции.
  • Ошибки выполнения.
  • Ошибки торгового сервера.

Также мы рассмотрели процесс отладки во встроенном отладчике и подробно прошлись по основным возможностям тестера стратегий, включая его режимы работы и отчеты о тестировании.

Я надеюсь, что эта статья поможет вам создавать и эффективно тестировать качественные MQL5-программы. Возможно, вас заинтересуют другие мои статьи, например, о создании торговых систем на основе самых популярных технических индикаторов.

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/12635

Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Vitaliy Davydov
Vitaliy Davydov | 24 сент. 2023 в 09:30

Всем хорош МТ5, кроме тестера стратегий.

По мне так он сильно проигрывает тестеру МТ4 в плане визуального тестирования.

Простое добавление индикатора на график, во время визуального тестирования эксперта, превращается в какие-то пляски с бубном.

А иногда вообще невозможно.

Через шаблоны, как советуют, тоже не всегда получается, а если получается, эксперт перестает нормально работать зачастую.

В МТ4 просто кидаешь во время тестирования эксперта индикатор на график  и вообще никаких проблем.

Я не понимаю, зачем так было все портить в тестере МТ5?


Создал эксперт, при запуске создающий подокно и добавляющий туда MACD, с помощью  ChartIndicatorAdd.

В реале все работает отлично, в тестере при визуальном тестировании  опять же ни в какую.

Причем ошибок в логах нет. Хендл индикатора создается, подокно создается, а индикатор нет.

И никакой зацепки нет, функция возвращает "true".

Разработка пользовательского канала Дончиана с помощью MQL5 Разработка пользовательского канала Дончиана с помощью MQL5
Существует множество технических инструментов, которые можно использовать для визуализации ценового канала. Одним из таких инструментов является канал Дончиана (Donchian Channel). В этой статье мы узнаем, как создать канал Дончиана и как использовать его в качестве пользовательского индикатора в составе советника.
Парный трейдинг Парный трейдинг
В этой статье мы рассмотрим парный трейдинг: какие принципы лежат в его основе, есть ли перспективы его применения на практике. Заодно, попробуем создать стратегию парного трейдинга.
Популяционные алгоритмы оптимизации: Тасующий алгоритм прыгающих лягушек (Shuffled Frog-Leaping, SFL) Популяционные алгоритмы оптимизации: Тасующий алгоритм прыгающих лягушек (Shuffled Frog-Leaping, SFL)
Статья представляет подробное описание алгоритма прыгающих лягушек (SFL) и его возможности в решении задач оптимизации. SFL-алгоритм вдохновлен поведением лягушек в естественной среде и предлагает новый подход к оптимизации функций. SFL-алгоритм является эффективным и гибким инструментом, способным обрабатывать разнообразные типы данных и достигать оптимальных решений.
Разработка пользовательского индикатора True Strength Index с помощью MQL5 Разработка пользовательского индикатора True Strength Index с помощью MQL5
Представляю новую статью о том, как создать пользовательский индикатор. На этот раз мы будем работать с индексом истинной силы - True Strength Index (TSI) и создадим советник на его основе.