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

 
fxsaber:

Sería interesante comparar el mismo script con otras plataformas de trading.

MT4 b1280.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    _B2(OrdersHistoryTotal());
    _B2(OrdersTotal());
    _B2(OrderSelect(0, SELECT_BY_POS));
    _B2(OrderSelect(0, SELECT_BY_POS, MODE_HISTORY));
    _B2(OrderSelect(0, SELECT_BY_TICKET));
        
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
                
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);      
}


2020.08.27 13:09:46.799 Test6 EURUSD,M1: Alert: Time[Test6.mq4 39: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
2020.08.27 13:09:46.790 Test6 EURUSD,M1: Alert: Time[Test6.mq4 18: OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)] = 2 ms.
2020.08.27 13:09:46.784 Test6 EURUSD,H1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.

Sólo tres resbalones y luego muy raramente aparecieron. Probablemente es difícil crear un freno ya que no hay HistorySelect y CopyTicks.

 
Fast235:

por lo que ambos son Haswell, xeon tiene una frecuencia de funcionamiento mucho más baja, habrá una degradación del rendimiento en las pruebas de rendimiento y simple, sólo en la optimización multihilo será una ventaja. El i3 de los últimos modelos debería ser mucho más rápido de ejecutar

pregunte a los desarrolladores sobre el efecto del nivel de caché en la velocidad y, en general, la velocidad de Zen2 y los últimos Intel


añadir

Ryzen 3700x que tengo, puedes hacer pruebas con Intel

por ejemplo con este script MQL5\Scripts\UnitTests\Stat\TestBenchmark.mq5

hacer un bucle varias veces con un temporizador

No estamos hablando de pruebas, sino de retrasos en la ejecución de órdenes. Este retraso está ahí y es flotante. Y eso nos molesta bastante tanto al TS como a mí.

 
fxsaber:

Sólo aparecieron tres cosas y muy pocas veces. Debe ser difícil crear un freno ya que no hay HistorySelect y CopyTicks.

Esperado en MT4 también.

2020.08.27 13:18:00.306 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:17:39.820 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 2 ms.
2020.08.27 13:17:32.598 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 36 ms.
2020.08.27 13:17:29.676 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:17:26.468 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 5 ms.
2020.08.27 13:17:26.460 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 1 ms.
2020.08.27 13:17:14.528 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 3 ms.
2020.08.27 13:16:52.309 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.308 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.307 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 13:16:42.448 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 17: OrderSelect(0,SELECT_BY_POS)] = 2 ms.
2020.08.27 13:16:32.480 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 3 ms.
2020.08.27 13:16:32.479 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 3 ms.
2020.08.27 13:16:32.477 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:16:29.096 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:16:14.593 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 23 ms.
2020.08.27 13:14:55.398 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 1 ms.
2020.08.27 13:13:34.891 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 2 ms.

TimeLocal en 36 milisegundos. Elija un símbolo con un volumen de ticks mayor.

 

Para quien esté interesado, aquí están las instrucciones de reproducción.

Que piensa que no se va a tocar.

2020.08.27 13:17:56.139 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 2 ms.
2020.08.27 13:17:56.167 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 39 ms.
2020.08.27 13:17:56.198 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 54 ms.
2020.08.27 13:18:11.512 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 3 ms.
 
fxsaber:

Escogió un símbolo con un volumen de ticks mayor.

Ni siquiera voy a comprobarlo. Imagine el símbolo más popular de FORTS con una suscripción de garrapatas. En lugar de la lógica OnTick en OnBookEvent. Los retrasos deben ser terribles.

Necesito asesoramiento oficial sobre qué hacer para minimizar los retrasos.

 
fxsaber:

Para reproducir los frenos, es necesario ejecutar el script en múltiples caracteres de UN carácter - conseguir que OnTick sea llamado al mismo tiempo. Entonces, las alertas se activarán en cada tic.

El gráfico de carga de la CPU muestra que terminal64.exe carga hasta el 30% de los ocho núcleos lógicos. Son sólo cuatro gráficos de EURUSD con el script en funcionamiento. Puedes ver claramente cuánto se carga cada gráfico a la vez.

¿Adónde van a parar tantos recursos?

Esta pregunta es fácil de responder.

Aquí se copian muchos datos:

    HistorySelect(MathRand(), INT_MAX);

En realidad está dando un comando para tomar todo el historial de operaciones disponible de la base de datos de la terminal en el entorno del EA, para su uso posterior. Está tratando de hacer funcionar a propósito un posible algoritmo de almacenamiento en caché de peticiones idénticas.

Pero no se utilizan todos estos datos, sino que se restablecen inmediatamente en la línea siguiente:

    _B2(HistorySelect(Tick.time, INT_MAX));

Obviamente, la base del terminal es aquí un recurso compartido con acceso sincronizado. Y usted ha creado deliberadamente miles de pedidos y tratos en él.

Toda esta acción sin sentido se repite 10 veces con cada tic de varios hilos a la vez. Y estás haciendo deliberadamente que estas acciones ocurran simultáneamente desde varios hilos.

Así que usted sabe muy bien lo que está haciendo y por qué, dónde se gastan los recursos, y al mismo tiempo afirma que "el retraso se debe a la excesiva carga de la CPU por parte de MT5".

Dicho esto, está claro que tienes un problema con tu ordenador. Es decir, sí, está moviendo activamente cantidades significativas de memoria, pero no debería afectar al tiempo de ejecución de las funciones, especialmente las no relacionadas con HistorySelect() de ninguna manera.

En nuestras pruebas b2582, incluso con 1000 veces por tick y 5 EAs en gráficos de un carácter, es decir, órdenes de magnitud mayores que sus condiciones por defecto, no se observó ni una sola Alerta.

Nuestro sistema de prueba: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

 
Anton:

Esta pregunta es fácil de responder.

Aquí es donde se copian muchos datos:

En realidad está dando un comando para tomar todo el historial de operaciones disponible de la base de datos de la terminal en el entorno del EA, para su uso posterior. Intentar aleatoriamente perturbar el posible algoritmo de almacenamiento en caché de peticiones idénticas.

Pero no se utilizan todos estos datos, sino que se restablecen inmediatamente en la línea siguiente:

Obviamente, la base del terminal es aquí un recurso compartido con acceso sincronizado. Y usted ha creado deliberadamente miles de pedidos y tratos en él.

Toda esta acción sin sentido se repite 10 veces con cada tic de varios hilos a la vez. Y estás haciendo deliberadamente que estas acciones ocurran simultáneamente desde varios hilos.

Así que usted sabe muy bien lo que está haciendo y por qué, dónde se gastan los recursos, y al mismo tiempo afirma que "el retraso se debe a la excesiva carga de la CPU por parte de MT5".

Dicho esto, está claro que tienes un problema con tu ordenador. Es decir, sí, está moviendo activamente cantidades significativas de memoria, pero no debería afectar al tiempo de ejecución de las funciones, especialmente las no relacionadas con HistorySelect() de ninguna manera.

En nuestras pruebas b2582, incluso con 1000 veces por tick y 5 EAs en gráficos de un carácter, es decir, órdenes de magnitud mayores que sus condiciones por defecto, no se observó ni una sola Alerta.

Nuestro sistema de prueba: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz


Colegas,

es hora de que salgas del círculo del modelismo aeronáutico.

Estas son las condiciones de la batalla: 4 terminales, unos 300 Asesores Expertos, unos 30 instrumentos. Un tercio de ellos están abonados a los bombos. Todo esto en FORTS. Simular en estas condiciones.

 
Dmi3:


Colegas,

es hora de que salgas del círculo del modelismo aeronáutico.

Estas son las condiciones de combate: 4 terminales, unos 300 EAs, unos 30 instrumentos. Un tercio de los EA están suscritos a los bombos. Todo esto en FORTS. Simular en estas condiciones.

"Aquí tienes" se acepta como un archivo zip, además de una descripción detallada del problema. De lo contrario, es una conversación vacía.

Lo que se discute aquí es el código del EA presentado y la eficacia de su ejecución. A partir de los problemas detectados, se ha trabajado en la optimización del código del terminal.

 
Anton:

"Aquí tienes" se acepta como un archivo zip, además de una descripción detallada del problema. De lo contrario, es una conversación vacía.

En este caso, la discusión se centra en el código presentado por el EA y la eficiencia de su ejecución. El código del terminal ha sido optimizado para los problemas identificados.

No tengo ningún problema, no hay nada que enviar.

fxsaber tiene problemas, ya escribió 16 páginas aquí.

