OnTimer

Вызывается в экспертах при наступлении события Timer, генерируемого терминалом с заданным интервалом.

void  OnTimer(void);

Возвращаемое значение

Нет возвращаемого значения

Примечание

Событие Timer периодически генерируется клиентским терминалом для эксперта, который активизировал таймер при помощи функции EventSetTimer(). Обычно эта функция вызывается в функции OnInit(). При завершении работы эксперта необходимо уничтожить созданный таймер при помощи EventKillTimer(), которую обычно вызывают в функции OnDeinit().

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

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

В тестере стратегий используется минимальный интервал в 1000 миллисекунд. В общем случае при уменьшении периода таймера увеличивается время тестирования, так как возрастает количество вызовов обработчика событий таймера. При работе в режиме реального времени события таймера генерируются не чаще 1 раза в 10-16 миллисекунд, что связано с аппаратными ограничениями.

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

Пример эксперта c обработчиком OnTimer()

//+------------------------------------------------------------------+
//|                                               OnTimer_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Пример использования таймера для вычисления времени торгового сервера"
#property description "Советник лучше всего запустить в конце торговой недели перед выходными"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим таймер с периодом в 1 секунду
   EventSetTimer(1);
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- уничтожим таймер при завершении работы
   EventKillTimer();
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- время первого вызова OnTimer()
   static datetime start_time=TimeCurrent();
//--- время торгового сервера при первом вызове OnTimer();
   static datetime start_tradeserver_time=0;
//--- вычисляемое время торгового сервера
   static datetime calculated_server_time=0;
//--- локальное время на компьютере
   datetime local_time=TimeLocal();
//--- текущее расчетное время торгового сервера
   datetime trade_server_time=TimeTradeServer();
//--- если по какой-то причине время сервера неизвестно, то выходим досрочно
   if(trade_server_time==0)
      return;
//--- если стартовое значение торгового сервера еще не установлено
   if(start_tradeserver_time==0)
     {
      start_tradeserver_time=trade_server_time;
      //--- установим вычисляемое значение торгового сервера      
      Print(trade_server_time);
      calculated_server_time=trade_server_time;
     }
   else
     {
      //--- увеличим время первого вызова OnTimer()
      if(start_tradeserver_time!=0)
         calculated_server_time=calculated_server_time+1;;
     }
//--- 
   string com=StringFormat("                  Start time: %s\r\n",TimeToString(start_time,TIME_MINUTES|TIME_SECONDS));
   com=com+StringFormat("                  Local time: %s\r\n",TimeToString(local_time,TIME_MINUTES|TIME_SECONDS));
   com=com+StringFormat("TimeTradeServer time: %s\r\n",TimeToString(trade_server_time,TIME_MINUTES|TIME_SECONDS));
   com=com+StringFormat(" EstimatedServer time: %s\r\n",TimeToString(calculated_server_time,TIME_MINUTES|TIME_SECONDS));
//--- выведем значения всех счетчиков на график
   Comment(com);
  }

Смотри также

EventSetTimer, EventSetMillisecondTimer, EventKillTimer, GetTickCount, GetMicrosecondCount, События клиентского терминала