|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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) extern int StartDay = 1; // start day (1=Monday) extern string EarliestTim = "07:00"; // begin trading day (DElocal 08:00) Code:
string ConfigFile=_Symbol+indName+".cfg"; void WriteConfigFile() { int handle; handle = FileOpen(ConfigFile,FILE_READ|FILE_WRITE|FILE_TXT,0); //FileName,r|w|format,NoDelimiter FileWrite(handle,"ShowHistory="+IntegerToString(ShowHistory)+";\n", //bools "StartDay="+IntegerToString(StartDay)+";\n", //integers "EarliestTim= \""+EarliestTim +"\" ;\n", //strings ); FileClose(handle); //CloseTheFile if(handle<1) { Print(ConfigFile," not found, error code=", GetLastError()); } } Code:
if( FileIsExist(ConfigFile,0) ) ReadConfigFile(); Code:
bool ReadConfigFile() { int handle; handle = FileOpen(ConfigFile,FILE_READ|FILE_TXT|FILE_ANSI); //ReadTextAnsi if(handle!=INVALID_HANDLE) //ValidOpenedFile { string FoundLine; //KeepingTheLine while(!FileIsEnding(handle)) //AsLongAsWeHaveAnotherLine { FoundLine=FileReadString(handle); //ReadUntil"\r\n" Print(FoundLine); //PrintWhatWeRead } FileClose(handle); //FinallyCloseFile } else { Print(ConfigFile," open error, code=", GetLastError()); return(false); } return(true); } Code:
ShowHistory=0; StartDay=1; EarliestTim= "07:00" ; 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); //Resultat: OnInit SHOWHISTORY=false Code:
SHOWHISTORY=StrToInteger(FileReadString(handle)); //Resultat: SHOWHISTORY=false auch wenn es true ist //Config-File: true|true|false|true|.... 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() { string TXT=""; TXT+=" BOOLSHOWHISTORY="+IntegerToString(BOOLSHOWHISTORY); TXT+=" INTEGERSTOPDAY="+IntegerToString(INTEGERSTOPDAY); TXT+=" STRINGPREMARKSIG="+STRINGPREMARKSIG; Print(TXT); } Code:
void ReadUserSettings() { BOOLSHOWHISTORY = BoolShowHistory; INTEGERSTOPDAY = IntegerStopDay; STRINGPREMARKSIG= StringPremarkSig; Print(__FUNCTION__); PrintResultFromConfig(); } -. 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() { ResetLastError(); int handle; handle = FileOpen(ConfigCVS,FILE_CSV|FILE_WRITE,"|"); //FileName,ForWriting,Delimiter if(handle!=INVALID_HANDLE) //ValidOpenedFile { FileWrite(handle, BoolShowHistory,IntegerStopDay,StringPremarkSig ); FileClose(handle); //CloseTheFile } else { Print(__FUNCTION__," FileOpen of ",ConfigCVS," failed, code=", GetLastError()); } } Code:
void CheckReadData() { ResetLastError(); int handle=FileOpen(ConfigCVS,FILE_CSV|FILE_READ,"|"); //FileName,ForReading,Delimiter if(handle>0) { BOOLSHOWHISTORY = StrToInteger(FileReadString(handle)); INTEGERSTOPDAY = StrToInteger(FileReadString(handle)); STRINGPREMARKSIG = FileReadString(handle); if(FileIsEnding(handle)==true) FileClose(handle); //EndReached,CloseTheFile } else { Print(ConfigCVS," open error, code=", GetLastError()); } Print(__FUNCTION__); PrintResultFromConfig(); } A. in OnInit: Code:
IndicatorShortName(indName); // === wenn Konfigurationsdatei existiert, einlesen, sonst Benutzereingaben if( FileIsExist(ConfigCVS,0) ) CheckReadData(); else { Print(ConfigCVS," does not exist"); ReadUserSettings(); } Code:
// === wenn Einstellungen behalten, Konfigurationsdatei schreiben, sonst löschen if(KeepValues) CheckWriteData(); else if( FileIsExist(ConfigCVS,0) && !FileDelete(ConfigCVS,0) ) Print(__FUNCTION__," deleting ",ConfigCVS," failed"); 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 { // === numeration starts at zero hlc3, ohlc1, hlcc4 }; 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 |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|