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

 
Anton:

Código de prueba:

Este código demuestra que el autor no entiende el problema.

Pruébalo.
// Классический SYMBOL_BID vs Альтернативный SYMBOL_BID.
// Запускать только на демо-счетах.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

bool GetPosition( const int Type = OP_BUY )
{
  bool Res = false;
  
  for (int i = PositionsTotal() - 1; (i >= 0) && !Res; i--)
    Res = PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && 
                                  (PositionGetString(POSITION_SYMBOL) == _Symbol);
                                  
  return(Res);
}

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
{
  static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger(POSITION_TICKET) : OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
  
  return(PositionSelectByTicket(Ticket) ? PositionGetDouble(POSITION_PRICE_CURRENT) : 0);
}

#define  TOSTRING(A) ", "#A + " = " + (string)(A)

#define  MACROS(A, B)                                              \
  const ulong StartTime##A = GetMicrosecondCount();               \
  const double A = B;                                             \
  const ulong Interval##A = GetMicrosecondCount() - StartTime##A; \
                                                                  \
  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;  

long TimeBid1 = 0; // Суммарное время на длительный SYMBOL_BID
long TimeBid2 = 0; // Суммарное время на длительный GetBid()

const bool Init = EventSetTimer(10) && GetBid(); // Будем выводить статистику каждый 10 секунд.

void OnTimer()
{
  // На сколько отстает один вариант от другого по времени выполнения.
  Alert(TOSTRING(TimeBid1 - TimeBid2) + " mcs." + TOSTRING(TimeBid1) + TOSTRING(TimeBid2));
}

void OnTick()
{  
  const uint StartTime = GetTickCount();
  
//  return;
  
  while (!IsStopped() && (GetTickCount() - StartTime < 10000))
  {
    MACROS(Bid1, SymbolInfoDouble(_Symbol, SYMBOL_BID))
    MACROS(Bid2, GetBid())
      
//    if (Bid1 != Bid2)
//      Alert("Error!" + TOSTRING(Bid1) + TOSTRING(Bid2));
    
//    Sleep(0); // Специально убрал.
  }
}

Este EA obtiene el precio Bid del símbolo actual de dos maneras. Para cada uno de ellos, suma el tiempo de ejecución de los casos de ejecución larga. Y luego muestra la diferencia entre ambos.


Agentes 6/8 cargados. Y corrió este EA en seis gráficos (diferentes símbolos) enRannForex-Server demo. Resultado.

2020.10.26 16:10:40.596 Test9 (EURNZD,H1)       Alert: , TimeBid1-TimeBid2 = 236507295 mcs., TimeBid1 = 246491044, TimeBid2 = 9983749
2020.10.26 16:10:42.596 Test9 (CAC40,H1)        Alert: , TimeBid1-TimeBid2 = 235249710 mcs., TimeBid1 = 241768964, TimeBid2 = 6519254
2020.10.26 16:10:44.267 Test9 (DAX30,H1)        Alert: , TimeBid1-TimeBid2 = 243552816 mcs., TimeBid1 = 253424672, TimeBid2 = 9871856
2020.10.26 16:10:44.382 Test9 (DJI30,H1)        Alert: , TimeBid1-TimeBid2 = 265778370 mcs., TimeBid1 = 272279313, TimeBid2 = 6500943
2020.10.26 16:10:44.623 Test9 (ASX200,H1)       Alert: , TimeBid1-TimeBid2 = 210921561 mcs., TimeBid1 = 219901110, TimeBid2 = 8979549
2020.10.26 16:10:44.732 Test9 (FTSE100,H1)      Alert: , TimeBid1-TimeBid2 = 226824499 mcs., TimeBid1 = 235809635, TimeBid2 = 8985136

Tenemos una prueba completa de que el tiempo total de ejecución(TimeBid1) de SYMBOL_BID es desastrosamente perdedor (TimeBid2) para la alternativa que obtiene el precio de la oferta.


Esta solución de tipo muleta para obtener los precios actuales supera el rendimiento de la propia función principal de MQL5. ¿Está de acuerdo con esta prueba?


Ojalá hubiera pensado antes en esta elocuente muletilla.


ZZZY El EA tiene que permitir el comercio de algo para trabajar. Por lo tanto, sólo ejecútelo en cuentas de demostración.

 
fxsaber:

Este EA obtiene el precio Bid del símbolo actual de dos maneras.

¿POSITION_PRICE_CURRENT se ha roto?

Entonces, ¿con qué estamos comparando? ¿Obtener el último precio almacenado (cuando?) con obtener el último precio conocido por el terminal?

Bueno y cerca de 6 de 8 núcleos dijeron directamente. ¿Por qué estas pruebas?

 
fxsaber:

Este código demuestra que el autor no entiende el problema.

Tu afirmación demuestra que no quieres ver lo evidente.

Este código muestra que no hay "frenado SymbolInfoTick".

En un hardware más o menos moderno, el tiempo de ejecución de SymbolInfoTick es inferior a 1 MICROSegundo.

Este Asesor Experto obtiene el precio Bid del símbolo actual de dos maneras. Para cada uno de ellos, suma el tiempo de ejecución de los casos de ejecución larga. Y luego muestra la diferencia entre ellos.

Agentes 6/8 cargados. Y corrió este EA en seis gráficos (diferentes símbolos) enRannForex-Server demo. Resultado.

Tenemos una prueba completa de que el tiempo total de ejecución(TimeBid1) de SYMBOL_BID es desastrosamente perdedor (TimeBid2) con respecto a la alternativa que obtiene el precio de la oferta.

Esta solución de tipo muleta para obtener los precios actuales supera el rendimiento de la propia función principal de MQL5. ¿Está de acuerdo con esta prueba?

Ojalá hubiera pensado antes en esta elocuente muletilla.

ZZZY El EA tiene que permitir el comercio de algo para trabajar. Por lo tanto, puede ser útil ejecutarlo sólo en cuentas de demostración.

No, eso no es una prueba. Una prueba absolutamente asquerosa que no se puede tomar en serio.

Ni siquiera me voy a molestar en entrar en detalles, el hecho de que vuelvas a cronometrar una sola llamada usando GetMicrosecondCount(), y de nuevo con "Agentes 6/8 cargados" en una CPU de 4 núcleos en segundo plano.

Ya he mostrado claramente más arriba que es posible encontrar frenos imaginarios en la ejecución de "x++" también de esta manera.

Tu afirmación sobre los "frenos de SymbolInfoTick" está elementalmente comprobada y refutada por mi código, muy simple y obvio.

La implementación original de SymbolInfoTick, aunque bastante rápida, permitía picos de tiempo de ejecución esporádicos en hilos individuales bajo una carga de multihilos estresante.

En las últimas compilaciones, tampoco tiene este inconveniente.

Es increíble que sigas discutiendo con alguien que sabe exactamente de lo que habla, es decir, que ve implementaciones y puede perfilarlas en diferentes modos.

"Discutamos sobre el sabor de las ostras y los cocos con quienes los han comido".

 
Andrey Khatimlianskii:

¿POSITION_PRICE_CURRENT se ha roto?

No. MT4Orders sólo se utiliza para colocar una posición.

Entonces, ¿con qué estamos comparando? Obtención del último precio guardado (¿cuándo?) frente a la obtención del último precio conocido por el terminal?

Comparamos la duración de la obtención de precios de Market Watch y la posición. Los precios, por supuesto, coinciden.

Y unos 6 de 8 núcleos dijeron directamente. ¿Por qué estas pruebas?

Sólo para que hasta un ciego vea que hay un problema. No tiene sentido, cuando el precio de oferta no se ralentiza a través de la posición y SymbolInfoTick se retrasa horriblemente.


Tengo la sensación de que este muro de MQ no saldrá adelante sin el apoyo de los usuarios del foro. El código es corto, los profesionales deberían ser capaces de entenderlo rápidamente. No tiene ningún defecto. Se muestra claramente que los precios se obtienen mucho más rápido de las posiciones que de Market Watch. Cómo los MQ no ven lo obvio - no lo entiendo.

 
Anton:

Tu afirmación demuestra que no quieres ver lo evidente.

Este código muestra que no hay "frenado SymbolInfoTick".

En un hardware más o menos moderno, el tiempo de ejecución de SymbolInfoTick no supera 1 MICROsegundo.

No, no es una prueba. Una prueba absolutamente desordenada que no se puede tomar en serio.

Ni siquiera me voy a molestar en entrar en detalles, el hecho de que vuelvas a medir el tiempo de una sola llamada por GetMicrosecondCount(), y de nuevo en el fondo de "Agentes 6/8 cargados" en una CPU de 4 núcleos es suficiente.

Ya he mostrado claramente más arriba que es posible encontrar frenos imaginarios en la ejecución de "x++" también de esta manera.

Tu afirmación sobre los "frenos de SymbolInfoTick" está elementalmente comprobada y refutada por mi código, muy simple y obvio.

La implementación original de SymbolInfoTick, aunque bastante rápida, permitía picos de tiempo de ejecución esporádicos en hilos individuales bajo una carga de multihilos estresante.

En las últimas compilaciones, tampoco tiene este inconveniente.

Es increíble que sigas discutiendo con alguien que sabe exactamente de lo que habla, es decir, que ve implementaciones y puede perfilarlas en diferentes modos.

"Discutamos sobre el sabor de las ostras y los cocos con quienes los han comido".

No has mirado el código. No creo en la incompetencia.

  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;

Es una condición que sólo cuenta si la ejecución duró más de 100µs. Si crees que es un valor pequeño, hazlo un orden de magnitud más largo. El efecto es el mismo.

