OnTimer

É chamada em EAs quando o ocorre o evento Timer gerado pelo terminal com um intervalo predeterminado.

void  OnTimer(void);

Valor retornado

Sem valor retornado

Observação

O evento Timer é gerado periodicamente pelo terminal do cliente para o EA que ativa o temporizador usando a função EventSetTimer(). Geralmente, esta função é chamada na função OnInit(). Ao concluir o trabalho do EA, é necessário destruir o temporizador criado com a ajuda da EventKillTimer() que, normalmente é chamada na função OnDeinit().

Cada EA e cada indicador trabalha com seu temporizador e recebe eventos apenas dele. No final do trabalho do programa MQL5, o temporizador é forçosamente destruído, se foi criado, mas não foi desabilitado pela função EventKillTimer().

Se precisar receber eventos do temporizador mais de uma vez por segundo, use a EventSetMillisecondTimer() para criar um temporizador de alta resolução.

Em geral, à medida que o período do temporizador diminui, o tempo de teste aumenta, uma vez que o número de chamadas do manipulador de eventos do tempo total aumenta. Ao trabalhar em tempo real, os eventos do temporizador são gerados no máximo 1 vez a cada 10-16 milissegundos, o que é devido a limitações de hardware.

Para cada programa, não pode ser iniciado mais do que um temporizador. Cada programa MQL5 e cada gráfico têm sua própria fila de eventos, à qual são adicionados todos os eventos recém-chegados. Se na fila já houver um evento Timer ou este evento estiver no estado de processamento, o novo evento Timer não será colocado na fila do programa MQL5.

Exemplo de EA com manipulador OnTimer()

//+------------------------------------------------------------------+
//|                                               OnTimer_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Exemplo de uso de temporizador para calcular a hora do servidor de negociação"
#property description "É melhor iniciar o EA no final da semana de negociação, antes do fim de semana"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- criamos um temporizador com um período de 1 segundo
   EventSetTimer(1);
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destruímos o temporizador no final do trabalho
   EventKillTimer();
 
  }
//+----------´--------------------------------------------------------+
//| Expert tck function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- hora da primeira chamada da OnTimer()
   static datetime start_time=TimeCurrent();
//--- hora do servidor de negociação na primeira chamada da OnTimer();
   static datetime start_tradeserver_time=0;
//--- hora do servidor de negociação calculada
   static datetime calculated_server_time=0;
//--- hora local no computador
   datetime local_time=TimeLocal();
//--- hora estimada atual do servidor de negociação
   datetime trade_server_time=TimeTradeServer();
//--- se por algum motivo a hora do servidor for desconhecida, sairemos antecipadamente
   if(trade_server_time==0)
      return;
//--- se o valor inicial do servidor de negociação ainda não estiver definido
   if(start_tradeserver_time==0)
     {
      start_tradeserver_time=trade_server_time;
      //--- definimos a hora calculada do servidor de negociação      
      Print(trade_server_time);
      calculated_server_time=trade_server_time;
     }
   else
     {
      //--- aumentamos o tempo da primeira chamada da 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));
//--- exibimos no gráfico os valores de todos os contadores
   Comment(com);
  }

Veja também

EventSetTimer, EventSetMillisecondTimer, EventKillTimer, GetTickCount, GetMicrosecondCount, Eventos do terminal do cliente