Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   CSV-Datei anlegen, mit Werten füllen, schließen (http://www.expert-advisor.com/forum/showthread.php?t=6744)

LQK 11.08.20 16:21

CSV-Datei anlegen, mit Werten füllen, schließen
 
Hallo,

ein EA soll zur Laufzeit bestimmte Werte (u.a. Spread) zwecks Dokumentation in eine Datei schreiben. Es kann ein übliches Dateiformat sein, txt, csv oder was auch immer. Aus Gründen der Einfachheit habe ich mich vorläufig für CSV entschieden.

Ich denke mal, was ich will müsste eigentlich mit ein paar einfachen Befehlen (FileOpen(), FileWrite() und FileClose()) umzusetzen sein.

Ich habe daher mal ein paar kleine Beispiele aus der MQl-Dokumentation umgesetzt und compiliert.

Hier der Code:

Code:



int OnInit()
  {
 
 
  int handle;
  handle=FileOpen("my_data.csv", FILE_CSV,';');
  if (handle<1)
      {
      Print("File my_data.dat not found, the last error is ", GetLastError());
      return(false);
     
     
 
  datetime orderOpen=OrderOpenTime();
  handle=FileOpen("my_data.csv", FILE_CSV|FILE_WRITE, ';');
  if (handle>0)
  {
  FileWrite(handle, Close[0], Open[0], High[0], Low[0], TimeToStr(orderOpen));
  FileClose(handle);
  }
 
 
  FileClose(handle);
     
     
     



  return(INIT_SUCCEEDED);
  }


Der Code verursacht beim compilieren und zur Laufzeit keine Fehlermeldung.

Ich meinte mit dem Code eine Datei "my_data.csv" angelegt, geöffnet, mit Werten gefüllt und anschließend wieder geschlossen zu haben.

Eine Suche auf dem PC mit "*my_data.csv" führt allerdings nicht zu einem Treffer. Offenbar gibt es die Datei nicht.

Das führt mich zu der Frage, ob ich die Datei nicht erst explizit anlegen muss, bevor ich sie öffnen und mit Werten befüllen kann? Ich dachte, dass mit FileOpen() automatisch eine entsprechende Date angelegt wird, wenn es eine Datei dieses Namens noch nicht gibt. Da keine Fehlermeldung kommt, vermute ich das im Grunde weiterhin.

Wenn ich einen Fehler mache, worin liegt dieser? Wenn ich keinen Fehler mache, warum finde ich die Datei nicht? ;)

--

Besten Dank für jeden konstruktiven Hinweis und Grüße!

LQK

AVT 11.08.20 16:53

Zitat:

Zitat von LQK (Beitrag 44206)
Hier der Code: ...

Der Code verursacht beim compilieren und zur Laufzeit keine Fehlermeldung.

Also bei mir gibt es einen Kompilierungsfehler. AVT

traderdoc 11.08.20 18:16

Ich würde mal meinen, ohne den Code getestet zu haben,, dass
1. das return(false) evtl. beim Compilieren problematisch sein könnte, da die Funktion OnInit vom Typ int ist.
2. So wie der Code im Post steht, ist er schlecht (unübersichtlich) geschrieben.
Es wäre wirklich zukünftig zweckdienlich, mal die Klammerpaare untereinander zu schreiben. Somit ergibt sich folgendes:
Sollte handle < 1 sein, wird das Programm in der übernächsten Zeile mit return(false) aussteigen.
Sollte handle > 0 sein, wird überhaupt nichts geschehen, weil die Klammern falsch gesetzt worden und das Programm springt sofort zu return(INIT_SUCCEEDED);

traderdoc

LQK 12.08.20 01:46

Zitat:

Zitat von AVT (Beitrag 44207)
Also bei mir gibt es einen Kompilierungsfehler. AVT

Aber erst, als Du die fehlende } eingetragen hast? Ist mir gerade erst aufgefallen?

LQK 12.08.20 01:49

Zitat:

Zitat von traderdoc (Beitrag 44209)
Ich würde mal meinen, ohne den Code getestet zu haben,, dass
1. das return(false) evtl. beim Compilieren problematisch sein könnte, da die Funktion OnInit vom Typ int ist.
2. So wie der Code im Post steht, ist er schlecht (unübersichtlich) geschrieben.
Es wäre wirklich zukünftig zweckdienlich, mal die Klammerpaare untereinander zu schreiben. Somit ergibt sich folgendes:
Sollte handle < 1 sein, wird das Programm in der übernächsten Zeile mit return(false) aussteigen.
Sollte handle > 0 sein, wird überhaupt nichts geschehen, weil die Klammern falsch gesetzt worden und das Programm springt sofort zu return(INIT_SUCCEEDED);

traderdoc

Besten Dank für die Hinweise. Habe versucht den Code etwas übersichtlicher zu gestalten:

1. Klammern und Einrückungen verbessert.
2. Auslagern des Codes in eine eigene Funktion mit dem Rückgabewert bool.
3. Einfügen zusätzlicher Returns, um jetzt neu auftretende Compilierungsfehler wegzubekommen.

Hier der neue Code:

Code:

//+------------------------------------------------------------------+
//|                                            Schreibe in Datei.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                            https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+



int OnInit()
  {
 
    testfunktion();   
    return(INIT_SUCCEEDED);
  }
 
 
   
 
  bool testfunktion()
  {
 
 
  int handle;
  handle=FileOpen("my_data.csv", FILE_CSV,';');
  if (handle<1)
        {
        Print("File my_data.dat not found, the last error is ", GetLastError());
        return(false);
        }
     
 
  datetime orderOpen=OrderOpenTime();
  handle=FileOpen("my_data.csv", FILE_CSV|FILE_WRITE, ';');
  if (handle>0)
        {
        FileWrite(handle, Close[0], Open[0], High[0], Low[0], TimeToStr(orderOpen));
        FileClose(handle);
        return(true);
        } 
       
  return(true);
 
  }


