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

 
fxsaber:

Résultat

Oui, je n'ai pas pris en compte le fonctionnement interne de la mise en veille, qui prend environ 4ms sur mon ordinateur.

Une bonne alternative à Sleep (qui se soucie de la précision :)) est

void sleep(int m)
  {
   if(m>0) Sleep(int(0.995*m+0.5)-1);
  }

Je ne peux pas garantir la précision de 0,995. Je l'ai pris pour mon propre ordinateur. Il peut convenir à tous.

Dossiers :
TestSleep.mq5  1 kb
 
fxsaber:

Honnêtement, je ne sais même pas ce que cela signifie et où dans MQL5 on peut le rencontrer.

Cela signifie que les pics sont possibles dans n'importe quelle situation, même dans les fonctions synchrones. Il vous suffit d'en être conscient et de ne pas y prêter attention, car vous ne pouvez rien y faire.

https://en.wikipedia.org/wiki/Interrupt
Interrupt - Wikipedia
Interrupt - Wikipedia
  • en.wikipedia.org
This article is about computer interrupts. For the study of the effect of disruptions on job performance, see Interruption science. For other uses, see Interruption. In system programming, an interrupt is a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. An interrupt alerts the...
 

En plus des fichiers et des variables globales, il existe un autre moyen de transférer des informations entre programmes

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

Bibliothèques : TradeTransactions

fxsaber, 2018.09.20 16:23

// Пример хранения/обмена данными через Ресурсы внутри Терминала
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

void OnStart()
{  
  const RESOURCEDATA<int> ResourceINT("::int"); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса
  
  int ArrayINT[] = {1, 2, 3};
  int Num = 5;
  
  ResourceINT = ArrayINT;  // Ресурс хранит массив.
  ResourceINT += Num;      // Добавили в ресурс еще значение.
  ResourceINT += ArrayINT; // Добавили массив.
  
  int ArrayINT2[];  
  ResourceINT.Get(ArrayINT2); // Считали данные из ресурса.
  ArrayPrint(ArrayINT2);      // Вывели: 1 2 3 5 1 2 3

  ResourceINT.Free();                // Удалили данные из ресурса
  Print(ResourceINT.Get(ArrayINT2)); // Убедились, что данных нет: 0

  const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Ресурс для обмена тиками. const - как доказательство, что ничего не пишется в объект класса
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    for (int i = 0; i < 3; i++)
      ResourceTicks += Tick; // Добавили в ресурс тики

  MqlTick Ticks[];
  ResourceTicks.Get(Ticks); // Считали данные из ресурса.
  ArrayPrint(Ticks);        // Вывели.
  
  // Это полное имя ресурса для обращения из другой программы
  const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks";  
  Print(NameOut); // Вывели полное имя ресурса.
  
  const RESOURCEDATA<MqlTick> Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber:

Outre les fichiers et les variables globales, il existe un autre moyen de transférer des informations entre les programmes.

Nous parlons de programmes au sein d'un seul terminal en fonctionnement, n'est-ce pas ?

 
Nikolai Semko:

Nous parlons de programmes au sein d'un seul terminal en fonctionnement, n'est-ce pas ?

Oui. C'est pourquoi les variables globales sont mentionnées.

Et entre les terminaux, on a commencé à utiliser cette méthode.
 
fxsaber:

Oui. C'est pourquoi les variables globales sont mentionnées.

Et entre les terminaux ont commencé à utiliser cette façon.

Oui, c'est vraiment cool !
Très bonne idée d'utiliser des disques RAM au lieu de disques SSD.

 
fxsaber:

Oui. C'est pourquoi les variables globales sont mentionnées.

J'ai commencé à utiliser cette méthode entre les terminaux.

J'utilise depuis longtemps une méthode semi-hacker aussi facile en utilisant user32.dll. Mais il est impossible de passer des tableaux de ticks de cette manière.

Je l'ai inventé il y a longtemps, lorsque je maîtrisais MQL4. Bien sûr, ce n'est pas la solution la plus courte en termes d'organisation raisonnable de l'échange, mais elle est rapide et fonctionne bien (peut-être plus vite que toutes les solutions existantes), c'est pourquoi je ne me suis plus creusé la tête.

En outre, cette méthode ne nécessite aucune action supplémentaire.

Le point est que pour l'ensemble de Windows est une variable commune de type chaîne - nom de la fenêtre principale de Windows. Tout le monde peut le modifier et tout le monde peut le voir.

Dossiers :
 
Nikolai Semko:

J'utilise depuis longtemps une méthode semi-hacker aussi facile, en utilisant user32.dll. Mais vous ne pouvez pas transférer des tableaux de tics de cette manière.

Si via dll, il existe une solution universelle pour tous les types de données.

 
Nikolai Semko:

Mais il est rapide (probablement plus rapide que toutes les solutions existantes).

Eh bien, tu vas trop loin ! Tout d'abord, il passe par la file d'attente des messages. Deuxièmement, vous devez effectuer des conversions supplémentaires (aller et retour). En plus, il y a une certaine validation en cours.

À propos, vous ne devez pas spécifier explicitement la taille de la structure. C'est à ça que sert sizeof.

 
fxsaber:

Si via dll, il existe une solution universelle pour tous les types de données.

Je ne discute pas. Votre solution est vraiment plus universelle.
Mais personnellement, je n'ai besoin que d'un pont entre les bornes pour transférer le courant.

Ma variante est simplement plus facile à comprendre en raison de son caractère primitif et fonctionne un peu plus rapidement. Je l'ai mesuré en comparaison avec le vôtre et il est 1,5 - 2 fois plus rapide. Le temps de lecture d'un tick est de 90 microsecondes contre 160 microsecondes.

Dossiers :