What is a sample EA with the ontimer handler?

OnTimer en MQL5: El Corazón de tu Robot

16/11/2013

Valoración: 3.95 (14037 votos)

En el fascinante universo del trading algorítmico, donde cada milisegundo cuenta, nuestros Expert Advisors (EAs) o robots de trading son como los campeones que enviamos a una arena digital. Para que estos campeones actúen con inteligencia y no de forma caótica, necesitan un ritmo, un pulso constante que dicte sus acciones. Aquí es donde entra en juego una de las funciones más fundamentales y a la vez más poderosas de MQL5: OnTimer(). No se trata solo de reaccionar a los cambios del mercado, sino de actuar con una cadencia premeditada, una estrategia basada en el tiempo. Pensemos en OnTimer() como el corazón de nuestro EA, bombeando vida y lógica a intervalos regulares para que ejecute sus tareas con una precisión quirúrgica.

What is a sample EA with the ontimer handler?
Sample EA with the OnTimer () handler The function is called in EAs during the Timer event generated by the terminal at fixed time intervals. Return Value No return value Note The Timer...

A diferencia del manejador de eventos OnTick(), que se dispara con cada nuevo tick de precio y puede ser frenético en mercados volátiles, OnTimer() nos otorga el control total sobre la frecuencia de las operaciones de nuestro robot. ¿Necesitas que tu EA revise una condición cada minuto? ¿O quizás cada hora para una estrategia a largo plazo? ¿O incluso cada 100 milisegundos para una operación de alta frecuencia? La función OnTimer() es la herramienta perfecta para orquestar estas acciones temporizadas, permitiéndonos construir EAs más eficientes, organizados y menos demandantes en recursos del sistema.

Índice de Contenido

La Santísima Trinidad de la Temporización: OnInit, OnTimer y OnDeinit

Para dominar el uso del temporizador en MQL5, debemos entender cómo interactúan tres funciones clave. Son inseparables y cada una cumple un rol vital en el ciclo de vida de nuestro temporizador.

1. El Despertar del Campeón: EventSetTimer() en OnInit()

Antes de que nuestro temporizador pueda empezar a funcionar, necesitamos activarlo. Esto se hace típicamente dentro de la función OnInit(), que se ejecuta una sola vez cuando el EA es cargado en el gráfico. La función que usamos para esto es EventSetTimer(seconds).

EventSetTimer(1);

Este simple comando le dice al terminal: "Oye, a partir de ahora, quiero que generes un evento de temporizador cada segundo para este EA". El número dentro del paréntesis es el intervalo en segundos. Si quisieras un evento cada minuto, usarías EventSetTimer(60).

2. El Pulso de la Batalla: La Lógica dentro de OnTimer()

Una vez que el temporizador está activo, la función void OnTimer() será llamada automáticamente por el terminal en el intervalo que hemos definido. Aquí es donde reside toda la lógica que queremos ejecutar periódicamente. Puede ser cualquier cosa: verificar si se ha cruzado una media móvil, comprobar el nivel de margen, escribir un log, o como en el ejemplo que analizaremos, calcular y comparar tiempos.

Es crucial entender que si la lógica dentro de OnTimer() tarda más en ejecutarse que el propio intervalo del temporizador, el terminal podría saltarse un evento para no sobrecargar la cola. Por ello, el código aquí debe ser eficiente.

3. El Descanso del Guerrero: EventKillTimer() en OnDeinit()

Así como es importante iniciar el temporizador, es igualmente fundamental detenerlo cuando nuestro EA ya no está en funcionamiento. Si no lo hacemos, podríamos dejar procesos innecesarios consumiendo recursos. La función OnDeinit() se ejecuta cuando el EA es removido del gráfico o cuando el terminal se cierra. Dentro de ella, llamamos a EventKillTimer() para destruir el temporizador que creamos.

EventKillTimer();

Esta buena práctica asegura que nuestro EA sea limpio y respetuoso con los recursos del sistema.

Análisis del Código de Ejemplo: Desentrañando el Misterio