Ich habe ja diese beiden kleinen Beispiele aus der Dokumentation entnommen. Weil ich lernen will, wie ich eine Datei anlege, damit arbeite, Werte in diese Schreibe usw.

Der oben gepostete neue Code funktioniert ohne Compilierungsfehler, legt aber immer noch keine Datei an.

Um ehrlich zu sein, ist mir derzeit unklar, was das mit int handle soll und wozu ich überhaupt Rückgabewerte brauche. Warum soll das File vom typ int sein, wieso sollte der handle Werte größer oder kleiner 0 annehmen, und wozu brauche ich einen Rückgabewert, wenn ich doch nur etwa in eine Datei schreiben will? :confused:


Besten Dank für jeden konstruktiven Hinweis und Grüße!
LQK

TogoTiger 12.08.20 07:22

Ich habe zwar schon lange keine Datei mehr erstellt, aber in einem meiner alten EA's steht das so drin:

Code:

int file_handle=FileOpen(OutDirectoryName+"//"+OutFileName,FILE_WRITE|FILE_CSV);
Ohne das jetzt in der Doku nachzuschlagen, meine ich, bei dir fehlt FILE_WRITE

traderdoc 12.08.20 09:05

Der wird auch keine Datei schreiben, solange im Code steht:

if (handle < 1)

Denn sollte keine Datei vorhanden sein, wird handle = -1 sein und damit steigt der EA mit dem return(false) immer wieder hier aus. Und das auch, selbst wenn eine Datei existiert und handle dann 0 wäre.
D.h. sollte handle = -1 sein, dann muss erst einmal eine entsprechende Datei angelegt werden und erst wenn dann nach erneuter Abfrage handle > -1 ist, kann das Beschreiben der Datei beginnen.

traderdoc

RetepM 12.08.20 13:18

Ok, wenn man die mq4-Beispiele nicht umsetzen kann, dann gibt es immer noch die Möglichkeit eine Suchmaschine zu bemühen. Da findet man dann z.B. mit der Suche "script history" fertigen und funktionsfähigen Code.
Selbst hier im Forum gibt es Beispiele.

LQK 12.08.20 21:46

Zitat:

Zitat von TogoTiger (Beitrag 44213)
Ich habe zwar schon lange keine Datei mehr erstellt, aber in einem meiner alten EA's steht das so drin:

Code:

int file_handle=FileOpen(OutDirectoryName+"//"+OutFileName,FILE_WRITE|FILE_CSV);
Ohne das jetzt in der Doku nachzuschlagen, meine ich, bei dir fehlt FILE_WRITE

FILE_WRITE ist in meinem Code vorhanden, hast es wohl nur übersehen. :)

LQK 12.08.20 21:55

Zitat:

Zitat von traderdoc (Beitrag 44214)
Der wird auch keine Datei schreiben, solange im Code steht:

if (handle < 1)


Aber FileOpen() wurde ja bereits vorher ausgeführt. Hätte dann nicht zumindest eine leere Datei angelegt werden müssen?

Zitat:

Denn sollte keine Datei vorhanden sein, wird handle = -1 sein und damit steigt der EA mit dem return(false) immer wieder hier aus. Und das auch, selbst wenn eine Datei existiert und handle dann 0 wäre.
D.h. sollte handle = -1 sein, dann muss erst einmal eine entsprechende Datei angelegt werden und erst wenn dann nach erneuter Abfrage handle > -1 ist, kann das Beschreiben der Datei beginnen.

traderdoc
Die Sache mit dem handle habe ich noch nicht ganz verstanden. Habe auch keinen Eintrag in der Dokumentation gefunden, wo der handle erklärt wird. Ist es so:

Wenn eine Datei angelegt wurde ist der handle 1, wenn eine Datei nicht angelegt wurde, ist der handle -1? Dann wundert es mich aber, dass handle vom Typ int ist und nicht bool.

Habe mir jetzt mal den Wert des Handels ausgeben lassen (siehe Code u.s. rot markiert). Der Wert ist -1. Demnach hat das anlegen einer Datei nicht funkioniert (denke mal, bereits mit FileOpen() müsste eine Datei angelegt worden sein). Aber aus welchem Grund hat das Anlegen der Datei nicht funktioniert?

Code:


//+------------------------------------------------------------------+
//|                                            Schreibe in Datei.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                            https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+



int OnInit()
  {
 
    testfunktion();   
    return(INIT_SUCCEEDED);
  }
 
 
   
 
  bool testfunktion()
  {
 
 
  int handle;
  handle=FileOpen("my_data.csv", FILE_CSV,';');
  if (handle<1)
        {
        Print("File my_data.dat not found, the last error is ", GetLastError());
        Print("Der Handle ist:"  + handle);
        return(false);
        }
     
 
  datetime orderOpen=OrderOpenTime();
  handle=FileOpen("my_data.csv", FILE_CSV|FILE_WRITE, ';');
  if (handle>0)
        {
        FileWrite(handle, Close[0], Open[0], High[0], Low[0], TimeToStr(orderOpen));
        FileClose(handle);
        return(true);
        } 
       
  return(true);
 
 
 
  }



Alle Zeitangaben in WEZ +2. Es ist jetzt 04:27 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum