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

 

Rediseñado para una macro

#define  µsSLEEP(µsRange)                              \
        {                                             \
           ulong c = GetMicrosecondCount() + µsRange; \ 
           while(GetMicrosecondCount() < c);          \
        }


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!_StopFlag)
   {
      µsSLEEP(5000000);
      Print("Прошло 5000000 микросекунд");
   }
}
 
Roman:

Por supuesto, puede hacer más que un solo núcleo.

Me refería a mientras no se duerme.

Está claro que el deslizamiento no es adecuado aquí porque necesitamos microsegundos. Pero estará zumbando sin él...

 
Andrey Khatimlianskii:

Me refería a mientras no se duerme.

Está claro que el deslizamiento no funcionará aquí porque necesitamos microsegundos. Pero zumbará sin ella.

Por supuesto, zumba sin un deslizamiento.
El contadorGetMicrosecondCount está funcionando

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong µs = 0;
   
   while(!_StopFlag)
   {
      µs = GetMicrosecondCount();
      
      Comment((string)µs);
      ChartRedraw();      
   }
   
   Comment("");   
}
 
Roman:

Por supuesto que está girando sin un deslizamiento.
El contador GetMicrosecondCount está en marcha.

No sólo se carga el contador. Un bucle infinito vacío también lo cargará. Eso es lo que quiero decir.

Mala solución, en general. Pero no voy a sugerirlo mejor.

 
Andrey Khatimlianskii:

No sólo se carga el contador. También se cargará un bucle sin fin vacío. Eso es lo que quiero decir.

Es una mala solución, en definitiva. Pero no lo sugeriré mejor.

Por lo tanto, un bucle vacío utilizará obviamente todo el potencial de los ciclos de reloj del procesador.
No entiendo la queja sobre una mala solución. Si no es adecuado para sus recursos, no significa que sea malo.
µsSLEEP le da una latencia de bucle menor que la de Sleep(1) estándar; es decir, en microsegundos, no en milisegundos.
El 5000000 en los ejemplos anteriores es sólo para un ejemplo, la frecuencia real en el combate sería menos de 1 ms

No entiendo su problema.
¿Necesitas
que no haya estrés?
Poner un Sleep(20) regular; en milisegundos

 
Roman:

Así que el vacío mientras comprensiblemente recoge todo el potencial de los ciclos de reloj del procesador.
No entiendo la queja sobre una mala solución. Si no se adapta a tus recursos, no significa que sea malo.
µsSLEEP le da una latencia de bucle menor que la de Sleep(1) estándar; es decir, en microsegundos, no en milisegundos.
El 5000000 en los ejemplos anteriores es sólo para un ejemplo, la frecuencia real en el combate sería menos de 1 ms

No entiendo su problema.
¿Necesitas
que no haya estrés?
Poner regular Sleep(20); en milisegundos.

No hubo ninguna queja.
No necesito tal temporizador, lo estaba estudiando por interés. Pero me parece una mala solución ya que carga innecesariamente el procesador.

¿Y para qué necesitas el deslizamiento de microsegundos?

 
Andrey Khatimlianskii:

No hubo ninguna queja.
No necesito tal temporizador, lo he estudiado por interés. Pero la solución me parece mala, ya que carga innecesariamente el procesador.

¿Para qué necesitas un resbalón de microsegundos?

Si te preguntaras por qué se carga y averiguaras por qué, no tendrías esta opinión.
Si quieres menos de 1ms, tendrás que pagarlo con recursos.
Y me parece que no se puede descargar, porque se necesita un temporizador de microsegundos para contar el intervalo.
Por otra parte, si el temporizador de microsegundos está en constante funcionamiento y da la carga igual al tiempo vacío,
entonces hay una pregunta, ¿por qué este retraso a continuación, poner, y el uso de temporizador de microsegundos. Pero no importa, es lírico.
Entonces, estoy haciendo ping al servidor, con una cierta frecuencia en el tiempo sin retraso.
Y necesito un muestreo de microsegundos, porque habrá llamadas innecesarias.
Estoy utilizando la primera solución, que he publicado antes, y escribí µsSleep también, puede ser útil.


 
Andrey Khatimlianskii:


¿Para qué necesitas un resbalón de microsegundos?

He aquí una solución ya preparada.
Print() por supuesto lo sustituyes por tu propio código.

#define  SEND_PING                                           \
{                                                           \   
   ulong currCount = GetMicrosecondCount();                 \
   switch((currCount - prevCount) > 5000000)                \
   {                                                        \
      case 0:                                               \
         break;                                             \
      case 1:                                               \
         prevCount = currCount;                             \
         Print("ping");                                     \
         break;                                             \
   }                                                        \
}
       

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong  prevCount = 0;
   
   while(!_StopFlag)
   {
      SEND_PING;
   }  
 
}
 
Renat Fatkhullin:
En el nuevo probador que estamos escribiendo, intentaremos cambiar esto.
fxsaber:

Enviado al PM.

En el Probador, este EA genera millones de registros de órdenes comerciales completas y razonables (no spam) en forma de modificaciones. Por esta razón, el registro del Probador se obstruye catastróficamente de forma rápida.

Estos registros no son necesarios el 99% de las veces, pero a menudo necesitamos lo que el Asesor Experto emite a través de la impresión. Por lo tanto, me gustaría pedirle de nuevo que considere la posibilidad de desactivar la generación automática de entradas para cada paquete de OrderSend en el Probador.

Si lo he entendido bien, al desactivar la generación de dichas cadenas se incrementará el rendimiento de las ejecuciones individuales. Es decir, el beneficio es doble.

 
Renat Fatkhullin:


Pero AMPGlobalEU-Live (en realidad es mejor buscarlo como AMPGlobalUSA-Live) para MetaTrader 5 con un núcleo de plataforma física en Chicago es en realidad 19,53 ms, ya que nuestros servidores más cercanos están en Nueva York:

Especialmente escaneado todos sus puntos manualmente - el mínimo es de 19 ms.

Intentaremos poner servidores en Chicago en los próximos días. No he llegado a hacerlo.

El servidor de Chicago ha sido desplegado.

En 24 horas, escaneará todos los servidores y comenzará a distribuirlos.

Razón de la queja: