Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 102

 
Alexey Navoykov:

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 gibt es sizeof.

  • Wo haben Sie dort eine Nachrichtenwarteschlange gesehen?
  • Es gibt keine Hin- und Rückfahrtumrechnungen. Es wird die gleiche Vereinigung wie im Beispiel von @fxsaber verwendet
  • Es gibt auch keine Validierung.
  • Natürlich kann man sizeof(...) verwenden, aber da es sich um die Implementierung einer konkreten Aufgabe handelt und nicht um eine universelle, musste ich sie einfach kürzer als 3 Ziffern schreiben.

Vielleicht haben Sie sich einen anderen Code angesehen.

HH das Einzige, was mir an meiner Version nicht gefällt: Ich musste die Zeilengröße verdoppeln, um Nullen zu umgehen, denn die Null wird als Ende der Zeile wahrgenommen. Ich habe das Gefühl, dass es eine einfachere Lösung gibt, aber ich habe sie nicht gefunden. Aber es funktioniert trotzdem schneller.

 
Nikolai Semko:

  • Wo haben Sie eine Nachrichtenwarteschlange gesehen?

SetWindowText/GetWindowText werden nicht über Nachrichten gesendet?


Es gibt keine Hin- und Rückfahrtumrechnungen.

Natürlich tut sie das. Was soll die ganze Aufregung?

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Alexey Navoykov:

SetWindowText/GetWindowText werden nicht über Nachrichten gesendet?

Und Sie sprechen von Windows-Nachrichten ... Na und? Gibt es eine schnellere Alternative, um Daten zwischen verschiedenen Programmen im windos ohne homebrew dll auszutauschen?

Ich verstehe, dass Sie durch meine Worte beleidigt waren, dass meine Variante schnell ist. Nun, erstens habe ich das nicht behauptet, sondern nur vorgeschlagen. Zweitens habe ich meine Vermutung mit Testcode untermauert und mitMemory Mapping verglichen.
Und wenn Sie versuchen, auch nur eine Vermutung zu widerlegen, stützen Sie sich bitte nicht nur auf deklarative Aussagen. Ich wäre Ihnen sehr dankbar, wenn Sie mich davon abbringen und auf eine schnellere Implementierung des Datenaustauschs zwischen Terminals ohne eine selbst geschriebene DLL hinweisen könnten.

Ich schließe nicht aus, dass die Variante über die RAM-Disk viel schneller sein wird. Dies ist jedoch ein etwas anderes Thema, da es die Installation einer RAM-Disk und deren Konfiguration erfordert.

Alexey Navoykov:

Ja, natürlich. Aber was ist das für ein Tanz mit Tamburinen:

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];

So viel zu Tamburinen. Es ist eine Banalität. Und diese Trivialität wird übrigens in 50-60 ns durchgeführt, wenn der gesamte Empfangsblock der Tick-Struktur in 90 µs (90 000 ns.) durchgeführt wird, d.h. diese "Diamanten" nehmen nur 0,06 % der Zeit des Datenblockempfangs ein. Außerdem habe ich geschrieben, dass mich dieser Punkt nur im Hinblick auf die Speicherverdopplung verwirrt.

Und so scheint meine Variante sehr bequem, einfach und intelligent für den Austausch von kleinen Datenstrukturen.

 
Nikolai Semko:

  • Das Einzige, was mir an meiner Version nicht gefällt: Ich musste die Zeilengröße verdoppeln, um die Nullen zu umgehen, denn die Null wird als Zeilenende wahrgenommen. Ich spüre in meinem Innersten, dass es eine einfachere Lösung gibt, aber ich habe sie nicht gefunden. Aber es geht trotzdem schneller.

Forum für Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: HistoryTicks

Automated-Trading, 2018.03.29 11:09

  • In den Quellen( DateiData_String.mqh) gibt es plattformübergreifende Funktionen, mit denen Sie beliebige Daten in eine Zeichenkette einfügen oder aus ihr extrahieren können. Zum Beispiel ermöglicht es den einfachen Austausch beliebiger Daten zwischen beliebigen MQL-Programmen unter Verwendung von String-Parametern (sparam)von Benutzerereignissen;
#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    const string Str = DATA_STRING::ToString(Tick);
    
    MqlTick Ticks[1];
    
    Ticks[0] = DATA_STRING::FromString<MqlTick>(Str);
    ArrayPrint(Ticks);
  }
}
 
fxsaber:

Wow!
Ich wusste gar nicht, dass es Funktionen wie CryptEncode undCryptDecode gibt. Ich danke Ihnen!
Ich werde es mir ansehen.
Auf den ersten Blick scheint das alles Hightech zu sein, aber wahnsinnig langsam, denn die CryptEncode-Funktion läuft zwei Größenordnungen langsamer (Mikrosekunden gegenüber zehn Nanosekunden) als das, was hier als Tamburine bezeichnet wurde:

for(int i=0; i<56; i++) if(U.a[i]==0) m[2*i+1]=2; else m[2*i]=U.a[i];
 
Nikolai Semko:

Ich nehme an, Sie waren beleidigt, als ich sagte, dass meine Version schnell war. Nun, erstens habe ich das nicht behauptet, sondern nur eine Vermutung geäußert. Zweitens habe ich meine Vermutung mit Testcode untermauert und mitMemory Mapping verglichen.

Ich habe nicht von "Schnelligkeit" gesprochen, sondern davon, dasses schneller sein könnte als alle existierenden Lösungen, also habe ich mehrere Bemerkungen gemacht, ohne sie anzugreifen. Und diese Bemerkungen waren durchaus fair. Aber aus irgendeinem Grund leugnen Sie das erst hartnäckig ("vielleicht habenSie sich einen anderen Code angesehen") und kommen dann mit dem "Na und! Trennen wir alsodie Fliegen von den Koteletts.

Zweitens, in Bezug auf MemoryMapping (genauer gesagt, seine MQL-Wrapper, um genau zu sein), habe ich nie etwas gesagt, dass es schnell ist. Außerdem habe ich im Diskussionsthread zu diesem Projekt hier auf die Fehler des Autors hingewiesen, die zu Verzögerungen führen, und wie man sie beheben kann. Wenn Sie also etwas testen wollen, sollten Sie es in seiner ursprünglichen Form testen und nicht in der Form der falschen Entscheidungen anderer.

 
Nikolai Semko:

ZZY Aber auf den ersten Blick ist das alles Hightech, aber wahnsinnig langsam, denn die CryptEncode-Funktion ist um zwei Größenordnungen langsamer (Mikrosekunden gegenüber zehn Nanosekunden) als das, was hier Tamburine genannt wird:

Wozu ist Geschwindigkeit gut?

 
Alexey Navoykov:

Ich spreche nicht von "Schnelligkeit", sondern von"es könnte schneller sein als alle existierenden Lösungen", also habe ich einige Bemerkungen gemacht, ohne irgendwelche Angriffe. Und diese Bemerkungen waren durchaus fair. Nur du leugnest es zuerst stur aus irgendeinem Grund ("vielleicht hastdu dir einen anderen Code angesehen"), und dann kommst du in die Position "na und! Trennen wir alsodie Fliegen von den Koteletts.

Erstens wurde mein Beitrag geschrieben, bevor Sie Ihren Testcode zitiert haben. Zweitens habe ich in Bezug auf MemoryMapping (genauer gesagt, seine MQL-Wrapper erwähnt), nie behauptet, es funktioniert schnell. Außerdem habe ich im Diskussionsthread zu diesem Projekt hier auf die Fehler des Autors hingewiesen, die zu Verzögerungen führen, und wie man sie beheben kann. Wenn Sie also etwas testen wollen, sollten Sie es in der ursprünglichen Form testen und nicht die falschen Entscheidungen anderer.

Gut. Einverstanden. Das war zu laut.

Ich wollte nur sagen, dass die Verwendung von user32.dll anstelle von kernel32.dll möglicherweise schneller ist, wenn zwei Terminals über WinAPI verknüpft werden, da alle Implementierungen, die ich gesehen habe, kernel32.dll verwenden.

 
fxsaber:

Wofür ist die Geschwindigkeit?

Es tut mir leid, ich habe die Frage nicht verstanden.
Sie fragen: Warum brauchen Sie die Überbrückungsgeschwindigkeit zwischen den Terminals?

 
Nikolai Semko:

Es tut mir leid, ich habe die Frage nicht verstanden.
Sie fragen sich: Warum brauchen Sie einen schnellen Datenaustausch zwischen den Terminals?

Ja.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten der Sprache mql5, Tipps und Tricks

Nikolai Semko, 2018.09.21 13:20

Aber so weit, auf den ersten Blick, all dies, natürlich, High-Tech, aber wahnsinnig langsam, weil CryptEncode Funktion ausgeführt wird zwei Größenordnungen langsamer(Mikrosekunden vs. zehn Nanosekunden) als das, was hier genannt wird Tamburine: