Características del lenguaje mql5, sutilezas y técnicas - página 100

 
Sleep(0);

Este deslizamiento puede tardar decenas de milisegundos en completarse.

 
fxsaber:

Este deslizamiento puede durar decenas de milisegundos.

¿Qué significa?

Recuerdo que hace tiempo se mencionaba a Sleep() en los procesos paralelos

 
Fast528:

¿Qué significa eso?

Exactamente lo que dijo.

 
fxsaber:

Este deslizamiento puede durar decenas de milisegundos.

No son decenas, sino 15,625 milisegundos.
Llevo mucho tiempo utilizando la construcción:

if(pause>0) Sleep(pause);
 
Nikolai Semko:

No son decenas, sino 15,625 milisegundos.
Llevo mucho tiempo utilizando el diseño:

ulong GetSleepTime( const int Pause = 0 )
{
  const ulong StartTime = GetMicrosecondCount();
  
  Sleep(Pause);
  
  return(GetMicrosecondCount() - StartTime);
}

void OnStart()
{
  ulong MaxTime = 0;
  
  while (!IsStopped())
  {
    const ulong SleepTime = GetSleepTime();
    
    if (SleepTime > MaxTime)
    {
      Print(SleepTime);
      
      MaxTime = SleepTime;
    }
  }
}


Resultado

2542
9983
10033
10041
10148
10348
11982
26116
27529
40066
49915
56319
 
fxsaber:


Resultado

Calcula el tiempo medio.

Acumula el SleepTime y luego divídelo por el número de iteraciones después de que el bucle termine.

De lo contrario, el resultado que acabas de presentar parece aterrador para las mentes inmaduras. También muestra el tiempo mínimo al mismo tiempo.

PS. La función Sleep() en MQL5 no es una redirección a la función win api ::Sleep(). O mejor dicho, si el valor es inferior a 100 es una redirección. Pero por encima de 100 es un bucle con el deslizamiento de win api dentro de él para que pueda ser interrumpido por IsStopped.

Hay un punto más sutil. Si los milisegundos <=0, añadimos 1. Es decir, nunca llamamos a ::Sleep(0).

PPS importar la función Sleep de kernel32.dll y hacer el mismo experimento con ella

 
Slava:

Calcula el tiempo medio.

Acumule el SleepTime y luego divídalo por el número de iteraciones una vez completado el ciclo.

No me refería al tiempo medio, sino a la posibilidad de picos. Los encontré cuando esperaba que el historial de operaciones se sincronizara con el resultado de OrderSend. Estaba esperando usando Sleep(0). Resultó ser imposible.

Slava:

PS. La función Sleep() en MQL5 no es una redirección a la función win api ::Sleep(). Si el valor es inferior a 100, se trata de una redirección. Pero por encima de 100 es un bucle con el deslizamiento de win api dentro de él para que pueda ser interrumpido por IsStopped.

Hay un punto más sutil. Si los milisegundos <=0, añadimos 1. Es decir, nunca llamamos a ::Sleep(0).

Gracias por los detalles. No sabía que Sleep(5000) puede ser terminado a través de IsStopped().

 
fxsaber:

No se trataba del tiempo medio, sino de la posibilidad de picos. Los encontré mientras esperaba la sincronización del historial de operaciones con el resultado de OrderSend. Estaba esperando usando Sleep(0). Resultó que no se puede hacer así.

Así que el sistema operativo Windows nunca ha sido un sistema en tiempo real
 

fxsaber:

Gracias por los detalles. No sabía que Sleep(5000) podía terminarse mediante IsStopped().

https://www.mql5.com/ru/docs/common/sleep

La función tiene incorporada una comprobación del estado de la bandera de parada del EA cada 0,1 segundos.

Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.
 
Slava:
Así que el sistema operativo Windows nunca ha sido un sistema en tiempo real

Sinceramente, no sé ni lo que significa ni en qué parte de MQL5 se puede encontrar.

Razón de la queja: