Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Von einer CSV Datei lesen & Historie des darin enthaltenen Symbols exportieren

Geschrieben

Hallo,

 

kleines Problem. Ich habe eine mq4 Skriptdatei erstellt, die von einer Datei, nennen wir sie "rbin.csv" lesen und Historie der darin enthaltenen Symbolnamen exportieren soll. rbin.csv befindet sich in experts\files. Der Export geht in den selben Ordner. Dass es nicht funktioniert, muss am Lesevorgang liegen, da der Export ohne diesen Einschub funktioniert, die Sektion ab //export conditions ist korrekt. Nur die Interaktion zwischen erst lesen und dann dieses Gelesene exportieren funktioniert noch nicht. Findet jemand den missing Link?

 

Die mq4 Datei muss in den experts\scripts Ordner kiopiert werden.

 

Danke!

read and export.zip

Featured Replies

Geschrieben

Dass es nicht funktioniert, muss am Lesevorgang liegen, da der Export ohne diesen Einschub funktioniert, die Sektion ab //export conditions ist korrekt. Nur die Interaktion zwischen erst lesen und dann dieses Gelesene exportieren funktioniert noch nicht.

Was heißt denn: "funktioniert nicht"? Kommt eine Fehlermeldung beim Kompilieren oder während des Programmlaufs, bricht das Programm ab oder läuft es durch ohne was zu tun? Spontan würde ich schonmal die Dekleration string rPair nicht in die While-Schleife packen. Einmal deklarieren sollte reichen.

Geschrieben

Mach's so, dann geht's!

handle1=FileOpen(FileName,FILE_CSV|FILE_READ," ");   //Leerzeichen!

Geschrieben
  • Autor

@Wogo, danke vielmals! Gutes Auge! Das war's. ;)

 

Kleines verflixtes freaggin' Leerzeichen!

 

@Rainworm, siehe Wogo. Es wurde einfach nichts exportiert.

Geschrieben
  • Autor

Spontan würde ich schonmal die Dekleration string rPair nicht in die While-Schleife packen. Einmal deklarieren sollte reichen.

Das muss so bleiben, sonst wird immer nur die Historie des ersten Symbols exportiert und die anderen ausgelassen.

 

Es gibt noch ein kleines Problem. Wenn ich Leerzeichen verwende und die Historie der kompletten Liste der Symbole der rbin.csv Datei exportieren möchte, dann wird immer das nächst folgende Symbol ausgelasen, von bspw. 5 Paaren werden also nur 3 exportiert

 

Wenn ich aber in der Liste nach jedem Symbol ein Komma setze, bspw. folgende Liste

 

EURUSD,

AUDUSD,

EURJPY,

USDJPY,

GBPUSD

 

 

und im Skript ändere

 

handle1=FileOpen(FileName,FILE_CSV|FILE_READ,',');

 

dann werden die Historien von allen Symbolen der Liste exportiert. Mir scheint also, als wäre Leerzeichen noch nicht das Richtige.

 

Ich habe die Dateien noch mal aktualisiert auf Export von mehreren Paaren.

Desktop.zip

Geschrieben
  • Autor

Wenn ich natürlich am Ende jeder Zeile nachträglich ein Leerzeichen einfüge, dann wird auch Historie für alle Symbole exportiert, aber die rbin.csv Datei wird ohne Leerzeichen und sonstige Delimiter exportiert. Wie müsste also der Delimiter aussehen am Ende von FileOpen(... , so dass er es als eine Aneinanderreihung untereinander ohne Space, Tab, Komma oder Semikolon für alle Symbole erkennt?

 

Für Tab gäbe es ja das '\t'. Gibt es auch etwas für ohne jeglichen Delimiter? Ich hatte erst an sowas gedacht '\n'

Geschrieben

Was passiert denn, wenn du den Delimiter ganz weg läßt? Also

handle1=FileOpen(FileName,FILE_CSV|FILE_READ);

Das müßte eigentlich gehen. Die Defaulteinstellung ist dann zwar ";" aber beim EOL sollte eigentlich kein Delimiter nötig sein.

Geschrieben
  • Autor

Hallo, hatte ich auch schon ausprobiert, aber es werden dann auch nur 3 von 5 exportiert.

Könnte man nicht in die rbin.csv vor dem Lesen ein Komma in jede Zeile "hinein transplatieren"?

Geschrieben
  • Autor

Für VBS habe ich etwas, das ein Komma hinzufügt

 

    Option Explicit
   Const ForReading = 1
   Const ForWriting = 2
   Dim objFSO, objTextFile, strContents
   Dim strFile, strText, strDelimiter

strFile = "C:\\Programme\\MetaTrader\\experts\\files\\rbin.csv"

strDelimiter = "," 

'if you need each entry on a new line	
strDelimiter = strDelimiter & VbCrLf

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objTextFile = objFSO.OpenTextFile(strFile, ForReading, True)
strText = objTextFile.ReadAll	
objTextFile.Close

strText = Replace(strText, VbCrLf, strDelimiter)

Set objTextFile = objFSO.OpenTextFile(strFile, ForWriting, True)
objTextFile.Write(strText)
objTextFile.Close

Set objTextFile = Nothing
set objFSO = Nothing

Geschrieben

Hallo, hatte ich auch schon ausprobiert, aber es werden dann auch nur 3 von 5 exportiert.

Mit den Dateien aus Post #5 klappt's bei mir, wenn ich das zweite FileReadString entferne (wo "null" dran steht).

 

  handle1=FileOpen(FileName,FILE_CSV|FILE_READ," ");
  if(handle1<1)
   {
    Print("File not found, the last error is ", GetLastError());
    return(false);
   }    
   
  int i= 0;
  while(!FileIsEnding(handle1))
  {
   string rPair=FileReadString(handle1); // Pair
   FileReadString(handle1); // null // <-- Zeile streichen!
   Print(rPair);
   i++;       
        
   if (rPair == "EURUSD") Export("EURUSD",1); 
   if (rPair == "AUDUSD") Export("AUDUSD",1);
   if (rPair == "EURJPY") Export("EURJPY",1);
   if (rPair == "USDCHF") Export("USDCHF",1);
   if (rPair == "GBPUSD") Export("GBPUSD",1);          
  }

 

Des Weiteren ist es bei mir vollkommen egal, was als FileOpen-Delimiter angegeben wird, da eine neue Zeile sowieso immer einen neuen Datensatz bedeutet. Du hast ja nicht mehrere Infos nebeneinander. Wogo hat daher Recht:

Die Defaulteinstellung ist dann zwar ";" aber beim EOL sollte eigentlich kein Delimiter nötig sein.

 

 

Und dann kannst du den letzten Block "if (rPair == "xyz") Export("xyz",1);" auch noch anpassen:

 

if (rPair != "") Export(rPair,1);

So ist's schick :wink2:

 

Und dann noch die Dekleration (nicht die ganze) Zeile raus aus der Schleife, dann ist es perfekt :jump: Ich häng den Code mal an.

export_history.mq4

Geschrieben

Ich hab mir mal deinen Code angeschaut. Da ist ein Fehler drin. Du liest 2x hintereinander. Drum exportiert das Script auch nur Zeile 1, 3 und 5.

Machs mal so:

int start() 
{
  ObjectsDeleteAll();
 
  int handle1;
  handle1=FileOpen(FileName,FILE_CSV|FILE_READ);
  if(handle1<1)
   {
    Print("File not found, the last error is ", GetLastError());
    return(false);
   }    
   
  int i= 0;
  while(!FileIsEnding(handle1))
  {
   string rPair=FileReadString(handle1); // Pair
   //FileReadString(handle1); // null
   Print(rPair);
   i++;       
        
   if (rPair == "EURUSD") Export("EURUSD",1); 
   if (rPair == "AUDUSD") Export("AUDUSD",1);
   if (rPair == "EURJPY") Export("EURJPY",1);
   if (rPair == "USDCHF") Export("USDCHF",1);
   if (rPair == "GBPUSD") Export("GBPUSD",1);          
  }
  
 return(0);
}

EDIT: Gratuliere RAiNWORM! Meine Geschwindigkeit läßt auf meinen alten Tagen inzwischen ziemlich nach :cleanglasses:

Geschrieben

EDIT: Gratuliere RAiNWORM! Meine Geschwindigkeit läßt auf meinen alten Tagen inzwischen ziemlich nach :cleanglasses:

Ach, das bestätigt, dass es jetzt funktionieren müsste. Außerdem wollte ich auch mal wieder MQL machen :biggrin:

Geschrieben
  • Autor

Stimmt ihr zwei, bei dem zweiten Filereadstring hatte ich vorher ein Doppelslash davor. *stirnklatsch*

Werd's später testen.

Geschrieben
  • Autor

So hab's kurz angetestet und das abschließende Urteil lautet "Sitzt, passt, wackelt und hat Luft", so wie ich es mag. :)

 

Danke noch mal an die MQL'er!

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.