OnTimer

Se llama en los expertos al suceder el evento Timer generado por el terminal con el intervalo establecido.

void  OnTimer(void);

Valor retornado

No hay valor retornado

Observación

El evento Timer es generado periódicamente por el terminal de cliente para el experto que ha activado el temporizador con la ayuda de la función EventSetTimer(). Normalmente, esta función se llama en la función OnInit(). Al finalizar el funcionamiento del experto es necesario eliminar el temporizador creado usando EventKillTimer(), que normalmente se llama en la función OnDeinit().

Todos los expertos e indicadores trabajan con su propio temporizador y reciben los eventos solo del mismo. Al finalizar el funcionamiento de un programa MQL5, el temporizador es eliminado forzosamente, si este ha sido creado y no ha sido desactivado por la función EventKillTimer().

Si es necesario recibir los eventos del temporizador con mayor frecuencia que una vez por segundo, use EventSetMillisecondTimer() para crear un temporizador de alta resolución.

En general, al dismuinuir el periodo del temporizador, se incrementa el tiempo de simulación, ya que aumenta el número de llamadas del manejador de eventos del temporizador. Al trabajar en el modo de tiempo real, los eventos del temporizador no se generan con una frecuencia mayor a 1 vez cada 10-16 milisegundos: esto se relaciona con las limitaciones del hardware.

Para cada programa no se puede iniciar más de un temporizador. Todos los programas mql5 y todos los gráficos tienen su propia cola de eventos, donde se van colocando los eventos que suceden nuevamente. Si en la cola ya hay un evento Timer o bien este evento está siendo procesado, el nuevo evento Timer no se pondrá en la cola del programa mql5.

Ejemplo de un experto con el manejador 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 "Ejemplo de uso de un temporizador para calcular la hora de un servidor comercial"
#property description "Es mejor iniciar el asesor al final de la semana comercial, antes del fin de semana"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- creamos un temporizador con un periodo de 1 segundo
   EventSetTimer(1);
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- eliminamos el temporizador al finalizar el trabajo
   EventKillTimer();
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- hora de la primera llamada de OnTimer()
   static datetime start_time=TimeCurrent();
//--- hora del servidor comercial en la primera llamada de OnTimer();
   static datetime start_tradeserver_time=0;
//--- hora calculada del servidor comercial
   static datetime calculated_server_time=0;
//--- hora local en la computadora
   datetime local_time=TimeLocal();
//--- hora calculada actual del servidor comercial
   datetime trade_server_time=TimeTradeServer();
//--- si por algún motivo se desconoce la hora del servidor, salimos antes de tiempo
   if(trade_server_time==0)
      return;
//--- si el valor inicial del servidor comercial no se ha establecido aún
   if(start_tradeserver_time==0)
     {
      start_tradeserver_time=trade_server_time;
      //--- establecemos el valor a calcular del servidor comercial      
      Print(trade_server_time);
      calculated_server_time=trade_server_time;
     }
   else
     {
      //--- aumentamos la hora de la primera llamada de 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));
//--- mostramos los valores de todos los contadores en el gráfico
   Comment(com);
  }

Ver también

EventSetTimer, EventSetMillisecondTimer, EventKillTimer, GetTickCount, GetMicrosecondCount, Eventos del terminal de cliente