Ahora, vamos a desglosar el código de ejemplo proporcionado para entender cómo estas piezas encajan en la práctica. Este EA tiene un objetivo simple pero didáctico: calcular y mostrar la hora del servidor de trading basándose en un contador interno que se incrementa cada segundo.

//+------------------------------------------------------------------+ //| OnTimer_Sample.mq5 | //| Derechos de autor 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 del uso del temporizador para calcular la hora del servidor de trading" #property description "Se recomienda ejecutar el EA al final de la semana de trading antes del fin de semana" //+------------------------------------------------------------------+ //| Función de inicialización del Expert Advisor | //+------------------------------------------------------------------+ int OnInit() { //--- creamos un temporizador con un período de 1 segundo EventSetTimer(1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Función de desinicialización del Expert Advisor | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destruimos el temporizador después de completar el trabajo EventKillTimer(); } //+------------------------------------------------------------------+ //| Función de tick del Expert Advisor | //+------------------------------------------------------------------+ void OnTick() { //--- esta función se deja vacía a propósito en este ejemplo } //+------------------------------------------------------------------+ //| Función del temporizador | //+------------------------------------------------------------------+ void OnTimer() { //--- hora de la primera llamada a OnTimer() static datetime start_time=TimeCurrent(); //--- hora del servidor de trading durante la primera llamada a OnTimer() static datetime start_tradeserver_time=0; //--- hora calculada del servidor de trading static datetime calculated_server_time=0; //--- hora local del PC datetime local_time=TimeLocal(); //--- hora estimada actual del servidor de trading datetime trade_server_time=TimeTradeServer(); //--- si la hora del servidor es desconocida por alguna razón, salimos if(trade_server_time==0) return; //--- si el valor inicial del servidor de trading aún no se ha establecido if(start_tradeserver_time==0) { start_tradeserver_time=trade_server_time; //--- establecemos un valor calculado del servidor de trading Print(trade_server_time); calculated_server_time=trade_server_time; } else { //--- incrementamos la hora de la primera llamada a OnTimer() if(start_tradeserver_time!=0) calculated_server_time=calculated_server_time+1;; } //--- string com=StringFormat(" Hora de Inicio: %s\r ",TimeToString(start_time,TIME_MINUTES|TIME_SECONDS)); com=com+StringFormat(" Hora Local: %s\r ",TimeToString(local_time,TIME_MINUTES|TIME_SECONDS)); com=com+StringFormat("Hora TimeTradeServer: %s\r ",TimeToString(trade_server_time,TIME_MINUTES|TIME_SECONDS)); com=com+StringFormat(" Hora Estimada Servidor: %s\r ",TimeToString(calculated_server_time,TIME_MINUTES|TIME_SECONDS)); //--- mostramos los valores de todos los contadores en el gráfico Comment(com); }

Paso a Paso del Código OnTimer()

  1. Variables Estáticas (static): Las tres primeras variables se declaran como static. Esto es clave. Una variable estática dentro de una función mantiene su valor entre llamadas sucesivas. Es la "memoria" de nuestro EA. Sin esto, start_time se reiniciaría a cero en cada llamada.
  2. Obtención de Tiempos: En cada llamada, el EA obtiene la hora local actual (TimeLocal()) y la hora del servidor (TimeTradeServer()).
  3. Inicialización Única: El bloque if(start_tradeserver_time==0) se ejecuta solo una vez, en la primera llamada a OnTimer(). Aquí, se captura la hora inicial del servidor y se establece como punto de partida para nuestro cálculo.
  4. El Contador: En todas las llamadas posteriores (el bloque else), la variable calculated_server_time simplemente se incrementa en 1. Como el temporizador se ejecuta cada segundo, estamos, en efecto, creando nuestro propio reloj.
  5. Visualización: La función Comment() se utiliza para mostrar en la esquina superior izquierda del gráfico la comparación entre la hora real del servidor y la hora que hemos calculado con nuestro temporizador, demostrando la precisión y regularidad de OnTimer().

OnTimer vs. OnTick: ¿Cuándo Usar Cada Uno?

La elección entre estos dos manejadores de eventos es una decisión estratégica fundamental al diseñar un EA. No hay uno mejor que otro; son herramientas diferentes para trabajos diferentes.

CaracterísticaOnTick()OnTimer()
DisparadorCada nuevo tick de precio que llega del broker.Intervalo de tiempo fijo definido por el programador.
FrecuenciaIrregular y dependiente de la volatilidad del mercado. Puede ser varias veces por segundo o ninguna en minutos.Constante y predecible (ej. cada segundo, cada minuto).
Caso de Uso IdealEstrategias de scalping que necesitan reaccionar instantáneamente al más mínimo cambio de precio.Estrategias que operan en velas cerradas, que necesitan realizar tareas de mantenimiento, o que no requieren reacción inmediata.
Consumo de CPUPotencialmente alto en mercados muy activos.Controlado y predecible, generalmente más bajo y eficiente.
ControlBajo. Dependemos de la frecuencia con que el broker envía ticks.Total. Nosotros definimos el ritmo de ejecución.

Consideraciones Avanzadas y de Rendimiento

  • Temporizadores de Alta Resolución: Si necesitas una frecuencia mayor a una vez por segundo, MQL5 ofrece EventSetMillisecondTimer(milliseconds). Esto permite crear temporizadores que se ejecutan cada milisegundo. Sin embargo, ten cuidado: intervalos muy cortos pueden afectar drásticamente el rendimiento, especialmente durante el backtesting, ya que el número de eventos a procesar se multiplica enormemente.
  • Límites del Hardware: Aunque puedas solicitar un temporizador de 1 milisegundo, el hardware y el sistema operativo tienen limitaciones. En tiempo real, no esperes eventos con una frecuencia mayor a una vez cada 10-16 milisegundos.
  • La Cola de Eventos: Cada EA tiene su propia cola de eventos. Si OnTimer() está ocupado ejecutando una tarea larga y llega un nuevo evento de temporizador, este nuevo evento no se añadirá a la cola. Se descarta. Esto previene un atasco de eventos, pero significa que tu lógica debe ser lo más rápida y eficiente posible para no perder "pulsos".

Preguntas Frecuentes (FAQ)

¿Puedo tener varios temporizadores en un solo Expert Advisor?

No. Un programa MQL5 (sea un EA, un indicador o un script) solo puede tener un único temporizador activo a la vez. Si llamas a EventSetTimer() o EventSetMillisecondTimer() de nuevo, simplemente se reiniciará el temporizador existente con el nuevo intervalo.

¿Qué sucede si olvido llamar a EventKillTimer() en OnDeinit()?

El terminal MetaTrader 5 es lo suficientemente inteligente como para destruir automáticamente el temporizador cuando el programa se detiene. Sin embargo, es considerado una muy buena práctica de programación incluir explícitamente EventKillTimer() para asegurar un cierre limpio y ordenado de tu EA.

¿Cuál es un buen intervalo de tiempo para mi estrategia?

Depende enteramente de tu lógica de trading. Si tu estrategia se basa en el cierre de velas de 1 hora, no tiene sentido ejecutar el temporizador cada segundo. Un intervalo de 60 segundos (EventSetTimer(60)) sería mucho más eficiente. Si, por otro lado, gestionas una cuadrícula de órdenes y necesitas verificar las distancias cada pocos segundos, un intervalo corto es apropiado. Adapta siempre el temporizador a las necesidades de tu estrategia.

Conclusión: El Director de Orquesta de tu EA

Dominar la función OnTimer() es como pasar de ser un simple soldado que reacciona a los ataques a convertirte en un general que planifica sus movimientos con una visión estratégica del campo de batalla. Te permite desacoplar la lógica de tu EA del ruido del mercado, imponiendo tu propio ritmo y ejecutando acciones de manera deliberada y eficiente. Ya sea para realizar comprobaciones periódicas, gestionar operaciones a largo plazo o simplemente para organizar mejor tu código, OnTimer() es una herramienta indispensable en el arsenal de cualquier programador de MQL5 serio. Dale un corazón a tu robot y observa cómo ejecuta tu estrategia con la disciplina y precisión de un campeón.

Si quieres conocer otros artículos parecidos a OnTimer en MQL5: El Corazón de tu Robot puedes visitar la categoría Juegos.

Subir