Las dos funciones que se comparan están en condiciones absolutamente iguales. Uno es al final el que frena, el otro no. Vuelve a mirar de cerca lo que mide el código.


Por el momento, la sustitución de SymbolInfoTick en EAs de combate con la muleta sugerida elimina casi todos los retrasos asociados con la obtención de los precios actuales. Es delirante, pero desgraciadamente lo hace.


HI Observe el while en OnTick. Está hecho deliberadamente para atrapar los ticks que llegaron después de que OnTick fuera aceptado. El código no fue escrito de la nada. No se trata de un ciclo forzado completamente artificial que mide la temperatura media del hospital en condiciones ideales.

 
fxsaber:

Creo que este muro MQ no saldrá adelante sin el apoyo de los miembros del foro. El código es corto, los profesionales deberían ser capaces de resolverlo rápidamente. No hay ningún defecto. Se muestra claramente que los precios a través de las posiciones se obtienen mucho más rápido que a partir de Market Watch. Cómo MQ no puede ver lo obvio, no lo entiendo.

No hay errores en el código, por lo que SymbolInfoTick es más lento que obtener el precio de una posición abierta

buen truco para obtener el precio de la posición, no habría adivinado o se dio cuenta de que podría haber tal diferencia
 
fxsaber:

Sólo para que hasta un ciego vea que hay un problema. Bueno, no tiene sentido, cuando el precio de oferta a través de la posición no es lento, pero SymbolInfoTick es laggy de una manera terrible.

Intente probar SymbolInfoTick cuando hay un solo símbolo en la visión general del mercado y cuando hay docenas de símbolos, pero pida un solo símbolo - como en su ejemplo

es muy probable que el servidor haya comprimido el tráfico y que SymbolInfoTick tenga este retraso intermitente al descomprimir los datos

es decir, cuando hay muchos personajes, habrá bajadas más frecuentes o profundas en el tiempo de prueba


así que si esto resulta ser cierto, entonces rehacer toda la arquitectura.... placer dudoso

 
Igor Makanu:

intente probar SymbolInfoTick cuando hay un símbolo en la visión general del mercado y cuando hay docenas de símbolos, pero pida una herramienta - como en su ejemplo

hay una alta probabilidad de que el servidor esté enviando tráfico comprimido y que SymbolInfoTick esté experimentando esta ralentización intermitente al descomprimir los datos

Es decir, cuando hay muchos símbolos, habrá bajadas más frecuentes o profundas en el tiempo de prueba.

Esta hipótesis se refiere a este caso cuando los precios en el Market Watch van por detrás de los precios en tumblr (y viceversa). Pero hasta ahora sólo estamos hablando del frenado del propio SymbolInfoTick dentro del Terminal, sin tocar el tema de la relevancia del precio.

 
fxsaber:

Las dos funciones que se comparan están exactamente en las mismas condiciones.

Al menos GetBid se llama después de SymbolInfoDouble. Si los intercambiamos, ¿el resultado será el mismo?

Algo me dice quePOSITION_PRICE_CURRENT toma el precio almacenado, y no el precio fresco.

Por otra parte, no veo el sentido de hacer pruebas con una CPU cargada al 80%. Estamos probando el rendimiento de la CPU y la asignación de recursos por parte de la bobina, no las características que necesitamos.

 
Andrey Khatimlianskii:

Al menos GetBid se llama después de SymbolInfoDouble. Si lo cambias, ¿el resultado será el mismo?

Estuve experimentando con ella antes de publicarla. No, no es así.

Algo me dice quePOSITION_PRICE_CURRENT toma el precio almacenado, y no el precio fresco.

Esa es la cuestión, los programas MQL necesitan el último precio que llegó al terminal, no otra cosa. Cuando un tick entra en el Terminal, se actualizan automáticamente todas las tablas de posiciones/órdenes.

Bueno y de nuevo, no veo el sentido de hacer pruebas con una CPU cargada al 80%. Estamos probando el rendimiento de la CPU y la asignación de recursos por el bobinado, no las características que necesitamos.

La condición principal es que el entorno sea idéntico para ambas funciones. La carga de la CPU es el factor más llamativo para la visibilidad de las discrepancias.

Veinte EAs en paralelo pueden a veces hacer una llamada a SymbolInfoTick al mismo tiempo, entonces hay una ráfaga de milisegundos de carga y retrasos. Sólo he sugerido hacerlo explícitamente para que el problema se note inmediatamente.


Una vez más, las condiciones de prueba son idénticas para ambas funciones. Es un hecho.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

MT5 y Speed en acción

fxsaber, 2020.10.26 17:53

Por el momento, la sustitución de SymbolInfoTick en los EAs de combate por la muleta sugerida elimina casi todo el freno asociado a la obtención de precios actuales. Es delirante, pero desgraciadamente lo hace.

Razón de la queja: