Expert Advisors: Beispiele aus dem Buch „Neuronale Netze für den algorithmischen Handel mit MQL5“ - Seite 2

 

Guten Tag,

ich versuche, das erste Skript aus dem Buch auszuführen, das eine csv-Datei erzeugt.

Sie heißt initial_data.mq5.

Wenn ich das Skript im ersten Schritt ausführe:

If(CopyClose(_Symbol, PERIOD_M5, Start, End, close) <= 0 ||

CopyOpen(_Symbol, PERIOD_M5, Start, End, open) <= 0 ||

CopyHigh(_Symbol, PERIOD_M5, Start, Ende, high) <= 0 ||

CopyLow(_Symbol, PERIOD_M5, Start, Ende, niedrig) <= 0)

zurückgeben;

CopyClose ist immer gleich -1

und das Skript stürzt ab, Wiederholungen helfen nicht und wie ich in den Kommentaren gelesen habe

ist dies eine normale Situation und bedeutet, dass es keine Daten vom Server gibt.

Allerdings verstehe ich nicht ganz, wie der Pfad zu den Datendateien in diesem Skript geschrieben wird.

Es ist in der MQL5-Dokumentation geschrieben:


Zum Beispiel befinden sich die EURUSD-Symboldaten vom MetaQuotes-Demo-Handelsserver im Ordnerterminal_directory\bases\MetaQuotes-Demo\history\EURUSD\.


Und ich habe Dateien mit der Auflösung .hcc und ein Unterverzeichnis \cache mit Dateien wie H4.hc darin


Aber im Skript initial_data.mq5 gibt es nur eine Stelle, an der der Pfad geschrieben wird.

PrintFormat("Korrelationskoeffizienten gespeichert in der Datei %s\\\\Files\\\\%s",

TerminalInfoString(TERMINAL_DATA_PATH), FileName);


I Ausgabe TERMINAL_DATA_PATH

2024.06.16 22:53:39.982 path (EURUSD,M5) dataPath =C:\Benutzer\HPAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075


Was muss ich tun, um den Pfad zu diesen Dateien korrekt anzugeben, oder sollten sie gemäß der MQL5-Logik automatisch aus dem Terminalverzeichnis gehängt werden?

Wie lade ich Daten in eine csv-Datei herunter?


 
bobozel1 #:

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Alle Fragen von Anfängern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes

Aleksey Vyazmikin, 2024.06.18 06:28 Uhr

#define FileName  "correlation.csv"
//+------------------------------------------------------------------+
//| Externe Parameter|
//+------------------------------------------------------------------+
input datetime Start = D'2015.01.01 00:00:00';  // Beginn des Zeitraums
input datetime End = D'2020.12.31 23:59:00';    // Ende des Zeitraums
//--- Öffnen der Datei zum Schreiben von Daten
   int handle = FileOpen(FileName, FILE_WRITE | FILE_CSV | FILE_ANSI, "\t", CP_UTF8);
   if(handle == INVALID_HANDLE)
     {
      PrintFormat("Error of open file %s: %d", FileName, GetLastError());
      return;
     }
FileOpen

Parameter

open_flags

[in] Kombination von Flags, die den Arbeitsmodus mit der Datei festlegen. Die Flags sind wie folgt definiert:
FILE_READ Datei wird zum Lesen geöffnet
FILE_WRITEDatei wird zum Schreiben geöffnet
FILE_BINbinärer Lese-/Schreibmodus (keine Konvertierung von und nach String)
FILE_CSVDatei vom Typ csv (alle geschriebenen Elemente werden in Strings des entsprechenden Typs, Unicode oder Ansi, konvertiert und durch ein Trennzeichen getrennt)
FILE_TXTreine Textdatei (wie csv, aber Trennzeichen wird nicht berücksichtigt)
FILE_ANSIStrings vom Typ ANSI (Einzelbyte-Zeichen)
FILE_UNICODEStrings vom Typ UNICODE (Doppelbyte-Zeichen)
FILE_SHARE_READgemeinsamer Lesezugriff durch mehrere Programme
FILE_SHARE_WRITEgemeinsamer Schreibzugriff durch mehrere Programme
FILE_COMMONSpeicherort der Datei im gemeinsamen Ordner aller Client-Terminals \Terminal\Common\Files.

FileOpen

Hinweis

Aus Sicherheitsgründen ist die Arbeit mit Dateien in der Sprache MQL5 streng kontrolliert. Dateien, die für Dateioperationen mit MQL5-Sprachwerkzeugen verwendet werden, können nicht außerhalb der Datei-"Sandbox" gespeichert werden.

Wenn eine Datei in einer bestimmten Kodierung gelesen werden muss (der Codepage-Parameter mit dem Codepage-Wert ist angegeben), muss das FILE_ANSI-Flag gesetzt werden. Ohne Angabe des Flags FILE_ANSI wird die Textdatei ohne Konvertierung in Unicode gelesen.

Die Datei wird im Ordner des Client-Terminals im Unterordner MQL5\Files geöffnet (oder im Falle von Tests im Verzeichnis MQL5\Files des Testagenten). Wenn unter den Flags FILE_COMMON angegeben ist, wird die Datei im gemeinsamen Ordner aller Client-Terminals \Terminal\Common\Files geöffnet.

Sie können "benannte Kanäle" nach den folgenden Regeln öffnen:

  • Der Kanalname ist eine Zeichenfolge, die die Form haben muss: "\\servername\pipe\pipename", wobei servername der Name des Servers im Netzwerk und pipename der Name des Channels ist. Wenn die Kanäle auf demselben Computer verwendet werden, kann der Servername weggelassen werden, aber stattdessen sollte ein Punkt verwendet werden: "\\.\pipe\pipename". Der Client, der versucht, sich mit dem Kanal zu verbinden, muss den Namen des Kanals kennen.
  • FileFlush() und FileSeek() müssen am Anfang der Datei zwischen den aufeinanderfolgenden Operationen des Lesens aus dem Kanal und des Schreibens in den Kanal aufgerufen werden.

In den obigen Zeilen wird das spezielle Backslash-Zeichen "\" verwendet, so dass beim Schreiben des Namens im MQL5-Programm "\" verdoppelt werden sollte, d. h. das obige Beispiel sollte im Code als "\\\\servername\\pipe\\pipename" geschrieben werden.

Für weitere Details zur Arbeit mit Named Channels lesen Sie bitte den Artikel "Kommunikation mit MetaTrader 5 über Named Channels ohne DLL"


 
Aleksey Vyazmikin #

Ehrlich gesagt, habe ich nichts von der Antwort verstanden, als ob ein Roboter schreiben würde. Ich weiß, wohin die zu erstellende Datei geschrieben wird, aber sie wird nicht erstellt.

Ich habe eine spezielle Frage: Wie kann ich Daten aus .hcc- und .hc-Dateien in eine .csv-Datei schreiben?

Ich führe das Skript initial_data.mq5 aus dem Buch als Ergebnis aus:

CopyClose ist immer -1. Wie kann man das beheben?

Ich habe den Verdacht, dass diese Dateien nicht erkannt werden, weil der Pfad zu den Datendateien nicht richtig geschrieben ist.

Wie schreibe ich den Pfad zu den Datendateien richtig?

In meinem Fall befinden sich die Datendateien im Ordner terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ innerhalb der Sandbox.

Ich kämpfe seit einer Woche mit diesem Problem, habe alles gelesen, aber ich habe keine Lösung gefunden. Bitte helfen Sie mir.

 
bobozel1 #:

Ehrlich gesagt, habe ich nichts von der Antwort verstanden, als ob ein Roboter schreiben würde. Ich weiß, wo die zu erstellende Datei geschrieben wird, aber sie wird nicht erstellt.

Ich habe eine konkrete Frage: Wie kann ich Daten aus .hcc- und .hc-Dateien in eine .csv-Datei schreiben?

Ich führe das Skript initial_data.mq5 aus dem Buch als Ergebnis aus:

CopyClose ist immer -1. Wie kann man das beheben?

Ich habe den Verdacht, dass es diese Dateien einfach nicht sieht, weil der Pfad zu den Datendateien nicht richtig geschrieben ist.

Wie kann man den Pfad zu den Datendateien richtig angeben?

In meinem Fall befinden sich die Datendateien im Ordner terminal_terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ innerhalb der Sandbox.

Ich kämpfe seit einer Woche mit diesem Problem, habe alles gelesen, aber ich habe keine Lösung gefunden. Bitte helfen Sie mir.

Alle Daten werden von der Plattform genommen, dem Benutzer ist es egal, woher das Terminal sie bekommt - aus welcher Datei.

Das Skript arbeitet mit den Daten, die im Diagramm angezeigt werden.

Prüfen Sie, ob es im Chart Daten gibt, für die Sie Kurse abfragen.

 
Aleksey Vyazmikin #:

Alle Daten werden der Plattform entnommen, dem Benutzer ist es egal, woher das Terminal sie bezieht - aus welcher Datei.

Das Skript arbeitet mit den Daten, die im Diagramm angezeigt werden.

Prüfen Sie, ob es Daten auf dem Diagramm gibt, für die Sie Kurse abfragen.

Bitte erklären Sie, was das bedeutet.

Im Skript gibt es einen Bereich

input datetime Start = D'2015.01.01.01 00:00:00'; // Beginn des Zeitraums

input datetime End = D'2020.12.31 23:59:00'; // Ende des Zeitraums

auf M5

Soll ich den EURUSD-Chart auf M5 nehmen, bis 2015.01.01 blättern und dann das Skript darauf ausführen?

Oder kann ich das Skript auf MN laufen lassen? Und bei neuen Ticks geht es wieder an den Anfang?
 
bobozel1 #:

Können Sie bitte erklären, was das bedeutet?

In dem Skript gibt es einen Bereich

input datetime Start = D'2015.01.01.01 00:00:00'; // Beginn des Zeitraums

input datetime End = D'2020.12.31 23:59:00'; // Ende des Zeitraums

auf M5

Muss ich den EURUSD-Chart auf M5 nehmen, bis 2015.01.01 blättern und dann das Skript darauf ausführen?

Oder kann ich das Skript auf MN laufen lassen? Und bei neuen Ticks springt es wieder an den Anfang?

Lesen Sie die Hilfe auf dem Terminal. Und hier ist noch etwas.

Sie werden feststellen, dass es eine Einstellung für die Tiefe der Historie über die maximale Anzahl der Balken im Fenster gibt. Sie müssen das Terminal neu laden, damit die Änderungen wirksam werden.

Es ist also notwendig, die maximale Tiefe der Historie für alle TFs auf einmal um den kleinsten TF einzustellen, der für die Arbeit erforderlich ist.

Es ist klar, dass 100 Balken für Tage und 100 Balken für Minuten die gleiche Tiefe in Balken, aber nicht in Daten ergeben.

Wenn Sie den gewünschten Wert oder "Unbegrenzt" einstellen und das Terminal neu laden, können Sie das Skript für den monatlichen TF ausführen, wenn die Historie für den gewünschten Zeitraum verfügbar ist.


 
Aleksey Vyazmikin #:

Lesen Sie die Terminal-Hilfe. Und hier ist noch eine.

Sie werden erfahren, dass es eine Einstellung der Verlaufstiefe durch die maximale Anzahl von Balken im Fenster gibt. Damit die Änderungen wirksam werden, müssen Sie das Terminal neu laden.

So ist es notwendig, die maximale Tiefe der Geschichte für alle TFs auf einmal durch die kleinste TF, die für die Arbeit erforderlich ist, zu setzen.

Es ist klar, dass 100 Balken für Tage und 100 Balken für Minuten die gleiche Tiefe in Balken, aber nicht in Daten ergeben.

Wenn Sie den gewünschten Wert oder "Unbegrenzt" einstellen und das Terminal neu laden, können Sie das Skript für den monatlichen TF ausführen, wenn die Historie für den gewünschten Zeitraum verfügbar ist.


Ich danke Ihnen! Alles hat funktioniert.
 
bobozel1 #:
Ich danke Ihnen! Es hat geklappt.

Bitte sehr.

 
Das ist nicht das größte Problem. Das Ärgerlichste ist, dass man nach der Optimierung der Parameter nur noch ein Jahr lang gewinnen kann. Ändert man sie für ein weiteres Jahr, funktioniert es nicht mehr. Das bedeutet, dass die Idee des Autors nicht realisierbar ist. Die Parameter können von Jahr zu Jahr sehr unterschiedlich sein. Vielleicht gibt es gar keinen Parametersatz, der jedes Jahr gewinnbringend ist!
 

Vielen Dank , Dmitry , für all deine Bemühungen um dieses Buch. Es ist wirklich nützlich.

In neuronbase.mqh implementieren Sie die ElasticNet Regularization-Methode wie folgt ohne Erklärung in Ihrem Buch.

m_cWeights.m_mMatrix -= m_cWeights.m_mMatrix * Lambda[1] + Lambda[0]

Aber das ist etwas anderes als die Grundformel (+) oder der Keras-Quellcode (+) zum Beispiel.

Bitte erläutern Sie Ihre Implementierungsmethode. Warum Sie nur Lambdas anstelle der vollständigen Formel verwenden und warum Sie Gewichte mit einem von ihnen multiplizieren und mit einem anderen summieren.

Dmitriy Gizlyk
Dmitriy Gizlyk
  • 2024.07.15
  • www.mql5.com
Trader's profile