MT5 y la velocidad en acción - página 91

 
Anton:

¿Es la norma frenar con ObjectGetInterger?

 
fxsaber:

¿Es la norma frenar con ObjectGetInterger?

Los métodos Get ya son sincrónicos, por lo que esperan. El trabajo con los objetos se realiza a través de una cola de comandos especial, no a través del acceso directo a los objetos.

A título informativo, se recomienda encarecidamente no mezclar los métodos Set y Get. Es mejor pluralizar escribir y luego pluralizar leer. O viceversa.

 
Renat Fatkhullin:

Los métodos Get ya son sincrónicos, por lo que están en espera. Los objetos se manejan mediante una cola de comandos especial, no mediante el acceso directo a los objetos.

A título informativo, no se recomienda mezclar los métodos Set y Get. Es mejor escribir conjunto y luego leer conjunto. O viceversa.

Por desgracia, tengo problemas con ella. Se muestra en el código anterior.

Gracias por las aclaraciones.

 
Lo sacó del camino en ciertas situaciones.

una cuenta real.

2021.03.29 17:18:55.280 TradesID_Example (EURUSD,M1)    HistoryDealsTotal() = 99663
2021.03.29 17:18:55.280 TradesID_Example (EURUSD,M1)    HistoryOrdersTotal() = 174307

2021.03.29 17:24:15.862 TradesID_Example (EURUSD,M1)    GetSumByPositionsID(PositionsID,GetSumByPositionID) = 29906412.60837016
2021.03.29 17:24:15.862 TradesID_Example (EURUSD,M1)    Alert: Bench_Stack = 0, 1 <= Time[GetSumByPositionsID(PositionsID,GetSumByPositionID))] = 320581370 mcs.

2021.03.29 17:24:16.057 TradesID_Example (EURUSD,M1)    GetSumByPositionsID(PositionsID,GetSumByPositionID2) = 29906412.60837016
2021.03.29 17:24:16.057 TradesID_Example (EURUSD,M1)    Alert: Bench_Stack = 0, 1 <= Time[GetSumByPositionsID(PositionsID,GetSumByPositionID2))] = 195526 mcs.
2021.03.29 17:24:16.170 TradesID_Example (EURUSD,M1)    GetSumByPositionsID(PositionsID,GetSumByPositionID2) = 29906412.60837016
2021.03.29 17:24:16.170 TradesID_Example (EURUSD,M1)    Alert: Bench_Stack = 0, 1 <= Time[GetSumByPositionsID(PositionsID,GetSumByPositionID2))] = 112839 mcs.

La biblioteca es ~2500 veces más rápida que la implementación habitual. El único enfoque alternativo permite hacer algunos cálculos en un tiempo razonable.

 

Para forzar al terminal a asignar memoria, puedes ejecutar este script

void OnStart()
  {
   short arr[];
   ArrayResize(arr,INT_MAX);
   ArrayInitialize(arr,0);
   Print(ArraySize(arr));
   Sleep(5000);
  }

Ajuste eltamaño de la matriz al tamaño de su memoria RAM

 
Rorschach:

Para forzar al terminal a asignar memoria, puedes ejecutar este script

Ajuste eltamaño de la matriz al tamaño de su memoria RAM

¿Cuál es la idea?

 
fxsaber:

¿Cuál es la idea?

Al parecer, si el terminal se encuentra en una situación de escasez de memoria, se activan mecanismos internos para liberarla.

 
traveller00:

Aparentemente, si pones el terminal en condiciones de escasez de memoria, los mecanismos internos de liberación de memoria funcionarán.

Sí, el terminal se queda sin memoria y comienza a restablecer los datos en caché

 

Se ha producido una situación atípica. El Asesor Experto realiza una captura de pantalla basada en la señal del indicador y, si los filtros pasan, da una orden para abrir/cerrar posiciones.
El nombre de la captura de pantalla contiene la hora: día, hora y segundo, por ejemplo, CHFJPY_d29_h10_m24_s17. La hora se toma de la función TimeCurrent().

Hay 28 instancias del Asesor Experto que se ejecutan en el terminal. En algún momento, durante 44 minutos, el terminal pareció congelarse y a las 10:27 volvió a funcionar con normalidad. Aquí está la parte del registro del terminal en sí:


No se observan interrupciones de la conexión. La primera entrada para el EURUSD a las 10:27 es el cierre de las 10:14 sl en el historial de transacciones.

A continuación se muestra parte del registro de la EA. Como puede ver en los cuadros rojos superiores, el tiempo de registro y TimeCurrent() que está en el nombre de la captura de pantalla son casi iguales.
Y en los cuadros inferiores, la diferencia es de media hora.


En el símbolo CHFJPY, la formación de una pantalla con la señal de apertura tuvo lugar a las 10:12, mientras que la segunda con la señal se formó a las 10:24. Pero la apertura/cierre y la nueva apertura se produjeron en un minuto, a las 10:27.

De todos modos, esta rareza ocurrió desde las 9:43 hasta las 10:27 :
1) TimeCurrent() funciona y obtiene la hora real del servidor, el Asesor Experto recibe señales correctas del indicador.
2) El registro sólo se escribió a las 10:27. Las capturas de pantalla se escribieron en mi disco duro en la carpeta Archivos a las 10:27, las nuevas órdenes (basadas en señales antiguas) se abrieron a las 10:27.

Tal vez alguien se ha encontrado con esto, ¿cuál podría ser la razón de tales hipo o ralentizaciones? Por favor, indique qué función debe utilizarse para detectar el motivo. Esta situación se ha repetido varias veces desde abril.

 
Vasiliy Pushkaryov:

¿Pueden decirme qué funciones utilizar para detectar la causa?

Controla la discrepancia entre TimeLocal y TimeCurrent.