Включение и отключение таймера: EventSetTimer/EventKillTimer

MQL5 позволяет включать и отключать стандартный таймер для выполнения каких-либо действий по расписанию. Для этого предназначены две функции: EventSetTimer и EventKillTimer.

bool EventSetTimer(int seconds)

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

Функция возвращает признак успешного выполнения (true) или ошибки (false). Код ошибки можно получить в _LastError.

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

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

Каждая интерактивная MQL-программа, размещенная на графике, имеет отдельную очередь событий, куда складываются поступающие для неё события. Если в очереди уже есть событие OnTimer или оно находится в состоянии обработки, то новое событие OnTimer в очередь не ставится.

Если таймер больше не нужен, его следует отключить функцией EventKillTimer.

void EventKillTimer(void)

Функция останавливает таймер, включенный перед этим функцией EventSetTimer (или функцией EventSetMillisecondTimer, которую мы рассмотрим далее). Функцию можно вызвать и из обработчика OnTimer. Таким образом, в частности, можно выполнить отложенное однократное действие.

В индикаторах вызов EventKillTimer не чистит очередь, поэтому после него можно получить последнее остаточное событие OnTimer.

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

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

MQL5 позволяет создавать и таймеры с периодичностью менее 1 секунды: для этого существует функция EventSetMillisecondTimer.