Files lesen

 

Hallo Zusammen,

kennt sich jemand mit dem lesen von files aus?

ich habe eine .csv Datei in foglendem Format:

Die Datei ist ziemlich groß und nun möchte ich sozusagen jeder M1 Kerze diese Daten übergeben.

mit dem Befehl FileReadString() könnte ich durch eine while schleife jedesmal nach dem Datum suchen und dann die Daten an eine Variable übergeben. Mir scheint das allerdings sehr umständlich und ineffektiv zu sein. Kann mir jemand eine grobe Herangehensweise schildern? Ich tappe hier nämlich völlig im Dunkeln...




 
Wie wäre es, wenn ich in der Oninit die Gesamte Datei in ein Array Packe und dann in der OnTick nach belieben abfrage? Wäre das möglich oder bekomme ich dann wegen den verschiedenen Datentypen (datetime und double) ärger?
 

ich versteh nicht so ganz, was du genau machen willst?

 
amando:

ich versteh nicht so ganz, was du genau machen willst?

Na er will ein csv file einlesen 😊


@Claudius Marius Walter schau dir das mal an

https://www.mql5.com/en/code/24777

Claudius Marius Walter
Claudius Marius Walter
  • 2021.05.05
  • www.mql5.com
Profil des Traders
 

Ich würde eine Struktur definieren und dann davon einen Array:

struct _datas {
        datetime d1,d1;
        double   v1,v2;
...     
};
_datas d[];

Eventuell kann man die Datei lesen mit FileReadStruct(), ansonsten mit FileLoad().

Dann den Array d[] sortieren, um mit einer binären Suche (auch zu programmieren, ist ja kein Array) im Array etwas zu finden.

Oder man schiebt alles in eine SQL-Datenbank.

Dokumentation zu MQL5: Dateioperationen / FileReadStruct
Dokumentation zu MQL5: Dateioperationen / FileReadStruct
  • www.mql5.com
FileReadStruct - Dateioperationen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
amando:

ich versteh nicht so ganz, was du genau machen willst?

Grundsätzlich möchte ich das oben beschriebene File auslesen. Es beinhaltet zusätzliche Kursdaten. Diese Kursdaten möchte ich dann als Zusatzinformation mit in den EA einbetten. Beispielsweise gibt die "Number of Trades" nützliche Informationen über die Marktteilnehmer. Genauso wie das "Taker buy asset volume" einem sagt, wie groß das volumen der Käufer ist.

Carl Schreiber:

Ich würde eine Struktur definieren und dann davon einen Array:

Eventuell kann man die Datei lesen mit FileReadStruct(), ansonsten mit FileLoad().

Dann den Array d[] sortieren, um mit einer binären Suche (auch zu programmieren, ist ja kein Array) im Array etwas zu finden.

Oder man schiebt alles in eine SQL-Datenbank.

Danke Carl,
ich versuche die Lösung ohne SQL_Datenbank zu anzugehen. Klassen oder Strukturen sind noch ziemliches Neuland, weshalb ich an folgender kleinigkeit hängen bleibe:

Als ich das d[] array mir ArraySort() sortieren wollte, kam die Fehlermeldung:

Außerdem verstehe ich in der F1 Hilfe nicht, warum das Array genau sortiert wird. Es soll "aufsteigend in der 1. Dimension sortiert werden". Bedeutet dies, dass es vorher absteigend Sortiert war?

Hier mein Programmcode:

struct _datas
  {
   datetime date;
   double   qouteVolume;
   int      trades;
   double   takerBuyVolume;
   double   takerBuyquoteVolume;  
  };

_datas fileBuffer[];  //bildet ein Array aus der Struktur _datas

int OnInit()
  {
   int default_size=100;
   ArrayResize(fileBuffer,default_size);
   
   ResetLastError();
   
   int fileHandle = FileOpen(fileName,FILE_TXT|FILE_WRITE|FILE_READ,",");
   if(fileHandle != INVALID_HANDLE)
      {
       while(!FileIsEnding(fileHandle))
           {
            FileReadStruct(fileHandle,fileBuffer[size]);
            size++;
           }
           
       if(size==default_size)
           {
            
            default_size+=100;   //--- erhöhen die Dimensionalität des Arrays
            ArrayResize(fileBuffer,default_size);
           }
      }
      
   else //Fehlermeldung
      {
       Print("File Handle create error: ", GetLastError());
       return(INIT_FAILED);
      }
      
     ArraySort(fileBuffer); //Array sortieren

 return(INIT_SUCCEEDED);
   
  }
 

Ein struct kann nicht durch ArraySort sortiert werden, nur mehrdim. Array, das müsste man selbst programmieren.

Ich weiß nicht, welches interne Datenformat eine Datei haben muss, damit FileReadStrruct() funktioniert. Schreib mal eine Datei und versuch sie mit einem normalen Editor zu lesen, ich vermute das geht nicht.

Kennst Du das Beispiel für FileLoad(): struct  schreiben und lesen.

Dokumentation zu MQL5: Dateioperationen / FileLoad
Dokumentation zu MQL5: Dateioperationen / FileLoad
  • www.mql5.com
FileLoad - Dateioperationen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Claudius Marius Walter:
Grundsätzlich möchte ich das oben beschriebene File auslesen. Es beinhaltet zusätzliche Kursdaten. Diese Kursdaten möchte ich dann als Zusatzinformation mit in den EA einbetten. Beispielsweise gibt die "Number of Trades" nützliche Informationen über die Marktteilnehmer. Genauso wie das "Taker buy asset volume" einem sagt, wie groß das volumen der Käufer ist.

Danke Carl,
ich versuche die Lösung ohne SQL_Datenbank zu anzugehen. Klassen oder Strukturen sind noch ziemliches Neuland, weshalb ich an folgender kleinigkeit hängen bleibe:

Als ich das d[] array mir ArraySort() sortieren wollte, kam die Fehlermeldung:

Außerdem verstehe ich in der F1 Hilfe nicht, warum das Array genau sortiert wird. Es soll "aufsteigend in der 1. Dimension sortiert werden". Bedeutet dies, dass es vorher absteigend Sortiert war?

Hier mein Programmcode:

Warum nimmst du nicht die fertige Bibliothek?

https://www.mql5.com/en/code/24777

CSV file reader for MQL5
CSV file reader for MQL5
  • www.mql5.com
This class was developed to exchange data between MetaTrader 5 and CSV files. It converts the strings read from the CSV file to double and integer values depending of the type of the columns. Two producers of CSV files are most important for me. The most important producer are spreadsheet programs, i.e. LibreCalc. Manually entered CSV are the other kind of CSV files I had in mind. Be aware that this class do not use the standard library FileCsv.mqh etc. Instead it works with text files. It splits text lines into fields. Maximum speed and low memory usage were no development goals. This class may not be suited for large datasets or time critical operations. I would not use CSV files if speed was my main goal.
 
Christian:

Warum nimmst du nicht die fertige Bibliothek?

https://www.mql5.com/en/code/24777

Ich wollte es erst von Grund auf verstehen, allerdings wird das wohl so nichts.

Bei deinem Beispiel stieß ich dafür auf Hyroglyphen (siehe kommentarzeilen)...

Finde es besonders schwer solche Begriffe zu emtschlüsseön, da sie nicht in der Hilfe erwähnt werden.

int CCsvReader::Open(const string file_name,
                     const int open_flags,
                     ushort delimeter='\t')
  {
   m_seperator=delimeter;

// As we we use CFileTxt and want to read a whole line
// we have to change the supplied open_flags,
// because the user of this class may not expect this.
   int t_openflags=open_flags;
// Remove attributs not supported or not wanted
   t_openflags     &= (~0) ^ FILE_ANSI;  // was bedeutet   &= (~0) ^  ????
   t_openflags     &= (~0) ^ FILE_CSV;
   t_openflags     &= (~0) ^ FILE_WRITE;
   t_openflags     &= (~0) ^ FILE_REWRITE;
// Add attributs  wanted      
   t_openflags     |=FILE_UNICODE;       // was bedeutet    |=  ????
   t_openflags     |=FILE_TXT;
   t_openflags     |=FILE_READ;
   t_openflags     |=FILE_SHARE_READ;

   return CFile::Open(file_name,t_openflags);
  }


Auch in der Funktion sind zeichen, die ich so nie gesehen habe:

PrintFormat("%s %s lot %f price %f" );  //%s %s lot %f price %f was ist das :D ?
 
PrintFormat("%s %s lot %f price %f" );  //%s %s lot %f price %f was ist das :D ?
Auch in der Funktion sind zeichen, die ich so nie gesehen habe:


Steht alles in der Doku.. Im Editor den Textkursor auf PrintFormat stellen und F1 drücken. Ist alles erklärt und Beispiele gibt es auch noch.

Wenn Du Dinge wie ~ und/oder ^ nachscheuen willst, auch die Doku (F1) => Inhalt => Grundlagen => Operationen und Ausdrücke. (Bei anderen Ausdrücken halt durch alle Kapitel mal durchklicken.

~ ist eine Operation direkt der Bits. Es geht da ja um Flags, also einfache JA-Nein-Schalter, ein Bit jeweils reicht da ja aus. Ich muss das jetzt nicht haben, aber wenn es funktioniert, nehme ich das halt quasi als Black Box.

Das Lesen einer cvs-Datei mach ich so, weil es am wenigsten Code-Zeilen benötigt:

int hdl  = FileOpen(fName,FILE_READ|FILE_SHARE_READ|FILE_BIN|FILE_COMMON);
if(hdl < 0) {/*  Fehlermeldung  */}
string c, allLines[], allCells[], 
       f = FileReadString(hdl,(int)FileSize(hdl)); // lese ganze Datei
FileClose(hdl);
int nZ,nL = StringSplit(f,StringGetCharacter("\n",0),allLines); // jetzt hab ich ein Array mit alle Zeilen
while(nL-->0) {
   nZ = StringSplit( allLines[nL] ,StringGetCharacter(";",0),allCells); // jetzt hab ich ein Array mit allen Zellen der Zeile
   while(nZ-->0) {
      c = allCells[nZ]; // alle Zellen werden verarbeitet
      ...
   }
}
/* ungetestet */

Ist halt wenig Code, leicht zu lesen und zu verstehen - aber es ist alles rückwärts.

Übrigens, wenn ich eine Funktion suche, deren Name mir gerade nicht einfällt, verwende ich das hier: https://www.mql5.com/de/docs/function_indices.

Da kann man ein bisschen nach Schlüsselwörtern suchen.

Dokumentation zu MQL5: MQL5 Funktionenliste
Dokumentation zu MQL5: MQL5 Funktionenliste
  • www.mql5.com
MQL5 Funktionenliste - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Junge, das wird so nichts.

Mach ne SQL in Memory und nutze diese als Datenspeicher.

Du wirst sonst verrückt.

Mag am Anfang schwer sein, lohnt aber hinten raus.