---
title: "Особенности тестирования - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5"
description: "Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в... - Особенности тестирования - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5"
image: "https://www.metatrader5.com/i/logo_metatrader5.png"
url: "https://www.metatrader5.com/ru/terminal/help/algotrading/testing_features"
---

[Справка по MetaTrader 5](https://www.metatrader5.com/ru/terminal/help) → [Алгоритмический трейдинг, торговые роботы](https://www.metatrader5.com/ru/terminal/help/algotrading) → Особенности тестирования

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

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

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

Для получения ответов на эти вопросы предназначен [тестер стратегий](https://www.metatrader5.com/ru/terminal/help/algotrading/testing), входящий в состав торговой платформы.

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

По небиржевым инструментам срабатывание всех видов отложенных ордеров и 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 на биржевом инструменте](https://www.metatrader5.com/i/help/terminal/ru/tester_execution_example.png)

> В [режимах тестирования](https://www.metatrader5.com/ru/terminal/help/algotrading/tick_generation#tick_mode) "По ценам открытия" и "М1 на OHLC" исполнение отложенных и SL/TP ордеров осуществляется по ценам, заявленным в этих ордерах. Алгоритм исполнения по рыночным ценам, используемый в точных режимах (все тики и реальные тики), не подходит для грубых режимов. В последних, промежуточные тики не генерируются, и разница между заявленной в ордере ценой и рыночной ценой на момент исполнения (Open или OHLC), может быть значительной. Исполнение ордеров по заявленной цене в режимах "По ценам открытия" и "M1 на OHLC" дает более точные результаты тестирования.

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

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

## Моделирование спреда [#](#spread)

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

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

## Глобальные переменные торговой платформы [#](#globals)

При тестировании глобальные переменные торговой платформы также эмулируются, но они никак не связаны с настоящими [глобальным переменным платформы](https://www.metatrader5.com/ru/terminal/help/algotrading/service_global), которые можно увидеть в платформе по кнопке F3. Это означает, что все операции с глобальными переменными платформы при тестировании производятся вне самой торговой платформы (в агенте тестирования).

## Загрузка истории при тестировании [#](#history)

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

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

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

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

| Подкачка осуществляется | Подкачка не осуществляется |
| --- | --- |
| При вызове SymbolInfoDouble с параметрами:<br><br>- SYMBOL_BID<br>- SYMBOL_BIDHIGH<br>- SYMBOL_BIDLOW<br>- SYMBOL_ASK<br>- SYMBOL_ASKHIGH<br>- SYMBOL_ASKLOW<br>- SYMBOL_LAST<br>- SYMBOL_LASTHIGH<br>- SYMBOL_LASTLOW<br>- SYMBOL_TRADE_TICK_VALUE<br>- SYMBOL_TRADE_TICK_VALUE_PROFIT<br>- SYMBOL_TRADE_TICK_VALUE_LOSS<br><br>При вызове SymbolInfoInteger с параметрами:<br><br>- SYMBOL_VOLUME<br>- SYMBOL_VOLUMEHIGH<br>- SYMBOL_VOLUMELOW<br>- SYMBOL_TIME<br>- SYMBOL_SPREAD<br><br>При вызове SymbolInfoTick | При вызове:<br><br>- SymbolInfoString<br>- SymbolName<br>- SymbolSelect<br>- SymbolInfoMarginRate<br>- SymbolInfoSessionQuote<br>- SymbolInfoSessionTrade<br>- Других неуказанных функций<br>- SymbolInfoDouble и SymbolInfoInteger с другими параметрами, не указанными слева |

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

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

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

## Мультивалютное тестирование [#](#multicurrency)

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

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

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

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

При тестировании эмулируется также и "[Обзор рынка](https://www.metatrader5.com/ru/terminal/help/trading/market_watch)", из которого можно получать информацию по инструментам. По умолчанию в начале тестирования в "Обзоре рынка" тестера есть только один символ — символ, на котором запущено тестирование. Все необходимые символы подключаются к "Обзору рынка" тестера (не платформы!) автоматически при обращении к ним.

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

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

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

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

## Моделирование времени в тестере [#](#time)

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

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

## Графические объекты при тестировании [#](#objects)

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

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

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

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

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

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

Тестер генерирует и проигрывает для каждого инструмента тиковую последовательность в соответствии с выбранным режимом торговли. При этом [новый бар](https://www.mql5.com/ru/articles/159) на каждом инструменте открывается независимо от того, как открылся бар на другом инструменте. Это означает, что при тестировании мультивалютного эксперта возможна ситуация (и чаще всего так и бывает), когда на одном инструменте новый бар уже открылся, а на другом еще нет. Таким образом, при тестировании все происходит как в жизни.

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

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

## Агенты тестирования [#](#agents)

Тестирование в торговой платформе осуществляется с помощью [агентов тестирования](https://www.metatrader5.com/ru/terminal/help/algotrading/strategy_optimization#agents). Локальные агенты создаются и подключаются автоматически. Количество локальных агентов по умолчанию соответствует количеству ядер на компьютере.

У каждого агента тестирования своя копия [глобальных переменных](https://www.metatrader5.com/ru/terminal/help/algotrading/service_global), которая никак не связана с платформой. Сама платформа является диспетчером, который раздает задачи локальным и удаленным агентам. После выполнения очередного задания по тестированию советника с заданными параметрами агент возвращает платформе результаты. При одиночном тестировании используется только один агент.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## Использование DLL [#](#dll)

Для ускорения оптимизации можно использовать не только локальные, но и [удаленные агенты](https://www.metatrader5.com/ru/terminal/help/algotrading/strategy_optimization#farm). При этом есть некоторые ограничения для удаленных агентов. Во-первых, удаленные агенты не выводят в свои логи результаты выполнения функции Print(), сообщения об открытии/закрытии позиций. Выводится в лог минимум информации чтобы неправильно написанные эксперты не забили сообщениями жесткий диск компьютера, на котором работает удаленный агент.

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

![Советники](https://www.metatrader5.com/i/help/terminal/ru/options_ea.png)

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

## In this section

- [Торговые советники и собственные индикаторы](https://www.metatrader5.com/ru/terminal/help/algotrading/trade_robots_indicators)
- [Где взять торговых роботов и индикаторы](https://www.metatrader5.com/ru/terminal/help/algotrading/algotrading_get_ea_indicator)
- [Как самому создать советника или индикатор](https://www.metatrader5.com/ru/terminal/help/algotrading/autotrading)
- [Тестирование стратегий](https://www.metatrader5.com/ru/terminal/help/algotrading/testing)
- [Как тестер загружает исторические данные](https://www.metatrader5.com/ru/terminal/help/algotrading/test_preparation)
- [Оптимизация стратегий](https://www.metatrader5.com/ru/terminal/help/algotrading/strategy_optimization)
- Особенности тестирования
- [Отчет о тестировании](https://www.metatrader5.com/ru/terminal/help/algotrading/testing_report)
- [Визуализация тестирования](https://www.metatrader5.com/ru/terminal/help/algotrading/visualization)
- [Журнал тестирования](https://www.metatrader5.com/ru/terminal/help/algotrading/tester_journal)
- [Типы оптимизации](https://www.metatrader5.com/ru/terminal/help/algotrading/optimization_types)
- [Реальные и сгенерированные тики](https://www.metatrader5.com/ru/terminal/help/algotrading/tick_generation)
- [MetaTester и удаленные агенты](https://www.metatrader5.com/ru/terminal/help/algotrading/metatester)
- [Глобальные переменные](https://www.metatrader5.com/ru/terminal/help/algotrading/service_global)

```json
{"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ {"@type": "ListItem", "position": 1, "item": {"@id": "https://www.metatrader5.com/ru/terminal/help", "name": "Справка по MetaTrader 5"}}, {"@type": "ListItem", "position": 2, "item": {"@id": "https://www.metatrader5.com/ru/terminal/help/algotrading", "name": "Алгоритмический трейдинг, торговые роботы"}}, {"@type": "ListItem", "position": 3, "item": {"@id": "https://www.metatrader5.com/ru/terminal/help/algotrading/testing_features", "name": "Особенности тестирования"}} ]}
{ "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{ "@type": "Question", "name": "MetaTrader 5: Особенности тестирования", "acceptedAnswer": { "@type": "Answer", "text": "Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает..." } }] }
```
