Справка по MetaTrader 5Алгоритмический трейдинг, торговые роботыОсобенности тестирования

Особенности тестирования

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

  • эксперт совершает торговые операции в соответствии с правилами торговой системы;
  • торговая стратегия, реализованная в эксперте, показывает прибыль на истории.

Для получения ответов на эти вопросы предназначен тестер стратегий, входящий в состав торговой платформы.

Срабатывание и исполнение ордеров

По небиржевым инструментам срабатывание всех видов отложенных ордеров и SL/TP осуществляется по ценам Bid и Ask. Исполнение происходит по текущим рыночным ценам Bid и Ask на момент срабатывания.

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

Рассмотрим пример на инструменте Si-6.16. При текущих ценах Bid=72570, Ask=72572, Last=72552 был выставлен ордер Buy Stop с ценой срабатывания 72580. В ценовом потоке мы получили новые текущие цены:

  • Bid=72588
  • Ask=72590
  • Last=72580

На биржевых инструментах триггером для срабатывания стоп-ордеров является цена Last. Поэтому поступление в потоке цены Last=72580 привело к активации ордера Buy Stop. Исполнение ордера (рыночная операция покупки) произойдет по текущей рыночной цене Ask=72590.

Пример срабатывания и исполнения ордера Buy Stop на биржевом инструменте

В режимах тестирования "По ценам открытия" и "М1 на OHLC" исполнение отложенных и SL/TP ордеров осуществляется по ценам, заявленным в этих ордерах. Алгоритм исполнения по рыночным ценам, используемый в точных режимах (все тики и реальные тики), не подходит для грубых режимов. В последних, промежуточные тики не генерируются, и разница между заявленной в ордере ценой и рыночной ценой на момент исполнения (Open или OHLC), может быть значительной. Исполнение ордеров по заявленной цене в режимах "По ценам открытия" и "M1 на OHLC" дает более точные результаты тестирования.

Формирование баров

Для биржевых инструментов бары в тестере стратегий формируются только по тикам с ненулевой ценой Last. При этом могут приходить цены Bid и Ask, индикаторы будут рассчитываться, но бары формироваться не будут. В режиме "Все тики" нулевых цен Last не бывает. Поэтому каждый новый тик будет изменять бар.

Моделирование спреда #

Разница между ценами Bid и Ask называется спредом. При тестировании спред не моделируется, а берется из исторических данных. Если в исторических данных спред меньше или равен нулю, то используется последний известный на момент генерации спред.

В тестере спред всегда считается плавающим.

Глобальные переменные торговой платформы #

При тестировании глобальные переменные торговой платформы также эмулируются, но они никак не связаны с настоящими глобальным переменным платформы, которые можно увидеть в платформе по кнопке F3. Это означает, что все операции с глобальными переменными платформы при тестировании производятся вне самой торговой платформы (в агенте тестирования).

Загрузка истории при тестировании #

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

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

Обращение к дополнительным инструментам происходит и в том случае, когда вычисляется цена кросс-курса при торговых операциях. Например, при тестировании стратегии на EURCHF с валютой депозита в долларах США перед обработкой первой же торговой операцией агент тестирования запрашивает у платформы историю по EURUSD и USDCHF, хотя в стратегии нет прямого обращения к этим инструментам.

Подкачка дополнительной торговой истории может быть начата при вызове определенных функций из MQL5-программы:

Подкачка осуществляется

Подкачка не осуществляется

При вызове SymbolInfoDouble с параметрами:

  • SYMBOL_BID
  • SYMBOL_BIDHIGH
  • SYMBOL_BIDLOW
  • SYMBOL_ASK
  • SYMBOL_ASKHIGH
  • SYMBOL_ASKLOW
  • SYMBOL_LAST
  • SYMBOL_LASTHIGH
  • SYMBOL_LASTLOW
  • SYMBOL_TRADE_TICK_VALUE
  • SYMBOL_TRADE_TICK_VALUE_PROFIT
  • SYMBOL_TRADE_TICK_VALUE_LOSS

При вызове SymbolInfoInteger с параметрами:

  • SYMBOL_VOLUME
  • SYMBOL_VOLUMEHIGH
  • SYMBOL_VOLUMELOW
  • SYMBOL_TIME
  • SYMBOL_SPREAD

При вызове SymbolInfoTick

При вызове:

  • SymbolInfoString
  • SymbolName
  • SymbolSelect
  • SymbolInfoMarginRate
  • SymbolInfoSessionQuote
  • SymbolInfoSessionTrade
  • Других неуказанных функций
  • SymbolInfoDouble и SymbolInfoInteger с другими параметрами, не указанными слева

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

Тестерные агенты в свою очередь получают историю от платформы и также в упакованном виде. При повторном тестировании загрузка тестером истории из платформы уже не происходит, потому что данные есть от предыдущего запуска тестера.

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

Мультивалютное тестирование #

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

История по используемым инструментам закачивается тестером из торговой платформы (не с торгового сервера!) автоматически при первом обращении к данному инструменту.

Агент тестирования закачивает только недостающую историю с небольшим запасом, чтобы обеспечить необходимые данные на истории для расчета индикаторов на момент начала тестирования. Минимальный объем истории при скачивании с торгового сервера для таймфреймов D1 и меньше составляет один год. Таким образом, если запускается тестирование на интервале  2010.11.01-2010.12.01 (тестирование на интервале в один месяц) с периодом M15 (каждый бар равен 15 минутам), то у платформы будет запрошена история по инструменту за весь 2010 год. Для таймфреймов Weekly будет запрошена история в 100 баров, что составляет примерно два года (в году 52 недели). Для тестирования на месячном таймфрейме Monthly агент запросит историю за 8 лет (12 месяцев * 8 лет = 96 месяцев).

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

