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

 
fxsaber:
La nuance de la comparaison d'entiers sur un exemple réel

Allez-vous mesurer exactement une seconde avec Sleep(1000) ?

Et vous ne savez pas que le timer du processeur a une erreur de 15 ms ?

 
Slava:

Allez-vous glisser Sleep(1000) pour mesurer exactement une seconde ?

Savez-vous que le timer du CPU a une marge d'erreur de 15 ms ?


Bonjour, pourriez-vous me dire s'il existe un moyen de réinitialiser le tampon de la minuterie pour éliminer l'erreur de réglage de la minuterie?

 
Vladislav Andruschenko:

Bonjour, pourriez-vous me dire s'il existe un moyen de réinitialiser le tampon de la minuterie pour éviter une erreur de réglage de la minuterie?

Une erreur de réglage du minuteur se produit parce que la file d'attente des messages du système est pleine. Il peut y avoir plusieurs raisons à cela. En général, le débordement de la file d'attente est temporaire (si ce n'est pas le cas, vous ne pourrez pas travailler sur votre ordinateur).

Utilisez OnTick pour surveiller la minuterie. Si le minuteur n'est pas défini, définissez-le sur OnTick.

Entre-temps, nous travaillons à rendre les paramètres de la minuterie indépendants de l'état de la file d'attente des messages.

PS L'activation de la minuterie du système et le réglage de la minuterie d'une application ne sont pas liés.

 
Slava:

Allez-vous glisser Sleep(1000) pour mesurer exactement une seconde ?

Non, il s'agit de ces deux lignes de comparaison d'entiers.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Caractéristiques du langage mql5, subtilités et astuces

fxsaber, 2018.01.24 21:48

La nuance de la comparaison des nombres entiers à l'aide d'un exemple réel
//  if (GetMicrosecondCount() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount() - StartTime > 1000000) // Правильно

À première vue, les deux lignes devraient donner les mêmes résultats. Mais ce n'est pas le cas. La première donne parfois un résultat erroné.

L'exemple avec le temps est choisi uniquement pour des raisons de clarté.
Slava:

Et le fait que le timer du processeur ait une erreur de 15ms, vous l'ignorez ?

Il est étrange que vous utilisiez encore GetTickCount. Il a été prouvé sur le forum (trop paresseux pour chercher) qu'un minuteur de microsecondes n'est pas plus lent qu'un minuteur de millisecondes. En même temps, il n'y a pas d'erreur sauvage.

 
fxsaber:

Non, il s'agit de ces deux chaînes de comparaisons d'entiers.

À première vue, les deux chaînes devraient donner les mêmes résultats. Mais ce n'est pas le cas. La première donne parfois un résultat erroné.

L'exemple avec le temps est choisi uniquement pour des raisons de clarté.

Il est étrange que vous utilisiez encore GetTickCount. Il a été prouvé sur le forum (je suis trop paresseux pour le rechercher) que le minuteur de microseconde n'est pas plus lent que le minuteur de milliseconde. En même temps, il n'y a pas d'erreur sauvage.

Je veux dire Sleep(1000)
 
Slava:

Une erreur de minuterie se produit parce que la file d'attente des messages du système est pleine. Il peut y avoir un certain nombre de raisons à cela. Un débordement de file d'attente est généralement temporaire (si ce n'est pas le cas, vous ne pourrez pas travailler sur votre ordinateur).

Utilisez OnTick pour surveiller la minuterie. Si le minuteur n'est pas défini, définissez-le sur OnTick.

Entre-temps, nous travaillons à rendre les paramètres de la minuterie indépendants de l'état de la file d'attente des messages.

PS L'activation de la minuterie du système et le réglage de la minuterie pour une application sont des questions distinctes.


C'est exactement ce que je fais,

L'erreur de minuterie se produit après un certain temps - pas immédiatement. et exactement à cause du débordement - lorsqu'il y a beaucoup de données, par exemple l'historique des commandes, ou des commandes actuelles de 50 ou plus.

j'ai déjà essayé et j'essaie encore de l'utiliser, mais j'ai le sentiment que je vais néanmoins résoudre le problème.

 
Slava:
Je parle de Sleep(1000).

Oui, tu t'es embourbé dans le sujet de la comparaison des entiers.

 
fxsaber:

Oui, vous parlez de comparer des entiers.

Il n'y a aucun problème à comparer des entiers.

Montrer la même chose sans glissement et sans GetMicrosecondsCount

 
Slava:

Il n'y a aucun problème à comparer des entiers.

Montrer la même chose sans le glissement et sans GetMicrosecondsCount

ulong GetMicrosecondCount2()
{
  static ulong StartTime = 0;
  
  if (StartTime)
    StartTime += 1000001;            // При повторном - добавляем больше "секунды"
  else
    StartTime = ULONG_MAX - 1000000; // При первом запуске возвращаем это "время"
    
  return(StartTime);
}

void OnStart()
{
  const ulong StartTime = GetMicrosecondCount2();
  
//  Sleep(1000);
  
//  if (GetMicrosecondCount2() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount2() - StartTime > 1000000) // Правильно
    Print("Прошло больше секунды.");
  else
    Print("Прошло меньше секунды."); 
}
Et ce n'est pas un problème, c'est une subtilité.
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Discussion sur "Le système de comptabilisation des positions de couverture est ajouté à MetaTrader 5".

fxsaber, 2018.01.25 10:14

  1. Montre un exemple de situation de trading qu'Andrew a relevé à la lecture de cet article.
  2. HistorySelectByPosition peut ne pas sélectionner l'ordre à l'origine de la transaction.
  3. L'ordre et l'opération qu'il a engendrée peuvent avoir des ID différents.
Les deuxième et troisième points devraient au moins être exprimés quelque part. Ce qu'il a fait.

Nous parlons de l'analyse de l'histoire d'un métier même manuel, nous ne parlons pas de la rédaction de TS.

Par exemple, nous voulons comprendre comment l'affaire a dérapé.