Errores, fallos, preguntas - página 2777

 
Alain Verleyen:

Actualización :

El pico máximo ha aumentado considerablemente:

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Número = 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

En aras de la pureza del experimento, este script debe ejecutarse en paralelo en varios gráficos y varios terminales. Luego compara el tiempo de los cuelgues.

 
Stanislav Korotky :

Para el experimento, ejecute este script en paralelo en varios gráficos y varios terminales. Luego compara el tiempo de hipo.

Vale, pero si ya ocurría con 1 gráfico, no mejorará con varios gráficos.

¿Qué más te daría ejecutarlo en múltiples gráficos/terminales?

 
Alain Verleyen:

De acuerdo, pero si ya ha ocurrido con 1 gráfico, no mejorará con varios gráficos.

¿Qué le aportará más ejecutarlo en múltiples gráficos/terminales?

Si es igual en diferentes terminales, entonces el problema está en el plano del SO.

 
Stanislav Korotky :

Si esto es igual en diferentes terminales, entonces el problema está en el SO.

Lo tengo. Lo intentaré.
 
Stanislav Korotky :

Para el experimento, ejecute este script en paralelo en varios gráficos y varios terminales. Luego, compara los tiempos de rastreo.

Otro Terminal, pero 20 gráficos (diferentes símbolos), se iniciaron simultáneamente.

He comprobado en el AUDUSD dónde viene el pico:

2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Número = 240
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Max = 2235
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Avg = 472
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Avg = 240
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Max = 2323
2020.06.06.13 09: 16: 35.152 342152 (CADCHF, H1) Cantidad = 606
2020.06.13 09: 16: 35.152 342152 (EURAUD, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Min = 141
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Min = 47
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Min. = 23
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Max = 2368
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Avg = 607
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Min = 74
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (USDCHF, H1) Avg = 240
2020.06.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Min = 122
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Max = 2402
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 660
2020.06.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Min = 157
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Max = 2354
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Avg = 663
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Max = 2380
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Avg = 616
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Max = 2327
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Avg = 618
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Max = 2233
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Avg = 503
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1)13 09: 16: 35.152 342152 (CHFJPY, H1) Max = 2387
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Avg = 657
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Max = 2292
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Avg = 612
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Cantidad = 240
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Max = 2361
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Avg = 612
2020.06.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Min = 121
2020.06.13 09: 16: 35.152 342152 (EURCAD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Max = 2328
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 605
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Max = 2361
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Avg = 611
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Max = 2411
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 661
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 240
2020.06.13 09: 16: 35.13 09: 16: 35.153 342152 (GBPUSD, H1) Min = 113
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Max = 2362
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 667
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Cantidad = 240
2020.06.06.13 09: 16: 35.153 342152 (USDCAD, H1) Min = 151
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Max = 2386
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Min = 35
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Avg = 671
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Max = 2233
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Avg = 478
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Cantidad = 240
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Min = 10
2020.06.06.13 09: 16: 35.153 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Max = 2384
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Avg = 658
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Min = 32
2020.06.06.13 09: 16: 35.153 342152 (USDCHF, H1) Max = 2369
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Avg = 614
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Max = 2344
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Avg = 658

Y aquí es cuando entran las tapas:

2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Avg = 480
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Max = 17421
2020.06.06.13 09: 17: 35.151 342152 (USDJPY, H1) Avg = 533
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Cantidad = 480
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Min = 35
2020.06.06.13 09: 17: 35.151 342152 (EURAUD, H1) Max = 17406
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Avg = 518
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Cantidad = 480
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Max = 17425
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Avg = 515
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Cantidad = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Min = 18
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Max = 17366
2020.06.13 09: 17: 35.151 342152 (EURCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Avg = 618
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (USDCHF, H1) Cantidad = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Min = 126
2020.06.13 09: 17: 35.151 342152 (CADCHF, H1) Cantidad = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 10477
2020.06.13 09: 17: 35.151 342152 (EURCAD, H1) Cantidad = 480
2020.06.13 09: 17: 35.151 342152 (GBPUSD, H1) Cantidad = 480
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Min = 112
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Max = 10485
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Max = 10435
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Avg = 661
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Min = 71
2020.06.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Avg = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Min = 10
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Max = 10487
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664.13 09: 17: 35.152 342152 (EURNZD, H1) Cantidad = 480
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Max = 17426
2020.06.06.13 09: 17: 35.152 342152 (EURNZD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Max = 17427
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Avg = 649
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Max = 480
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Max = 17433
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Avg = 647
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Min = 480
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Min. = 47
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Max = 17415
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Avg = 640
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Max = 17435
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Avg = 637
2020.06.13 09: 17: 35.152 342152 (AUDCHF, H1) Avg = 662
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Cantidad = 480
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Min = 43
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Max = 17416
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Cantidad = 480
2020.06.13 09: 17: 35.13 09: 17: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Max = 10468
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Avg = 660
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Cantidad = 480
2020.06.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Max = 10474
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Cantidad = 480
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Min = 61
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Max = 10491
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Max = 17414
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Avg = 646
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Max = 480
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Min = 100
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Max = 17421
2020.06.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Avg = 638
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Max = 10488
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Avg = 666
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Avg = 656

Así que todo ocurrió al mismo tiempo. Pero esto podría ser un problema de MT5. Lo comprobaré con otros terminales simultáneos.

 
Stanislav Korotky:

Si es igual en diferentes terminales, entonces el problema está en el plano del SO.

El problema no está en el sistema operativo, sino en MT.
Lo he comprobado en MT5 (build 2009) - todo vuela, el tiempo de ejecución es inferior a 5 ms
Mientras que en MT5 (build 2485) - todo se ralentiza, el tiempo de ejecución a menudo supera los 200 ms (especialmente cuando hay más de 50 gráficos abiertos)
He utilizado el código de la descripción del problema:https://www.mql5.com/en/forum/342152

He comparado la realización de la función ChartGetInteger para dos versiones de MT5 2009 y MT5 2485, tal vez ahí esté el problema:
1. En 2485 para la lectura de los campos "atómicos" de un objeto gráfico se utilizan operaciones bastante lentas:
mfence; lock mov eax,[rax+2C];
Mientras que en la compilación 2009 se hace utilizando: lock xadd [rcx+2C],eax

2. También parece que la lógica y el posible tiempo de permanencia en ntdll_RtlEnterCriticalSection han cambiado significativamente.
Anteriormente, en 2009, una sección crítica sólo comprobaba un par de valores recibidos, sin ninguna operación atómica.
Y en el 2485, los objetos de la lista vinculada del gráfico podrían ser enumerados adicionalmente.


Es de suponer que el problema pudo ocurrir cuando se solucionó el fallo al trabajar con funciones de gráfico como parte de la migración al nuevo compilador (hace unos 2-3 meses).
Se adjunta el código del ensamblador para la llamada a ChartGetInteger en MT5 (build 2485).

 
Sergey Dzyublik :

El problema no está en el sistema operativo, sino en MT.
Lo he comprobado en MT5 (build 2009) - todo vuela, el tiempo de ejecución es inferior a 5 ms
Mientras que en MT5 (build 2485) - todo se ralentiza, el tiempo de ejecución a menudo supera los 200 ms (especialmente cuando se abren más de 50 gráficos)
Se ha utilizado el código de la descripción del problema: https://www.mql5.com/en/forum/342152

He comparado la realización de la función ChartGetInteger para dos versiones de MT5 2009 y MT5 2485, quizás ahí esté el problema:
1. En 2485 para la lectura de los campos "atómicos" de un objeto gráfico se utilizan operaciones bastante lentas:
mfence; lock mov eax,[rax+2C];
Mientras que en la compilación 2009 se hace utilizando: lock xadd [rcx+2C],eax

2. También parece que la lógica y el posible tiempo de permanencia en ntdll_RtlEnterCriticalSection han cambiado significativamente.
Anteriormente, en 2009, una sección crítica sólo comprobaba un par de valores recibidos, sin ninguna operación atómica.
Y en 2485, los objetos de la lista vinculada del gráfico podrían ser enumerados adicionalmente.


Es de suponer que el problema pudo ocurrir cuando se solucionó el fallo al trabajar con funciones de gráfico como parte de la migración al nuevo compilador (hace unos 2-3 meses).
Se adjunta el código del ensamblador para la llamada a ChartGetInteger en MT5 (build 2485).

Las builds oficiales fueron 2005 Build y luego 2085 Build, ¿tienes alguna? Sólo tengo la versión 2007.
 
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 general, es mejor no tocar algo que ya funciona de forma estable.

Ilyas:

Asumiré que el pico está renderizando el 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) toma 0.13 milisegundos.

Estoy más acostumbrado a hablar en código.
Yo, por ejemplo, he esbozado un indicador de este tipo:


ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR, 0) se ejecuta cuando el ratón se mueve;
el gráfico rojo es la estadística del tiempo de ejecución de esta función.
Una simple consulta de un dígito es mucho más lenta que la función BildChart, que limpia toda la pantalla, forma un gráfico de varios miles de líneas, dibuja una escala, forma un bloque de información de texto y lo muestra todo en la pantalla.

Toda la charla académica sobre cómo debería ser así debido a la sincronización-asincronía se percibe como "lo blanco es lo negro".
Con un conjunto completo de cotizaciones, no tendré ningún problema en crear mi propio gráfico independiente basado en el kanvas y tener una tabla completa de características de ese gráfico, a la que se puede acceder en cuestión de nanosegundos. Y con ello el kanvas del gráfico se renderizará en un hilo diferente.

Archivos adjuntos:
 
Me quedé mudo durante mucho tiempo, sin entender qué es lo que no le gusta al compilador en esta línea.
  else (Type != -1) // expression has no effect

Olvidé escribir si. He pensado que sería una buena idea explicar el mensaje a esos imbéciles.

 
Nikolai Semko:

Una simple consulta de un solo dígito es muchas veces más lenta que la función BildChart, que borra toda la pantalla, forma un gráfico de varios miles de líneas, dibuja una escala, forma un bloque de información de texto y lo emite todo en la pantalla.

Por lo que sé, llamar a ChartRedraw no provoca el redibujado inmediato del gráfico. Sólo cuando se llama a algún método Get se produce el redibujado.
Y ChartRedraw es esencialmente el mismo método asíncrono, por lo que su medida de BuildChart no es fiable.