Управление ходом времени в тестере: таймер, Sleep, GMT

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

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

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

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

Как мы знаем, в MQL5 возможна обработка событий таймера. Вызов обработчика OnTimer производится независимо от режима тестирования. Это означает, что если тестирование запущено в режиме "Только цены открытия" на периоде H4 и внутри эксперта установлен таймер с вызовом каждую секунду, то на открытии каждого бара H4 один раз будет вызван обработчик OnTick и далее "в течение" бара будет 14400 раз (3600 секунд * 4 часа) вызван обработчик OnTimer. Насколько при этом увеличится время тестирования эксперта, зависит от его алгоритма.

Другой функцией, влияющей на ход времени внутри программы, является функция Sleep. Она позволяет приостановить выполнение эксперта на некоторое время. Это может понадобиться при запросе каких-либо данных, которые в момент запроса еще не готовы и необходимо дождаться момента их готовности.

Важно понять, что Sleep влияет только на вызвавшую его программу и не задерживает процесс тестирования. Фактически при вызове Sleep "проигрываются" сгенерированные тики в пределах указанной задержки, в результате чего могут сработать отложенные ордера, стоп-уровни и т.д. После вызова Sleep cмоделированное в тестере время увеличивается на интервал, указанный в параметре функции.

Чуть позже, в разделе про тестирование мультивалютных советников мы покажем, как можно использовать таймер и функцию Sleep для синхронизации баров.