Config Zeilen als Befehle ausführen
Ich versuche Einstellungen über eine Textdatei zu speichern und anzuwenden, aber irgendwo ist noch ein Fehler. (Anmerkung: ne Textdatei deshalb, weil es einfach zu viele sind, sonst würde ich über GlobalVariables gehen.)
Ausgangslage: Benutzereingaben vom Typ bool, integer und string Code:
extern bool ShowHistory = false; // old, historic lines (false) Code:
Code:
if( FileIsExist(ConfigFile,0) ) ReadConfigFile(); Code:
bool ReadConfigFile() Code:
ShowHistory=0; Das aber werden sie nicht - ich habe immer noch die Benutzereinstellungen. Die "FoundLine=FileReadString(handle);" scheint mir der Knackpunkt zu sein, aber auch wenn ich nur "FileReadString(handle);" benutze, komme ich nicht zum Ziel. Wie kann ich den MT dazu zwingen, die Zeilen als Befehle auszuführen (so was wie 'exec Line')? Danke. AVT |
Hi ich baute mir mal eine Funktion, die, die von einem Analyse-Programm erstellte Daten, einliest. Weil ich das für die verschiedensten Paare brauche, lege ich im Verzeichnis "C:\Users\xxx\AppData\Roaming\MetaQuotes\Terminal\ xxx\MQL4\Files\FromExternal\"Symbol()"\" die jeweilige ReadData.csv an. ReadData.csv würde in Deinem Fall 0;1;07:30 enthalten und wie folgt eingelesen werden.
void CheckReadData() { handle=FileOpen("FromExternal/"+Symbol()+"/ReadData.csv", FILE_CSV|FILE_READ,";"); if(handle>0) { ShowHistory = StrToInteger(FileReadString(handle)); StartDay = StrToInteger(FileReadString(handle)); EarliestTim= FileReadString(handle); if(FileIsEnding(handle)==true) FileClose(handle); } } PS Ich lese bei jedem Programmstart zwischen 20 und 50 Variablen. Das funktioniert bei 28 Paar-Instanzen performant und ohne Probleme. In einem Dashboard habe ich das allerdings noch nicht probiert. Gruß |
Zitat:
Aber das macht keinen Unterschied, ob das ne Text- oder CVS-Datei ist. Ich vermute mal, Du hast keine externen Variablen, sondern weist die Werte internen Variablen zu ?? AVT |
Problem bool Variablen
Die integer und string Variablen habe ich hinbekommen (für jede Benutzer-Variable noch eine "Programm-Variable", die zu Beginn entweder den Config- oder den Benutzer-Wert bekommt).
Die Schwierigkeit liegt bei den bool Variablen: Gespeichert werden sie als Text in der Config-Datei, unabhängig davon ob das nun TEXT oder CVS Format ist. Wenn ich sie also aus der Textdatei wieder einlese, dann habe ich ja einen string. Als Benutzerangabe nehme ich Code:
extern bool Variable=true; // oder false Ohne Config-Datei (also wenn die Angaben nicht gesichert werden sollen, sondern nur die aktuellen Benutzereingaben gelten) bekomme ich bei Code:
Print(__FUNCTION__," SHOWHISTORY=",SHOWHISTORY); Code:
SHOWHISTORY=StrToInteger(FileReadString(handle)); Was ist Eure Meinung/Erfahrung dazu? AVT |
(vorläufige) Lösung
1. externe Benutzervariable (Vorgaben in Klammern)
-. extern bool KeepValues = true; // save config (true) -. extern int BoolShowHistory = 1; // show history (1=true) -. extern int IntegerStopDay = 5; // stop at weekday (5) -. extern string StringPremarkSig = "cb"; // name for premarket (cb) 2. interne Zuweisungsvariablen (heißen genauso wie die externen, nur alles Großbuchstaben) -. int BOOLSHOWHISTORY = -1; -. int INTEGERSTOPDAY = -1; -. string STRINGPREMARKSIG = ""; A. Funktion für später, woher welche Werte kommen: wenn die Zeilen zu lang werden, TXT zurücksetzen und nächste Zeile printen Code:
void PrintResultFromConfig() Code:
void ReadUserSettings() -. string indName = "IXDaLi"; // in OnInit: IndicatorShortName(indName); -. string ConfigCVS=_Symbol+indName+".cvs"; // MQL4\Files\ConfigFileName 5. Speichern der Werte in der Speicherdatei: Code:
void CheckWriteData() Code:
void CheckReadData() A. in OnInit: Code:
IndicatorShortName(indName); Code:
// === wenn Einstellungen behalten, Konfigurationsdatei schreiben, sonst löschen Die einzige bool Variable bestimmt ob wir Einstellungen behalten wollen. Bool Variablen, die im Indikator zur Steuerung verwendet werden, gehen nur über den Umweg als integer. Das heißt im ganzen Indikator-Code müssen die Bedingungen von if(BOOLSHOWHISTORY) auf if(BOOLSHOWHISTORY==1) geändert werden. Eine Eigendefinition wie zum Beispiel Code:
enum PPbase //base of Pivot calculation Da es aber (ebenso wie StringToBool) keine StringToEnum gibt, ist mir das ehrlich gesagt Sch...egal. Wenn noch jemand Kommentare hat, gerne her damit; ansonsten hoffe ich, irgendwem hilft das vielleicht. AVT |
Alle Zeitangaben in WEZ +2. Es ist jetzt 15:35 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