При тестировании эмулируется также и "Обзор рынка", из которого можно получать информацию по инструментам. По умолчанию в начале тестирования в "Обзоре рынка" тестера есть только один символ — символ, на котором запущено тестирование. Все необходимые символы подключаются к "Обзору рынка" тестера (не платформы!) автоматически при обращении к ним.

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

В тот момент, когда происходит первое обращение к чужому символу, процесс тестирования останавливается и происходит подкачка истории по паре символ/период от платформы к агенту тестирования. Одновременно включается генерация тиковой последовательности для этого символа.

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

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

Моделирование времени в тестере #

При тестировании локальное время всегда равно серверному времени. В свою очередь, серверное время всегда равно времени, соответствующему времени GMT.

Отсутствие разницы между GMT, локальным и серверным временем в тестере сделано сознательно по той самой причине, что связь с сервером может быть не всегда. А результаты тестирования должны быть одинаковыми, независимо от наличия связи. Информация о серверном времени не хранится локально, а берется с сервера.

Графические объекты при тестировании #

Во время тестирования/оптимизации не осуществляется построение графических объектов. Таким образом, при обращении к свойствам созданного объекта во время тестирования/оптимизации эксперт получит нулевые значения.

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

Синхронизация баров при тестировании в режиме "Только цены открытия" #

Тестер в торговой платформе позволяет проверять и, так называемые, "мультивалютные" советники. Мультивалютный советник — это советник, который торгует на двух или более символах.

Тестирование стратегий, торгующих на нескольких инструментах, налагает на тестер несколько дополнительных технических требований:

  • генерации тиков для этих инструментов;
  • расчет значений индикаторов для этих инструментов;
  • расчет маржевых требований по этим инструментам;
  • синхронизация сгенерированных тиковых последовательностей по всем торгуемым инструментам.

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

Такое достоверное моделирование развития истории в тестере не вызывает вопросов до тех пор, пока используются режимы тестирования "Все тики" и "1 minute OHLC". При этих режимах  в пределах одной свечи генерируется достаточное количество тиков, чтобы дождаться момента синхронизации баров с разных символов. Но как тестировать мультивалютные стратегии в режиме "Только цены открытия", если требуется обязательная синхронизация баров на торгуемых инструментах? Ведь в этом режиме эксперт вызывается только на одном тике, который соответствует времени открытия бара.

Поясним на примере: если мы тестируем эксперта на символе EURUSD, и на EURUSD открылась новая часовая свеча, то мы легко узнаем этот факт — при тестировании в режиме "Только цены открытия" событие прихода нового тика соответствует моменту открытия бара на тестируемом периоде. Но при этом нет никакой гарантии, что новая свеча открылась по символу GBPUSD, который используется в эксперте.

Агенты тестирования #

Тестирование в торговой платформе осуществляется с помощью агентов тестирования. Локальные агенты создаются и подключаются автоматически. Количество локальных агентов по умолчанию соответствует количеству ядер на компьютере.

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

Агент хранит полученную от платформы историю в отдельных папках по имени инструмента, то есть история для  EURUSD хранится в папке с именем EURUSD. Кроме того история инструментов разделяется по источникам. Структура для хранения истории выглядит таким образом:

каталог_тестера\Agent-IPaddress-Port\bases\имя_источника\history\имя_инструмента

Например, история по EURUSD с сервера MetaQuotes-Demo может храниться в папке каталог_тестера\Agent-127.0.0.1-3000\bases\MetaQuotes-Demo\EURUSD.

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

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

Обмен данными между платформой и агентом #

При запуске тестирования платформа готовит для отправки агенту несколько блоков параметров:

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

Для каждого блока параметров создается цифровой отпечаток в виде MD5-хэша, который и посылается агенту. MD5-хэш является уникальным для каждого набора, его объем во много раз меньше объема информации, на основе которой он вычислен.

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

После проведения тестирования агент возвращает платформе все результаты прогона, показываемые во вкладках "Результаты тестирования" и  "Результаты оптимизации": полученная прибыль, количество сделок,  коэффициент Шарпа, результат функции OnTester() и т.д.

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

Агенты никогда не записывают на жесткий диск полученные от платформы EX5-файлы (эксперт, индикаторы, библиотеки и т.д.) из соображений безопасности, чтобы на компьютере с установленным агентом нельзя было воспользоваться присланными данным. Все остальные файлы, в том числе DLL, записываются в "песочницу". В удалённых агентах нельзя тестировать экспертов с использованием DLL.

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

Весь трафик между платформой и агентами шифруется.

Тики не пересылаются по сети, они генерируются на тестерных агентах.

Использование общей папки всех торговых платформ #

Все тестерные агенты изолированы друг от друга и от торговой платформы: у каждого  агента есть собственная папка, в которую записываются логи агента. Кроме того, все файловые операции при тестирования агента происходят в папке имя_агента/MQL5/Files. Однако можно реализовать взаимодействие между локальными агентами и торговой платформой через общую папку всех платформ.

Использование DLL #

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

Второе ограничение — запрет на использование DLL при тестировании экспертов. Вызовы DLL безусловно запрещены на удалённых агентах из соображений безопасности. На локальных агентах вызовы dll в тестируемых экспертах разрешены только в том случае, если установлено соответствующее разрешение "Разрешить импорт DLL".

Советники

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