Приостановка выполнения программы

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

Для этой цели в MQL5 имеется функция Sleep. В данном разделе приводится её формальное описание, а пример будет приведен в следующем разделе, вместе с функциями измерения временных интервалов.

void Sleep(int milliseconds)

Функция приостанавливает выполнение MQL-программы на заданное количество миллисекунд. После их истечения продолжат выполняться следующие инструкции, расположенные непосредственно после вызова Sleep.

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

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

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

Если пользователь прервет работу MQL-программы из интерфейса терминала в то время, как она ожидает завершения вызова Sleep, выход из функции происходит немедленно (в пределах 100мс), то есть пауза заканчивается досрочно. При этом будет взведен флаг остановки _StopFlag (доступный также через функцию IsStopped), и программа должна максимально быстро и корректно прекратить исполнение.