Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Es cierto. Gracias. No lo recordaba. En realidad no resuelve el problema por completo ya que necesito que las órdenes se ejecuten casi inmediatamente (y creo que con este método sólo puedo comprobarlo cada segundo, pero al menos no cada tick), pero efectivamente puedo construir fácilmente una solución temporal usándolo.
Aunque el OnTimer tiene la tasa más rápida alineada con el reloj del sistema, es decir, cada 15 ms, yo preferiría hacer un bucle en intervalos de 1ms (usando el Sleep(1) en el bucle).
Aunque el OnTimer tiene la tasa más rápida alineada con el reloj del sistema, es decir, cada 15 ms, yo preferiría hacer un bucle en intervalos de 1ms (usando el Sleep(1) en el bucle).
¿No sería eso un problema? Quiero decir, ¿no hay procesos internos en MT4 que puedan necesitar que se ejecute OnTick() para evitar que algún tipo de buffers internos acaben desbordados o sobredimensionados después de semanas de estar ejecutando (el EA) sin parar y sólo en bucle?
Lo pregunto desde la ignorancia, no tengo ni idea de si puede ser un problema, solo asumo que MT4 no fue concebido para ello.
¿Entonces crees(/has probado) que no será un problema? (Si es así, son grandes noticias).
BTW: ¿Cómo consigues que OnTimer() se ejecute por debajo del intervalo de 1 segundo? :?
Yo solía ejecutar EAs en un bucle iniciado en init() hace algunos años, por una razón similar - la lectura de datos externos con un retraso mínimo. Solía correr semanas sin ningún efecto secundario. El Sleep(1) es satisfactorio para que el impacto de la potencia de cálculo sea muy ligero.
La configuración del temporizador acepta milis.
Yo solía ejecutar EAs en un bucle iniciado en init() hace algunos años, por una razón similar - la lectura de datos externos con un retraso mínimo. Solía correr semanas sin ningún efecto secundario. El Sleep(1) es satisfactorio para que el impacto de la potencia de cálculo sea muy ligero.
La configuración del temporizador acepta milis.
BTW: ¿Cómo se consigue que OnTimer() se ejecute por debajo del intervalo de 1 segundo? :?
EventSetMillisecondTimer
La función indica al terminal cliente que los eventos del temporizador deben ser generados en intervalos menores a un segundo para este Asesor Experto o indicador.
boolEventSetMillisecondTimer(
intmilliseconds// número de milisegundos
);
Parámetros
milisegundos
[in] Número de milisegundos que definen la frecuencia de los eventos del temporizador.
Valor devuelto
En caso de ejecución exitosa, devuelve true, de lo contrario - false. Para recibir un código de error, se debe llamar a la función GetLastError().
Nota
Esta función está diseñada para los casos en que serequiere un temporizador de alta resolución. Enotras palabras , loseventos del temporizador deben recibirse con más frecuencia que una vez por segundo. Si un temporizador convencional con el período de varios segundos es suficiente para usted, utilice EventSetTimer().
Usualmente, esta función debe ser llamada desde la función OnInit() o en el constructor de la clase. Para manejar los eventos provenientes del temporizador, un Asesor Experto o un indicador debe tener la función OnTimer() .
Cada Asesor Experto y cada indicador trabajan con su propio temporizador recibiendo eventos únicamente de este temporizador. Durante el cierre de la aplicación mql4, el temporizador se destruye forzosamente en caso de que haya sido creado pero no haya sido desactivado por la función EventKillTimer().
Sólo se puede lanzar un temporizador por cada programa. Cada aplicación mql4 y el gráfico tienen su propia cola de eventos donde se colocan todos los eventos recién llegados. Si la cola ya contiene el evento Timer o este evento está en la etapa de procesamiento, entonces el nuevo evento Timer no se añade a la cola de la aplicación mql4.
EventSetMillisecondTimer
La función indica al terminal del cliente que se generen eventos de temporizador a intervalos inferiores a un segundo para este Asesor Experto o indicador.
boolEventSetMillisecondTimer(
intmilliseconds// número de milisegundos
);
Parámetros
milisegundos
[in] Número de milisegundos que definen la frecuencia de los eventos del temporizador.
Valor devuelto
En caso de ejecución exitosa, devuelve true, en caso contrario - false. Para recibir un código de error, se debe llamar a la función GetLastError().
Nota
Esta función está diseñada para los casos en que se requiere un temporizador de alta resolución. Enotras palabras , loseventos del temporizador deben recibirse con más frecuencia que una vez por segundo. Si un temporizador convencional con un periodo de varios segundos es suficiente para usted, utilice EventSetTimer().
Normalmente, esta función debe ser llamada desde la función OnInit() o en el constructor de la clase. Para manejar los eventos provenientes del temporizador, un Asesor Experto o un indicador debe tener la función OnTimer() .
Cada Asesor Experto y cada indicador trabajan con su propio temporizador recibiendo eventos únicamente de este temporizador.Durante el cierre de la aplicación mql4, el temporizador se destruye forzosamente en caso de que haya sido creado pero no haya sido desactivado por la función EventKillTimer().
Sólo se puede lanzar un temporizador por cada programa. Cada aplicación mql4 y cada gráfico tienen su propia cola de eventos donde se colocan todos los eventos recién llegados. Si la cola ya contiene el evento Timer o este evento está en la etapa de procesamiento, entonces el nuevo evento Timer no se añade a la cola de mql4application.
Gracias por la explicación detallada; es culpa mía; lo leí demasiado rápido en Internet. (Los enlaces han intercambiado el dominio docs.mql4.com con forum.mql4.com. Por si acaso alguien más revisa este hilo...)
EDIT: Voy a aprovechar que hay un moderador por aquí: ¿Sabéis si existe alguna diferencia entre ejecutar OnTimer() cada N milisegundos y hacer el mismo bucle cada N milisegundos como se ha descrito en posts anteriores?
No veo por qué todo el alboroto con la temporización en "ms". A menos que se trate de algún tipo de "escalador de noticias de alta frecuencia" en una conexión de broker de muy baja latencia, los intervalos de un segundo en OnTimer() deberían ser más que suficientes como tiempo de respuesta.
Si se añaden todos los retrasos y la latencia de la ejecución de la aplicación JAVA, la comunicación IPC (LAN y WAN), la ejecución de la gestión de órdenes y la latencia del servidor Broker, no hay ninguna ventaja real en el uso de la temporización en "ms" para las estrategias normales.
Sin embargo, si se trata de algún tipo de "escalador de noticias de alta frecuencia", que se utilizará en un VPS con una conexión de baja latencia al corredor, entonces usted no debe estar jugando con JAVA y IPC en absoluto, y debe ser la codificación de la estrategia directamente en MQL muy compacto para obtener la menor latencia posible.
EDITAR:
EDIT: Voy a aprovechar que hay un moderador por aquí: ¿Sabéis si existe alguna diferencia entre ejecutar OnTimer() cada N milisegundos y hacer el mismo bucle cada N milisegundos como se describe en los posts anteriores?
El hecho de que sea moderador no significa que tenga más conocimientos que los demás. De hecho, los demás participantes en este hilo tienen obviamente más conocimientos que yo sobre el tema. Yo no sé nada de Java.
No entiendo el sentido de usar Sleep() en un evento de temporizador ya que pone al EA en espera y esto podría significar perder muchos eventos OnTick(). Por supuesto, dependiendo del EA, los eventos OnTick pueden no ser importantes.
Yo solía ejecutar EAs en un bucle iniciado en init() hace algunos años, por una razón similar - la lectura de datos externos con un retraso mínimo. Solía correr semanas sin ningún efecto secundario. El Sleep(1) es satisfactorio para que el impacto de la potencia de cálculo sea muy ligero.
Para un poco de diversión... el siguiente script acepta múltiples conexiones TCP/IP concurrentes, y escribe los mensajes entrantes delimitados por CR en el registro de Expertos. Por ejemplo, una vez que el script se está ejecutando puedes conectarte vía Telnet (al puerto 51234 por defecto), y cada línea de texto que escribas se imprimirá.
Para divertirse un poco... el siguiente script acepta múltiples conexiones TCP/IP concurrentes, y escribe los mensajes entrantes delimitados por CR en el registro de Expertos.
... diciendo lo obvio, si usted quisiera hacer lo anterior en un EA en lugar de un script, entonces simplemente lo cambiaría como sigue: