Errores, fallos, preguntas - página 2776

 
Ilyas:

Esto no es un error, es el coste de una orden de sincronización a un gráfico

¿Por qué se necesita un comando a un gráfico para quitarle características? ¿No hay una tabla de características de todos los gráficos en la memoria, de la que simplemente se pueden tomar datos en nanosegundos en lugar de milisegundos (¡ni siquiera microsegundos!)
Está claro que las funciones ChartSetInteger, ChartSetDouble, ChartSetString son asíncronas.
¿Pero por qué las funciones ChartGetInteger, ChartGetDouble, ChartGetString se comportan como asíncronas en términos de velocidad de ejecución cuando son síncronas?

Si dicha tabla no existe en memoria y estas funciones necesitan ralentizar el gráfico cada vez para que genere el parámetro solicitado, entonces no entiendo nada.
No es caro tener una tabla de este tipo y mantenerla al día. En realidad, unos pocos kilobytes de memoria y una pequeña fracción de microsegundo para actualizar la tabla cuando cambian las características del gráfico.
Ilyas, por favor dime, ¿qué me estoy perdiendo?

 
Nikolai Semko:

¿Pero por qué entonces las funciones ChartGetInteger, ChartGetDouble, ChartGetString se comportan como asíncronas en términos de velocidad de ejecución, cuando son síncronas?

Tienes una comprensión incorrecta de los términos asíncrono y síncrono.
Cuando se dice que una función es asíncrona, significa que no se ejecutará en el hilo de ejecución actual, sino en algún otro hilo, uno paralelo.

La función es asíncrona - significa que la función no espera a que se ejecute el comando puesto en cola con éxito en el gráfico especificado, sino que devuelve inmediatamente el control.
La propiedad cambiará sólo después de que el comando haya sido procesado en la cola del gráfico.
LafunciónChartRedrawdebe ser llamada para ejecutar inmediatamente los comandos en la cola del gráfico.

Llamar a una función asíncrona como ChartSetInteger desde el hilo principal es rápido ya que la ejecución real tiene lugar en otro hilo.


Por otro lado, llamar a la función sincrónica ChartGetInteger requerirá la sincronización de hilos y esto puede requerir tiempo adicional.
El retraso es especialmente notable cuando el hilo paralelo está actualizando constantemente los datos de la estructura del gráfico (por ejemplo, cuando el usuario mueve la ventana del gráfico o se desplaza por el historial).
Lo más probable es que, por simplicidad y fiabilidad, se utilice un objeto de sincronización para su estructura de datos del gráfico.
Puedes intentar mejorar la velocidad de ejecución utilizando la "segmentación de datos", pero por otro lado ahora puedes encontrarte con bloqueos, o datos poco actualizados, o ralentizaciones en otros lugares más críticos.
En general, es mejor no tocar algo que ya funciona bien.

 
Sergey Dzyublik :

Tienes un malentendido de los términos asíncrono y síncrono.
Cuando se dice que una función es asíncrona, significa que se ejecutará no en el hilo de ejecución actual, sino en algún otro hilo.

Llamar a una función asíncrona como ChartSetInteger desde el hilo principal es rápido ya que la ejecución real ocurre en un hilo diferente.


Por otro lado, una llamada de una función sincrónica ChartGetInteger requerirá la sincronización de hilos y esto puede requerir tiempo adicional.
Los retrasos son especialmente notables cuando el hilo paralelo está actualizando constantemente los datos de la estructura del gráfico (por ejemplo, cuando el usuario mueve la ventana del gráfico o se desplaza por el historial).
Lo más probable es que, por simplicidad y fiabilidad, se utilice un único objeto de sincronización para su estructura de datos del gráfico.
Puedes intentar mejorar la velocidad de ejecución utilizando la "segmentación de datos", pero por otro lado ahora puedes encontrarte con bloqueos, o datos poco actualizados, o ralentizaciones en otros lugares más críticos.
En definitiva, es mejor no tocar algo que ya funciona de forma estable.

Tienes razón, pero parece que hay algunos cuellos de botella. El mercado está ahora cerrado, he ejecutado el código de abajo en 1 gráfico, nada más funciona. Se está ejecutando en un VPS con sólo MT5 corriendo y no he interactuado con el gráfico / MT5 con nada más que una captura de pantalla. Tiempo en µs, 127 µs de media, pero el pico es de 43.995 µs.


Archivos adjuntos:
342152.mq5  5 kb
 

¡Caballeros desarrolladores!

Por favor, corregidme si he escrito en el hilo equivocado. Hay sugerencias para facilitar el uso y la depuración, que creo que serán útiles para muchos, y para mí son importantes.


1. Aumentar la longitud de la línea OBJPROP_TOOLTIP para los objetos (2 veces es suficiente). Para las estrategias con muchos gráficos, la longitud actual es muy corta. Para la depuración, hay que dedicar tiempo cada vez para encajar todos los datos necesarios. Luego hay que cambiar y/o añadir reducciones para los consumidores de forma regular.


2. Aumente la longitud de los comentarios a los nombres de los parámetros de entrada (2 veces es suficiente). Los comentarios a los parámetros de entrada son necesarios para el consumidor. Y si hay un número grande, también es conveniente hacer una numeración adicional. Para la optimización, es importante conocer el nombre de la variable. Por ello, a menudo no es posible encajar todo en la longitud actual. Ejemplo:


3. Variar la selección de columnas en la tabla de resultados de optimización hasta mostrar todo lo deENUM_STATISTICS y dejar que el usuario elija lo que necesita. Esta es una elecciónmuy pobre para el análisis. La reducción en % es inútil durante la optimización con un volumen fijo. No existe la posibilidad de elegir la disposición máxima en términos de moneda y depósito. A veces hay un fuerte sesgo entre las posiciones de compra y de venta durante la optimización, pero sólo se puede saber después de ejecutar una sola prueba. A menudo tenemos que introducir los parámetros que faltan en el campo de resultados(STAT_CUSTOM_ONTESTER). Pero queremos mostrar criterios de resultados adicionales allí, y es posible mostrar sólo uno, lo que aún podríamos soportar, si hubiéramos variado el número de columnas de criterios estándar deENUM_STATISTICS. En definitiva, tengo que dedicar mucho tiempo extra a la sobreoptimización y al análisis.

Gracias.

 
Alain Verleyen:

Tienes razón, pero parece que hay algunos cuellos de botella. El mercado está ahora cerrado, he ejecutado el siguiente código en 1 gráfico, nada más funciona. Se está ejecutando en un VPS con sólo MT5 corriendo, y no he interactuado con el gráfico / MT5 con nada más que una captura de pantalla. El tiempo está en µs, 127 µs de media, pero el pico es de 43.995 µs.

Voy a suponer que el pico es la representación del comentario del gráfico, de lo contrario, cuando la cola del gráfico está vacía, la llamada a la función ChartGetXXX (nótese la llamada con sincronización) tarda 0,13 milisegundos

 
Sergey Dzyublik:

Tienes un malentendido de los términos asíncrono y síncrono.
Cuando se dice que una función es asíncrona, significa que se ejecutará no en el hilo de ejecución actual, sino en algún otro hilo.

Llamar a una función asíncrona como ChartSetInteger desde el hilo principal es rápido ya que la ejecución real ocurre en un hilo diferente.


Por otro lado, una llamada de una función sincrónica ChartGetInteger requerirá la sincronización de los hilos y esto puede requerir tiempo adicional.
El retraso es especialmente notable cuando el hilo paralelo está actualizando constantemente los datos de la estructura del gráfico (por ejemplo, cuando el usuario mueve la ventana del gráfico o se desplaza por el historial).
Lo más probable es que, por simplicidad y fiabilidad, se utilice un único objeto de sincronización para su estructura de datos del gráfico.
Puedes intentar mejorar la velocidad de ejecución utilizando la "segmentación de datos", pero por otro lado ahora puedes encontrarte con bloqueos, o datos poco actualizados, o ralentizaciones en otras áreas más críticas.
En general, es mejor no tocar algo que ya funciona bien.

Así es, para acelerar el procesamiento de los comandos sincrónicos hay que cambiar la arquitectura (GUI en particular), es la que da más carga/tiempo al bloquear el gráfico para su renderización.
 
Un comportamiento interesante.
Si se pulsa el botón PrtScr y se mueve la ventana del gráfico, se producen horribles retrasos de hasta 5 segundos.
Sin embargo, si sólo toma una captura de pantalla de la ventana del programa terminal.exe con ALT + PrtScr, no hay ningún retraso.
 
Ilyas:
TERMINAL_GUI_ON/OFF

A juzgar por el servicio VPS incorporado, hay algo de experiencia.

 
Ilyas :

Voy a suponer que el pico es la representación del comentario del gráfico, de lo contrario, cuando la cola del gráfico está vacía, la llamada a la función ChartGetXXX (nota, la llamada con sincronización) tarda 0,13 milisegundos

No, Ilyas, parece que no hay comentarios de la carta. Usaré los registros y los publicaré.

Editar: Aquí está el resultado, ninguna interacción con el gráfico o MT5 o Windows, después de ejecutarlo, excepto para copiar los registros. Sólo 1 gráfico, sin ningún otro software que se ejecute en el sistema. El pico es menor, pero sigue siendo muy importante en comparación con la media. (µs)

2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Número = 7440
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Mínimo = 37
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Máximo = 17776
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Promedio = 147

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д. Значение...
 
Alain Verleyen :

No, Ilyas, parece que no hay comentarios sobre el gráfico. Utilizaré los registros y los publicaré.

Editar: Aquí está el resultado, ninguna interacción con el gráfico o MT5 o Windows, una vez iniciado, excepto para copiar los registros. Sólo 1 gráfico, sin ningún otro software que se ejecute en el sistema. El pico es menor, pero sigue siendo muy importante en comparación con la media. (µs)

2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Número = 7440
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Mínimo = 37
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Máximo = 17776
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Promedio = 147

Actualización :

El pico máximo ha aumentado considerablemente:

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Max = 23520
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Min = 33
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Max = 81011
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Avg = 149

Razón de la queja: