Einzelnen Beitrag anzeigen
  #5 (permalink)  
Alt 13.03.20
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard (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);
}
3. Ohne gespeicherte Werte bekommen die internen Zuweisungsvariablen den Wert der Benutzervariable:
Code:
void ReadUserSettings()
{
   BOOLSHOWHISTORY = BoolShowHistory;
   INTEGERSTOPDAY  = IntegerStopDay;
   STRINGPREMARKSIG= StringPremarkSig;
   Print(__FUNCTION__); PrintResultFromConfig();
}
4. Bei gespeicherten Werten werden die Wert aus der Speicherdatei gelesen
-. 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());
   }
}
6. Auslesen und Zuweisen der gespeicherten Werte:
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();
}
7. Steuerung von Speichern oder nicht:
A. in OnInit:
Code:
   IndicatorShortName(indName);
   // === wenn Konfigurationsdatei existiert, einlesen, sonst Benutzereingaben
   if( FileIsExist(ConfigCVS,0) )  CheckReadData();
   else { Print(ConfigCVS," does not exist"); ReadUserSettings(); }
B. in OnDeinit:
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");
Anmerkungen:
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
};
kann man wie eine IntegerVariable behandeln, aber beim Auslesen erhält man eine Warnung: "implicit enum conversion".
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