FileWrite funktioniert nicht richtig?

 

Hallo,


für ein Expertenmodul will ich ein Logfile mitschreiben.

Eigentlich dachte ich, ich könnte programmieren aber hier weiß ich einfach nicht mehr weiter. 

Ich habe jetzt alles ausprobiert. Dies ist mein letzter Stand:

void debugLog(string txt)
{
   int filehandle;
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   
   Print ("DebugLog aufgerufen." + terminal_data_path);

   filehandle=FileOpen("logfile2.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
   {
      FileWrite(filehandle,TimeCurrent(),Symbol(), txt);
      FileFlush(filehandle);
      Sleep(10);
      FileClose(filehandle);
      Sleep(10);
   }
   else 
   {
      Print("Operation FileOpen erfolglos, Fehler ",GetLastError());
   }

}

Warum funktioniert die Ausgabe nur ein einziges mal? 

Das heisst, der erste Aufruf von debugLog funktioniert. Die Datei wird angelegt, der Eintrag in die Datei geschrieben, das Logfile geschlossen.

Das wars. Danach kommt nie wieder was in diese Datei. 

Es kommt auch keine Fehlermeldung. Es passiert einfach rein gar nichts. 

Kennt jemand das Problem und kann mir sagen, wo das Problem liegt?

Das MQL5-Kochbuch: Schreiben der Historie von Abschlüssen in eine Datei und Erstellen von Bilanzdiagrammen für jedes Symbol in Excel
Das MQL5-Kochbuch: Schreiben der Historie von Abschlüssen in eine Datei und Erstellen von Bilanzdiagrammen für jedes Symbol in Excel
  • www.mql5.com
Bei der Kommunikation in diversen Foren nutze ich oft Beispiele meiner Testergebnisse in der Darstellung in Form von Screenshots von Excel-Diagrammen. Ich werde häufig gebeten, zu erklären, wie solche Diagramme erstellt werden können. Nun habe ich endlich etwas Zeit gefunden, alles in diesem Beitrag zu erklären.
 

Du kannst programmieren, aber nicht lesen?

;)

https://www.mql5.com/de/docs/constants/io_constants/fileflags:

ZB um eine Datei in CSV Format für Lesen und Schreiben zu öffnen, kann die Kombination FILE_READ|FILE_WRITE|FILE_CSV angegeben werden.


und dann auch: https://www.mql5.com/de/docs/files/fileseek

Also:

filehandle=FileOpen("logfile2.csv",FILE_READ|FILE_WRITE|FILE_CSV);
if(..){..}
if(FileSeek(filehandle,0,SEEK_END)==true) {..}
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Eingabe/Ausgabe Konstanten / Flaggen der Dateieroeffnung
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Eingabe/Ausgabe Konstanten / Flaggen der Dateieroeffnung
  • www.mql5.com
Flaggen der Dateieroeffnung - Eingabe/Ausgabe Konstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Als Tipp, schau Mal nach MQLplus enhanced Debugging in der Codebase. Die aktuelle Version findest du in Shared Storage unter dem Projektnamen MQLplus library.

Darin ist eine Header enthalten, lib_debug.mqh.

Diese wird dir Aufschluss geben, sofern du den Code lesen kannst.

Ansonsten kannst du die lib einfach direkt benutzen. Im Grunde ist sie sehr einfach anzuwenden.

Das Makro, welches du suchen würdest, ist "DBG_MSG_VAR(variable)"

Dies gibt dir die Variable aus und, sofern du das wünscht, schreibt sie das auch in eine Log-Datei.

Bei Fragen, fragen.
 

Artikel rund ums Thema Logging

https://www.mql5.com/de/articles/150

Fehler finden und Protokollierung
Fehler finden und Protokollierung
  • www.mql5.com
Der MetaEditor 5 verfügt über ein Feature zur Fehlersuche. Doch Wenn Sie Ihre MQL5 Programme schreiben, möchten Sie oft nicht nur einzelne Werte anzeigen, sondern alle Meldungen sehen können, die während des Tests und der Online-Arbeit auftauchen. Wenn die Inhalte der Protokolldatei groß sind, dann liegt es nahe, die rasche und schnelle Abfrage der benötigten Meldung zu automatisieren In diesem Beitrag geht es um das Finden von Fehlern in den MQL5 Programmen sowie um Methoden der Protokollierung. Darüber hinaus werden wir die Protokollierung in Dateien vereinfachen und LogMon kennen lernen, ein einfaches Programm zur bequemen Ansicht von Protokollen.
 
Carl Schreiber #:

Du kannst programmieren, aber nicht lesen?

;)

https://www.mql5.com/de/docs/constants/io_constants/fileflags:

und dann auch: https://www.mql5.com/de/docs/files/fileseek

Also:

ich mag solche überheblichen Kommentare immer ganz besonders gerne. 

Dieser Stand ist nur der aktuelle, wie ich geschrieben habe und Du ganz bestimmt gelesen haben könntest.


Deine Tips führen im übrigen dazu, dass gar kein Logfile mehr erstellt wird. 

 
stoerti2 #:

ich mag solche überheblichen Kommentare immer ganz besonders gerne. 

Dieser Stand ist nur der aktuelle, wie ich geschrieben habe und Du ganz bestimmt gelesen haben könntest.


Deine Tips führen im übrigen dazu, dass gar kein Logfile mehr erstellt wird. 

Entschuldige, wenn Dich das beleidigt hast, aber es gibt zu viele, die sofort fragen (meistens immer dasselbe), ohne vorher zB. einfach mal in der Dokumentation (zT. mit ausführlichen Beispielen, die man einfach kopieren kann) nachschauen oder hier zu suchen. Es passiert sogar, dass in einem Thread eine Frage gestellt wird, die drei Posts weiter oben bereits beantwortet wurde. Verzeih, wenn ich da einmal zu scherzen versuche.

Außerdem gehört doch das Öffnen und Schreiben von Dateien zur Grundlage des Programmierens.

PS. Hier gibt es eine Liste aller Funktionen mit Kurzbeschreibung, sodass man nach Schlüsselwörtern suchen kann (Ctrl+F): https://www.mql5.com/de/docs/function_indices

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
 
Carl Schreiber #Außerdem gehört doch das Öffnen und Schreiben von Dateien zur Grundlage des Programmierens.

Ganz genau. Und deshalb habe ich schweren Herzens im Forum gefragt, was ich normalerweise nicht mehr tu, wegen genau solcher Antworten. Oder wegen Antworten mit Fragen, warum man das denn so und nicht ganz anders macht.

Ich habe fast eine Woche an diesem blöden Logfile gebastelt und alle mir erdenklichen Variationen probiert. Nichts hat funktioniert. 

Und wer jetzt ganz aufmerksam war, hat sogar gesehen, dass mein gepostetes Beispiel fast dem Manual entspricht, wo drin steht, dass es funktionieren soll.

So von wegen Deinem "Du kannst programmieren aber nicht lesen?"

Selbst, wenn ich den fileopen Beispielquelltext per copy und paste teste, geht es nur mit einer einzigen Zeile. Von daher bringen mir Eure Verweise auf Manuals überhaupt nichts, weil es eben nicht geht. 

Danke an @Dominik Christian Egert, der Tip mit der  MQLplus library war schön, die kannte ich nicht aber die scheint auch keine Logfiles zu können.

Und bei Christians Tip bin ich noch nicht durch.

Ansonsten "aber es gibt zu viele, die sofort fragen (meistens immer dasselbe), ohne vorher zB. einfach mal in der Dokumentation".
Weiß ich, nervt mich selbst. Daher vielleicht ein kurzer Hinweis auf meine Vita:

ca. 1980 angefangen mit Sinclair ZX81, dann ZX Spektrum => autodidaktisch programmieren gelernt

1987 Das erste mal im Internet gewesen mit telnet, ftp und gopher

Seit ca. 1990 täglich mindestens 8 Stunden am Computer rumnerden mit Visual Basic, C, C++, Perl auf Windows, Unix (HPUX, AIX, Solaris, AT&T, BSD) und Linux Rechnern.

Seit 1993 verdiene ich mein mageres Salär hauptberuflich mit der Entwicklung und Begutachtung von hochsicheren Computersystemen.

Reicht das, dass Du mir zugestehst, auch wenn ich manchmal blöd bin und den Wald vor lauter Bäumen nicht sehe, das ich ausreichend weiß, von was ich spreche?

 

Um so weniger verstehe ich jetzt Deine Frage.

  1. Ein einfache Suche nach: csv datei (https://www.mql5.com/de/search#!keyword=csv%20datei) hätte Dich
  2. zu dem geführt: https://www.mql5.com/de/articles/2720
  3. und dann einfach mit Ctrl-F "hinzufügen" suchen und schon steht man über einem Skript, das tut, was Du suchst ("Die finale Script-Code für das Hinzufügen ist wie folgt:":
void OnStart(){
   int h=FileOpen("test.txt",FILE_READ|FILE_WRITE|FILE_ANSI|FILE_TXT);
   if(h==INVALID_HANDLE){
      Alert("Error opening file");
      return;
   }
   FileSeek(h,0,SEEK_END);
   FileWrite(h,"Additional line");
   FileClose(h);
   Alert("Added to file");
}

 

Danke! Dann ist es jetzt gelöst.

Mit Deinem Beispiel oben funktioniert es. 

Mit dem der Doku aber nicht (auch jetzt immer noch nicht, habs extra nochmal getestet) 

https://www.mql5.com/de/docs/files/fileopen

Also damit meine ich das so:


   // int h=FileOpen("test.txt",FILE_READ|FILE_WRITE|FILE_ANSI|FILE_TXT);  // Funktioniert
   // int h=FileOpen("test.txt", FILE_WRITE|FILE_CSV); // Funktioniert nicht 

   int h=FileOpen("logfile2.csv", FILE_READ|FILE_WRITE|FILE_CSV);
   if(h==INVALID_HANDLE){
      Alert("Error opening file");
      return;
   }
   FileSeek(h,0,SEEK_END);
   FileWrite(h,txt);
   FileClose(h);
   
Dokumentation zu MQL5: Dateioperationen / FileOpen
Dokumentation zu MQL5: Dateioperationen / FileOpen
  • www.mql5.com
FileOpen - Dateioperationen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
stoerti2 #:

Ganz genau. Und deshalb habe ich schweren Herzens im Forum gefragt, was ich normalerweise nicht mehr tu, wegen genau solcher Antworten. Oder wegen Antworten mit Fragen, warum man das denn so und nicht ganz anders macht.

Ich habe fast eine Woche an diesem blöden Logfile gebastelt und alle mir erdenklichen Variationen probiert. Nichts hat funktioniert. 

Und wer jetzt ganz aufmerksam war, hat sogar gesehen, dass mein gepostetes Beispiel fast dem Manual entspricht, wo drin steht, dass es funktionieren soll.

So von wegen Deinem "Du kannst programmieren aber nicht lesen?"

Selbst, wenn ich den fileopen Beispielquelltext per copy und paste teste, geht es nur mit einer einzigen Zeile. Von daher bringen mir Eure Verweise auf Manuals überhaupt nichts, weil es eben nicht geht. 

Danke an @Dominik Christian Egert, der Tip mit der  MQLplus library war schön, die kannte ich nicht aber die scheint auch keine Logfiles zu können.

Und bei Christians Tip bin ich noch nicht durch.

Ansonsten "aber es gibt zu viele, die sofort fragen (meistens immer dasselbe), ohne vorher zB. einfach mal in der Dokumentation".
Weiß ich, nervt mich selbst. Daher vielleicht ein kurzer Hinweis auf meine Vita:

ca. 1980 angefangen mit Sinclair ZX81, dann ZX Spektrum => autodidaktisch programmieren gelernt

1987 Das erste mal im Internet gewesen mit telnet, ftp und gopher

Seit ca. 1990 täglich mindestens 8 Stunden am Computer rumnerden mit Visual Basic, C, C++, Perl auf Windows, Unix (HPUX, AIX, Solaris, AT&T, BSD) und Linux Rechnern.

Seit 1993 verdiene ich mein mageres Salär hauptberuflich mit der Entwicklung und Begutachtung von hochsicheren Computersystemen.

Reicht das, dass Du mir zugestehst, auch wenn ich manchmal blöd bin und den Wald vor lauter Bäumen nicht sehe, das ich ausreichend weiß, von was ich spreche?

Doch, kann sie, habe ich ja selber geschrieben.

In der File ist ein Doku, in der steht wie man die Logfile aktiviert (Zeile 28), und in Zeile 1171 bis 1177 ist der Code, welcher die n die Logfile schreibt.