Y Mikhail tiene los mismos problemas desde 2014, ya ha escrito 149 páginas: https://www.mql5.com/ru/forum/38456/page149.

Ambos están lo suficientemente cualificados para darte toda la información que necesitas.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.08.20
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 
Anton:

Esta pregunta es fácil de responder.

Aquí es donde se copian muchos datos:

En realidad, está dando un comando para tomar todo el historial de operaciones disponible de la base de datos del terminal en el entorno del EA, para su uso posterior. Aleatorizar a propósito tratando de desbaratar el posible algoritmo de almacenamiento en caché de peticiones idénticas.

No has seguido la cronología del desarrollo de este hilo, por lo que te permites notas acusatorias en tus afirmaciones.

He eliminado la línea MathRand. Este es un breve registro.

2020.08.27 22:38:57.920 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 3 ms.
2020.08.27 22:38:57.923 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:38:57.926 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:38:57.928 Alert: Time[Test6.mq5 61: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 22:38:57.940 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 11 ms.
2020.08.27 22:39:02.227 Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 1 ms.
2020.08.27 22:39:02.229 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:39:02.238 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 7 ms.
2020.08.27 22:39:02.241 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 1 ms.
2020.08.27 22:40:34.575 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:40:44.407 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:40:44.409 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 9 ms.
2020.08.27 22:40:46.819 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.
2020.08.27 22:40:52.760 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:40:52.764 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 3 ms.
2020.08.27 22:40:54.907 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:41:11.415 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.27 22:41:13.517 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:41:14.689 Alert: Time[Test6.mq5 18: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:41:45.343 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:42:12.156 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:42:19.654 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:32.581 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:48.662 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:49.754 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:49.756 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:50.803 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:50.804 Alert: Time[Test6.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 1 ms.
2020.08.27 22:42:50.805 Alert: Time[Test6.mq5 44: TimeCurrent()] = 1 ms.
2020.08.27 22:43:42.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.27 22:43:42.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.27 22:43:54.985 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:44:01.402 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:44:01.405 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.


Pero no utilizas todos estos datos, sino que los vuelcas inmediatamente en la siguiente línea:

Obviamente, la base del terminal es aquí un recurso compartido con acceso sincronizado. Y usted ha creado deliberadamente miles de pedidos y tratos en él.

Lo pruebo en cuentas reales donde las órdenes de más de 10K son la norma. No se trata de órdenes falsas, ya que el 70% de ellas se ejecutaron.

En la captura de pantalla, por cierto, 9331+576 != 12529.

Toda esta acción sin sentido se repite 10 veces en cada tic de varios hilos a la vez. Y usted está haciendo deliberadamente que estas acciones de múltiples hilos ocurran simultáneamente.

Estoy teniendo problemas en diferentes personajes. Se sugiere un único símbolo para reproducir el problema más rápidamente.

Repetir 10 veces en cada tic es una necesidad vital. Ya que es normal que un EA contenga una docena de CTs con diferentes especialidades.

Así que sabes muy bien lo que haces y por qué, y a dónde van los recursos, y sin embargo afirmas que "La latencia se debe a la excesiva carga de la CPU por parte de MT5".

Dicho esto, está claro que tienes un problema con tu ordenador. Es decir, sí, estás moviendo activamente cantidades significativas de memoria, pero no debería afectar al tiempo de ejecución de las funciones, especialmente no relacionadas con HistorySelect() de ninguna manera.

No puedo acusarle de incompetencia, pero lo que ha escrito, por decirlo suavemente, causa desconcierto. HistorySelect es el hallazgo de cuatro índices (principio/fin para la tabla de pedidos y principio/fin para la tabla de operaciones). Las tablas están ordenadas por tiempo, por lo que hay (debería haber) una búsqueda binaria en el peor de los casos. Para las órdenes de 10K es instantáneo (calcular el logaritmo binario). ¡Qué movimiento de volumen de memoria! Aquí nadie habla del temido HistorySelectByPosition. El elemental HistorySelect se ve afectado.

En nuestras pruebas b2582, incluso con 1000 veces por tick y 5 EAs en gráficos de un carácter, es decir, órdenes de magnitud mayores que sus condiciones por defecto, no se observa ni una sola Alerta.

Nuestro sistema de prueba: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

Indique aquí los datos de acceso a la cuenta de operaciones en la que se realizaron las pruebas.

Razón de la queja: