FileReadString funktioniert nach Neustart nicht

 

Hallo zusammen,

benötige Hilfe: 

Wenn ich mit FileWrite() eine Datei erstelle und abspeichere, kann ich diese mit FileReadString() auslesen. Das funktioniert solange der EA läuft einwandfrei.


Mein Problem ist, dass ich die erzeugten Datien nicht aufrufen kann, wenn ich das Programm anhalte und wieder starte.

Es gibt Daten die ich auch nach PC Neustart mitladen möchte. Darum speichere ich diese in einer CSV-Datei.

mein Code zum Speichern:

void Safe(){

   for(int j=0;j<5;j++){
      for(int i=0;i<8;i++){
         string text= "w1["+j+"]["+i+"].csv";
         int hh=FileOpen(text,FILE_WRITE|FILE_ANSI|FILE_CSV,";");
         if(hh==INVALID_HANDLE){
            Alert("Error opening file");
            return;
         }                           
         FileWrite(hh,DoubleToString(w1[j][i]));       
         FileClose(hh);
      } 
   }
   Alert("Gewichte gespeichert");
}
 

Code zum Auslesen der Dateien:

void Read(){
   for(int j=0;j<5;j++){
      for(int i=0;i<8;i++){
         string text= "w1["+j+"]["+i+"].csv";
         int hh=FileOpen(text,FILE_READ|FILE_ANSI|FILE_CSV,";");
         if(hh==INVALID_HANDLE){
            Alert("Error opening file");
            return;
         }                           
         w1[j][i]=StringToDouble(FileReadString(hh));       
         FileClose(hh);
      } 
   }
   Alert("Gewichte geladen");
}
 
Das Erzeugen des Filehandles gehört VOR die Schleife!
 
Otto Pauser:
Das Erzeugen des Filehandles gehört VOR die Schleife!

in der Schleife rufe ich aber unterschiedliche Dateien auf. 

         string text= "w1["+j+"]["+i+"].csv";
         int hh=FileOpen(text,FILE_READ|FILE_ANSI|FILE_CSV,";")

Das würde ja dann nicht funktionieren oder?

 

sind die Dateien nach dem Neustart noch vorhanden? Was schreibt er für eine Fehlermeldung?

Wo rufst Du diese Dateien auf? braucht er Grunddaten das diese neu gelesen werden?

 

ja die Dateien sind nach dem Neustart vorhanden. Wenn ich diese CSVs aufmache, dann sehe ich auch die richtigen Werte.

Das interessante ist, dass wenn ich dann den EA Test starte und die Read() Funktion aufrufe alle Dateien plötzlich weg sind. 


Man muss gar kein Neustart durchführen. Es reicht einfach den EA Test zu starten zu stoppen und wieder zu starten, dann sind alle Dateien weg.

Nur wenn der EA Test gestartet ist und läuft, dann kann ich die Safe() und Read() Funktionen aufrufen so oft ich will und das funktioniert.


Es wird keine Fehlermeldung ausgegeben. Nach dem Read() Aufruf sind alle Positionen des Arrays =0. Nur so merke ich den Fehler. Gespeichert wird aber 0.5 und wenn ich die CSV-Datei aufrufe dann ist da auch die 0.5.


Read() wird in OnInit aufgrufen und Safe() in OnDeinit().


Ich speichere nur die Zahlen nur ab damit ich den Vorschritt bei einem Neustart nicht verliere. 


ob er Grunddaten braucht kann ich leider nicht sagen, da ich nicht ganz verstehe was du damit meinst.

int OnInit()
  {

  	Read();
   
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
	Safe();
  }



void OnTick()
  {
  // Print("X1= "+x[0]+"   X2= "+x[1]+"   X3= "+x[2]+"   X4= "+x[3]);
   //Rechnung();
  }
 

Update:

er Springt bei if(hh==INVALID_HANDLE) rein führt noch "Error opening file" aus und beendet dann.

Warum ist der Handle invalid nach neuestart des EAs ?


void Read(){
   for(int j=0;j<5;j++){
      for(int i=0;i<8;i++){
         string text= "w1["+j+"]["+i+"].csv";
         int hh=FileOpen(text,FILE_READ|FILE_ANSI|FILE_CSV,";");
         if(hh==INVALID_HANDLE){
            Alert("Error opening file");
            return;
         }                           
         w1[j][i]=StringToDouble(FileReadString(hh));       
         FileClose(hh);
      } 
   }
   Alert("Gewichte geladen");
}
 
Es funktioniert nur in dem Strategietester nicht
 
David Rodriges:
Es funktioniert nur in dem Strategietester nicht
Das ist eine Eigenart vom Tester. Alle lokalen Dateien werden gelöscht. Eine Möglichkeit wäre das Common Verzeichnis zu nutzen. FILE_COMMON
Dokumentation zu MQL5: Dateioperationen / FileOpen
Dokumentation zu MQL5: Dateioperationen / FileOpen
  • www.mql5.com
[in]  Name der geöffneten Datei, kann Unterordner haben. Wenn die Datei für Schreiben geöffnet wird, werden die angegebenen Unterordner erzeugt werden, wenn sie es nicht gibt. FILE_CSV Date des Typs csv (alle geschriebenen Elemente werden in die Zeilen des entsprechenden Typs umgewandelt, unicode oder ansi, und durch Begrenzer getrennt)  ...
 

Wie würde das im Code aussehen? 

Ich bekomme es nicht hin mit dem FILE_COMMON


Die Daten sind aber gespeichert nach dem Testlauf. Erst wenn ich den Testlauf nochmal starte werden diese gelöscht.


Gruß

 

OK super danke. Funktioniert jetzt.


die Zeile ist beim speichern und beim laden so drin:

int hh=FileOpen(text,FILE_WRITE|FILE_ANSI|FILE_CSV|FILE_COMMON,";");


Dadurch kann ich im Strategietester und auch im normalen Handel die Datei aufrufen. Datei wird im gleichen Ordner gespeichert.

Im Tester kann die Datei auch nach einem Neustart abgerufen werden, ohne gelöscht zu werden.


Vielen Dank!