Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4533
Beiträge: 41128
Benutzer: 6.925
Aktive Benutzer: 240
Links: 80
Wir begrüßen unseren neuesten Benutzer: Bonedreamer
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Bonedreame...
vor einem Tag
- Shusuke
vor 2 Tagen
- corvatis
vor 2 Tagen
- jafqe
vor 2 Tagen
- Flizy

Onlineuser
'Wer ist online' anzeigen Benutzer: 3
Gäste: 99
Gesamt: 102
Team: 0
Team:  
Benutzer:  Domke01, Indikator-Trading, RetepM
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 11.08.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 11.08.20
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 433
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von LQK Beitrag anzeigen
Hier der Code: ...

Der Code verursacht beim compilieren und zur Laufzeit keine Fehlermeldung.
Also bei mir gibt es einen Kompilierungsfehler. AVT
Mit Zitat antworten
  #3 (permalink)  
Alt 11.08.20
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.415
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #4 (permalink)  
Alt 12.08.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
Also bei mir gibt es einen Kompilierungsfehler. AVT
Aber erst, als Du die fehlende } eingetragen hast? Ist mir gerade erst aufgefallen?
Mit Zitat antworten
  #5 (permalink)  
Alt 12.08.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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?


Besten Dank für jeden konstruktiven Hinweis und Grüße!
LQK
Mit Zitat antworten
  #6 (permalink)  
Alt 12.08.20
Mitglied
 
Registriert seit: Dec 2015
Beiträge: 76
TogoTiger befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #7 (permalink)  
Alt 12.08.20
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.415
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #8 (permalink)  
Alt 12.08.20
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 205
RetepM befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #9 (permalink)  
Alt 12.08.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von TogoTiger Beitrag anzeigen
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.
Mit Zitat antworten
  #10 (permalink)  
Alt 12.08.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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);
   
   
   
   }
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 12:20 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2020 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------