Caractéristiques du langage mql5, subtilités et techniques - page 100

 
Sleep(0);

Un tel glissement peut prendre des dizaines de millisecondes.

 
fxsaber:

Un tel glissement peut durer des dizaines de millisecondes.

Qu'est-ce que cela signifie ?

Je me souviens qu'il y a longtemps, Sleep() était mentionné dans les processus de mise en parallèle.

 
Fast528:

Qu'est-ce que ça veut dire ?

Exactement ce qu'il a dit.

 
fxsaber:

Un tel glissement peut durer des dizaines de millisecondes.

Pas des dizaines, mais 15,625 millisecondes.
J'utilise cette construction depuis longtemps :

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

Pas des dizaines, mais 15,625 millisecondes.
J'utilise ce modèle depuis longtemps :

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;
    }
  }
}


Résultat

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


Résultat

Calculez le temps moyen.

Accumulez SleepTime et divisez-le ensuite par le nombre d'itérations après la fin de la boucle.

Sinon, le résultat que vous venez de présenter semble effrayant pour les esprits immatures. Indiquez également le temps minimum en même temps.

PS. La fonction Sleep() de MQL5 n'est pas une redirection vers la fonction win api ::Sleep(). Ou plutôt, si la valeur est inférieure à 100, il s'agit d'une redirection. Mais au-delà de 100, il s'agit d'une boucle dans laquelle se glisse win api, de sorte qu'elle peut être interrompue par IsStopped.

Il y a un point plus subtil. Si les millisecondes <=0, nous ajoutons 1. C'est-à-dire que nous n'appelons jamais ::Sleep(0).

PPS importe la fonction Sleep de kernel32.dll et fait la même expérience avec elle

 
Slava:

Calculez le temps moyen.

Accumulez SleepTime, et divisez par le nombre d'itérations après la fin du cycle.

Je ne parlais pas du temps moyen mais de la possibilité de pics. Je les ai rencontrés en attendant que l'historique des transactions soit synchronisé avec le résultat d'OrderSend. J'attendais en utilisant Sleep(0). Il s'est avéré que c'était impossible.

Slava:

PS. La fonction Sleep( ) de MQL5 n'est pas une redirection vers la fonction win api ::Sleep(). Si la valeur est inférieure à 100, il s'agit d'une redirection. Mais au-delà de 100, il s'agit d'une boucle dans laquelle se glisse win api, de sorte qu'elle peut être interrompue par IsStopped.

Il y a un point plus subtil. Si les millisecondes <=0, nous ajoutons 1. C'est-à-dire que nous n'appelons jamais ::Sleep(0).

Merci pour les détails. Je ne savais pas que Sleep(5000) pouvait être interrompu par IsStopped().

 
fxsaber:

Il ne s'agissait pas du temps moyen, mais de la possibilité de pics. Je les ai rencontrés en attendant la synchronisation de l'historique des transactions avec le résultat d'OrderSend. J'attendais en utilisant Sleep(0). Il s'est avéré que cela ne peut pas être fait de cette façon.

Le système d'exploitation Windows n'a donc jamais été un système en temps réel.
 

fxsaber:

Merci pour les détails. Je ne savais pas que Sleep(5000) pouvait être interrompu par IsStopped().

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

La fonction comporte une vérification intégrée du statut du drapeau d'arrêt de l'EA toutes les 0,1 secondes.

Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.
 
Slava:
Le système d'exploitation Windows n'a donc jamais été un système en temps réel.

Honnêtement, je ne sais même pas ce que cela signifie ni où dans MQL5 vous pouvez le rencontrer.