- Activar y desactivar temporizador
- Evento temporizador: OnTimer
- Temporizador de alta precisión: EventSetMillisecondTimer
Temporizador de alta precisión: EventSetMillisecondTimer
Si su programa requiere que el temporizador se active con una frecuencia superior a 1 segundo, en lugar de EventSetTimer utilice la función EventSetMillisecondTimer.
Los temporizadores con unidades diferentes no pueden iniciarse al mismo tiempo: debe utilizarse una función u otra. El tipo de temporizador que se ejecuta en realidad viene determinado por la función a la que se llamó posteriormente. Todas las características inherentes al temporizador estándar siguen siendo válidas para el temporizador de alta precisión.
bool EventSetMillisecondTimer(int milliseconds)
La función indica al terminal cliente que es necesario generar eventos de temporizador para este Asesor Experto o indicador con una frecuencia inferior a un segundo. La periodicidad se fija en milisegundos (parámetro milliseconds).
La función devuelve un signo de éxito (true) o de error (false).
Cuando trabaje en el probador de estrategias, tenga en cuenta que, cuanto más corto sea el periodo del temporizador, más tiempo requerirá la prueba, ya que aumenta el número de llamadas al manejador de eventos del temporizador.
Durante el funcionamiento normal, los eventos del temporizador no se generan más de una vez cada 10-16 milisegundos, lo que se debe a limitaciones del hardware.
Para demostrar cómo trabajar con el temporizador de milisegundos, ampliemos el ejemplo del indicador MultipleTimers.mq5. Dado que la activación del temporizador global se deja al programa de aplicación, podemos cambiar fácilmente el tipo del temporizador, dejando las clases lógicas de temporizador sin cambios. La única diferencia será que sus multiplicadores se aplicarán al periodo base en milisegundos que especificaremos en la función EventSetMillisecondTimer.
Para seleccionar el tipo de temporizador, describiremos la enumeración y añadiremos una nueva variable de entrada.
enum TIMER_TYPE
|
Por defecto, utilizamos un segundo temporizador. En OnInit, inicie el temporizador del tipo deseado.
void OnInit()
|
Veamos qué se mostrará en el registro al elegir un temporizador de milisegundos.
// time ms
|
La secuencia de generación de eventos es exactamente la misma que vimos para el segundo temporizador, pero todo sucede mucho más rápido, casi instantáneamente.
Debido a que la precisión del temporizador del sistema está limitada a un par de decenas de milisegundos, el intervalo real entre sucesos supera con creces el inalcanzablemente pequeño espacio de tiempo de 1 milisegundo. Además, hay un diferencial del tamaño de un «paso». Así, incluso cuando se utiliza un temporizador de milisegundos, es conveniente no ceñirse a periodos inferiores a unas pocas decenas de milisegundos.