Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Es heißt nicht "Schließen des Datensatzes", sondern "Schließen und Löschen der Datei ".
Das ist der Grund
Sie versuchen, etwas zu öffnen, das nicht mehr existiert.Beim Durchsehen des Bibliothekscodes habe ich gesehen, dass die Datei nicht nur gelöscht wird, wenn die Funktion Close() der Klasse CMemMapFile direkt aufgerufen wird, sondern auch, wenn der Zeiger auf das Objekt dieser Klasse gelöscht wird, da diese Funktion im Destruktor der Klasse aufgerufen wird. Ich bin ein wenig ratlos. Es stellt sich heraus, dass die dynamische Methode zur Erstellung von Klassenobjekten nicht verwendet werden kann, wenn das Schreiben und Lesen einer Datei in unterschiedlichen Aufrufkontexten (Scopes) verwendet wird. Zum Beispiel schreibt ein Diagramm des Terminals Daten in eine Datei, das zweite liest Daten und löscht diese Datei. Es stellt sich heraus, dass die Objektvariable immer auf der globalen Ebene gehalten werden sollte, damit die Datei nicht zwangsweise gelöscht wird. Es ist auch nicht klar, ob es möglich ist, auf die Angabe der Größe der gelesenen Daten zu verzichten. Das heißt, wir kennen die Größe der Daten, wenn wir sie schreiben, aber wenn wir sie auf einem anderen Diagramm lesen, kennen wir die Größe der Daten möglicherweise nicht im Voraus, wie zum Beispiel im Fall von String-Werten. Wahrscheinlich habe ich entweder etwas falsch verstanden oder es gibt noch etwas in der Bibliothek zu optimieren.
Mein Fehler. Ich habe es noch einmal überprüft, ohne den Zeiger zu verwenden und daher auch ohne delete. In diesem Fall wird die lokale Variable des Klassenobjekts beim Verlassen des Geltungsbereichs (aus einer Funktion) ohne expliziten Aufruf des Destruktors zerstört.
Es bleibt noch die Frage nach der Größe der empfangenen Daten auf der Seite des Empfängers.
Vielen Dank an den Autor für die Bibliothek!
Ich habe Funktionen für die Übertragung beliebiger Daten erstellt. Das folgende Skript zeigt ihre Arbeit am Beispiel von Zecken
Ergebnis
Super! In Analogie zu Ihrem Code habe ich mir die Verwendung der Bibliothek vereinfacht.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
NamedPipes für metatrader 4
fxsaber, 2017.11.30 14:18
Exchange_Data.mqh
PriceGiver.mq4
PriceTaker.mq4
Führen Sie PriceGiver.ex4 und PriceTaker.ex4 aus.
Ergebnis
Die Bibliothek hat einen kleinen Fehler in der Methode CMemMapFile::Open, die eigentlich das Dateihandle (Typ HANDLE64) zurückgeben sollte, aber stattdessen 0 oder einen Fehlercode zurückgibt.
Außerdem werden bei den Lese- und Schreibmethoden CMemMapApi::Write und CMemMapApi::Read aus irgendeinem Grund Daten doppelt kopiert (und Bytes werden durchgeschleift!), und außerdem wird die Datei komplett überschrieben/gelesen, obwohl nur ein bestimmter Teil benötigt wird.
Im Allgemeinen habe ich sie normal aussehen lassen, das unnötige Zeug ist auskommentiert:
Damit die erste Funktion kompiliert werden kann, müssen Sie const für Arrays in den Funktionen memcpyX und memcpy setzen, was der Autor nicht getan hat.Fehler beim Kopieren großer Größen, da in dwMaximumSizeHigh eine Null übergeben wurde
Ich habe es folgendermaßen korrigiert:
Diese Größe - 6 mb, wird ohne Probleme übertragen:
Korrigieren Sie es so:
Übergeben Sie die oberen 4 Bytes der 8-Byte-Größe ordnungsgemäß.
Ok, jetzt haben wir alle Raites im C#-Programm und können alles, was wir brauchen, mit LINQ analysieren.
Aber es stellt sich die Frage, wie wir den Mechanismus der Befehle zwischen dem Terminal und der Anwendung organisieren.
Vom Terminal: neue Kerze, neue Raite - Datei übernehmen
Von der Anwendung: Berechnung abgeschlossen, das Ergebnis übernehmen (auf dem Chart zeichnen, ein Geschäft öffnen).
Hat jemand Erfahrung mit einer solchen Implementierung der Interaktion zwischen Terminal und Code?
Ok, jetzt haben wir alle Raites in einem C#-Programm und können LINQ verwenden, um alles perfekt zu analysieren.
Aber es stellt sich die Frage, wie wir den Mechanismus der Befehle zwischen dem Terminal und der Anwendung organisieren können.
Vom Terminal aus: neue Kerze, neue Raten - die Datei holen
Von der Anwendung: Berechnung abgeschlossen, Ergebnis übernehmen (auf dem Chart zeichnen, ein Geschäft öffnen).
Hat jemand Erfahrung mit einer solchen Umsetzung der Interaktion zwischen Terminal und Code?
Bitte beraten Sie mich, was in dieser Situation zu tun ist.
1. ich habe eine neue Datei im Speicher mit 100 Bytes geöffnet.
2. Ich habe 100 Bytes in die Datei geschrieben.
3. Ich habe 100 Bytes in einem anderen Expert Advisor gelesen. Alles ist in Ordnung.
4. Wie kann ich nun 50 oder 200 Bytes in dieselbe Datei schreiben?