Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 101

 
fxsaber:

Ergebnis

Ja, ich habe die internen Abläufe des Ruhezustands nicht berücksichtigt, der bei meinem Computer etwa 4 ms dauert.

Eine gute Alternative zu Sleep (wer sich um die Genauigkeit kümmert :)) ist

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

Für die Genauigkeit von 0,995 kann ich nicht garantieren. Ich habe es für meinen eigenen Computer gekauft. Sie kann für alle geeignet sein.

Dateien:
TestSleep.mq5  1 kb
 
fxsaber:

Ehrlich gesagt, weiß ich nicht einmal, was es bedeutet und wo man es in MQL5 finden kann.

Das bedeutet, dass Spikes in jeder Situation möglich sind, auch bei synchronen Funktionen. Man muss sich ihrer nur bewusst sein und sie nicht beachten, denn man kann nichts dagegen tun.

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...
 

Neben Dateien und globalen Variablen gibt es eine weitere Möglichkeit, Informationen zwischen Programmen zu übertragen

Forum für Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: 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:

Abgesehen von Dateien und globalen Variablen gibt es noch eine weitere Möglichkeit , Informationen zwischen Programmen zu übertragen

Wir sprechen hier von Programmen innerhalb eines einzigen Terminals, nicht wahr?

 
Nikolai Semko:

Wir sprechen hier von Programmen innerhalb eines einzigen Terminals, nicht wahr?

Ja, deshalb werden ja auch globale Variablen erwähnt.

Und zwischen den Terminals begann man, diesen Weg zu nutzen.
 
fxsaber:

Ja, deshalb werden ja auch globale Variablen erwähnt.

Und zwischen den Terminals wurde auf diese Weise begonnen.

Ja, das ist wirklich cool!
Sehr cooler Fund mit RAM-Disks anstelle von SSDs.

 
fxsaber:

Ja, deshalb werden ja auch globale Variablen erwähnt.

Ich habe begonnen, diesen Weg zwischen den Terminals zu nutzen.

Ich verwende schon seit langem eine solche einfache Semi-Hacker-Methode mit user32.dll. Es ist jedoch unmöglich, Arrays von Ticks auf diese Weise zu übergeben.

Ich habe es vor langer Zeit erfunden, als ich MQL4 gemeistert habe. Natürlich ist es nicht die kürzeste Lösung im Sinne einer vernünftigen Organisation des Austauschs, aber es ist schnell und funktioniert gut (vielleicht schneller als alle bestehenden Lösungen), deshalb habe ich mir nicht weiter den Kopf zerbrochen.

Außerdem sind bei dieser Methode keine zusätzlichen Maßnahmen erforderlich.

Der Punkt ist, dass es für das gesamte Windows eine gemeinsame Variable vom Typ String gibt - den Namen des Hauptfensters von Windows. Alle können sie verändern und alle können sie sehen.

Dateien:
 
Nikolai Semko:

Ich verwende seit langem eine solche einfache Semi-Hacker-Methode, nämlich die user32.dll. Allerdings können Sie auf diese Weise keine Tick-Arrays übertragen.

Wenn über dll, gibt es eine universelle Lösung für alle Datentypen.

 
Nikolai Semko:

Aber es ist schnell (wahrscheinlich schneller als alle bestehenden Lösungen)

Nun, Sie gehen zu weit) Zunächst einmal geht es durch die Nachrichtenwarteschlange. Zweitens müssen Sie einige zusätzliche Umrechnungen vornehmen (hin und her). Außerdem findet eine Validierung statt.

Übrigens sollten Sie die Größe der Struktur nicht explizit angeben. Dafür ist sizeof gedacht.

 
fxsaber:

Wenn über dll, gibt es eine universelle Lösung für alle Datentypen.

Ich diskutiere nicht. Ihre Lösung ist wirklich universeller.
Aber ich persönlich brauche nur eine Brücke zwischen den Klemmen, um Strom zu übertragen.

Meine Variante ist aufgrund ihrer Primitivität einfach leichter zu verstehen und funktioniert etwas schneller. Ich habe sie im Vergleich zu Ihrer gemessen und sie ist 1,5 bis 2 Mal schneller. Die Lesezeit für einen Tick beträgt 90 Mikrosekunden gegenüber 160 Mikrosekunden.

Dateien: