Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   cvs Datei speichern geht nicht mehr (http://www.expert-advisor.com/forum/showthread.php?t=6907)

AVT 05.02.21 22:57

cvs Datei speichern geht nicht mehr
 
Da sitze ich nun schon den ganzen Tag dran und verstehe einfach nicht, warum das plötzlich nicht mehr geht - ich kriege immer den Fehler 5002 (ERR_FILE_WRONG_FILENAME). In meiner Verzweifelung habe ich einen kurzen Test Indikator geschrieben, damit es übersichtlicher ist.

(Kurz angemerkt, ich rufe den MT als /portable auf - das sollte allerdings keinen Einfluß haben, eigentlich, aber man weiß ja nie).

Code:

#property strict
//===========================================================================
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_type1 DRAW_LINE

//===========================================================================
extern bool              UseConfigFile = true;    // use config file (false)
extern bool              PrintConfig  = true;    // print config infos (false)
extern int                MaPeriod = 20;            //Period
extern ENUM_LINE_STYLE    StyleMa  = STYLE_SOLID;  // style (solid)
extern int                WidthMa  = 1;            // width (1)
extern color              ColorMa  = clrGold;      // color (Gold)

//===========================================================================
double BuffMa[];

string indName = "Tstf";
// ==================================== CVS config file
string TermDataFolder=TerminalInfoString(TERMINAL_DATA_PATH);/Files
string ConfigFile=indName+"_"+_Symbol+"_"+IntegerToString(_Period)+".cvs";
int            MAPERIOD;
ENUM_LINE_STYLE STYLEMA ;
int            WIDTHMA ;
color          COLORMA ;

//===========================================================================
int OnInit()
{
  //ConfigFile=StringConcatenate(TerminalInfoString(TERMINAL_DATA_PATH),"\\MQL4\\Files\\",ConfigFile);
  ConfigFile=StringConcatenate(TermDataFolder,"\\MQL4\\Files\\",ConfigFile);
  Print(__FUNCTION__,": ConfigFile =",ConfigFile);
  // ================================ VariableValues
  if( FileIsExist(ConfigFile) ) ReadConfigFromFile();
  else                          ReadUserConfig();
  if(PrintConfig)
  {
      Print(__FUNCTION__,":"
        " period=",IntegerToString(MAPERIOD),
        " style=",IntegerToString(STYLEMA),
        " width=",IntegerToString(WIDTHMA),
        " color=",ColorToString(COLORMA)
        );
  }
  // ================================ VariableValues
 
  IndicatorBuffers(1);
  SetIndexBuffer(0,BuffMa);
  SetIndexLabel(0,"Ma.");
  SetIndexStyle(0,DRAW_LINE,STYLEMA,WIDTHMA,COLORMA);
 
  return(INIT_SUCCEEDED);
}
//===========================================================================
void OnDeinit(const int reason)
{
  // ================================ ConfigFile
  if(UseConfigFile) SaveConfigToFile();
  else              FileDelete(ConfigFile);
  // ================================ ConfigFile
}
//=============================================================================
void OnChartEvent(const int id, const long &lparam,
                  const double &dparam, const string &sparam  )
{
  // ============ changed chart size or indis properties ====================
  if (id == CHARTEVENT_CHART_CHANGE)
  {
      if( CheckConfigChange() )                    //ChangedProperties
      {
        ReadUserConfig();                          //ReadNewValues
        if(UseConfigFile) SaveConfigToFile();      //SaveImmediately
        else              FileDelete(ConfigFile);  //OrDeletePrevious
      }
  }
}
//===========================================================================
int OnCalculate(const int rates_total,  const int prev_calculated,
                const datetime &time[], const double &open[],
                const double &high[],  const double &low[],
                const double &close[],  const long &tick_volume[],
                const long &volume[],  const int &spread[]        )
{
  int NeededBars=MAPERIOD+2;
  if(rates_total<=NeededBars) return(rates_total);
 
  int limit=rates_total-prev_calculated;
  if(prev_calculated==0) limit=rates_total-NeededBars;
  if(prev_calculated>0)  limit++;
 
  for(int i=limit; i>=0; i--)
      BuffMa[i]=iMA(NULL,0,MAPERIOD,0,MODE_EMA,PRICE_CLOSE,i);
 
  return(rates_total);
}
//=============================================================================
// Config File
//=============================================================================
void ReadUserConfig()
{
  MAPERIOD = MaPeriod;
  STYLEMA  = StyleMa;
  WIDTHMA  = WidthMa;
  COLORMA  = ColorMa;
}
// ====================================
bool CheckConfigChange()
{
  if(MaPeriod != MAPERIOD) return(true);
  if(StyleMa  != STYLEMA)  return(true);
  if(WidthMa  != WIDTHMA)  return(true);
  if(ColorMa  != COLORMA)  return(true);
  return(false);
}
// ====================================
bool SaveConfigToFile()
{
  if( FileIsExist(ConfigFile) ) FileDelete(ConfigFile);

  ResetLastError();
  int FileOpHandle=FileOpen(ConfigFile,FILE_WRITE|FILE_CSV);
  if(FileOpHandle!=INVALID_HANDLE)
  {
      FileWrite(FileOpHandle,
                IntegerToString(MaPeriod),IntegerToString(StyleMa),
                IntegerToString(WidthMa),
                IntegerToString(ColorToARGB(ColorMa,255))
              );
      FileClose(FileOpHandle);
      if(PrintConfig) Print(__FUNCTION__,": saved to ",ConfigFile);
  }
  else
  {
    Print(__FUNCTION__,": ",ConfigFile," not opened for writing, code=",IntegerToString(_LastError));
  }
  return(true);
}
// ====================================
bool ReadConfigFromFile()
{
  ResetLastError();
  int FileOpHandle=FileOpen(ConfigFile,FILE_READ|FILE_CSV);
  if(FileOpHandle!=INVALID_HANDLE)
  {
      while( !FileIsEnding(FileOpHandle) )
      {
        MAPERIOD = (int)            StringToInteger( FileReadString(FileOpHandle) );
        STYLEMA  = (ENUM_LINE_STYLE) StringToInteger( FileReadString(FileOpHandle) );
        WIDTHMA  = (int)            StringToInteger( FileReadString(FileOpHandle) );
        COLORMA  = (color)          StringToInteger( FileReadString(FileOpHandle) );
      }
      FileClose(FileOpHandle);
  }
  else
  {
    Print(__FUNCTION__,": ",ConfigFile," not opened for reading, code=",IntegerToString(_LastError));
  }
  return(true);
}
//=============================================================================

Alle Prints geben die von MT vorgeschriebenen Dateien an:
OnInit: ConfigFile =C:\Users\xxxx\MetaQuotes\Terminal\MT4\MQL4\Files\ Tstf_.DE30Cash_15.cvs

Bei WRONG_FILENAME kam mir der Gedanke, daß der Punkt im _Symbol vielleicht ein Problem darstellt: ich habe also mal den Namen direkt benutzt - hat leider nix geholfen.
Hat jemand ne Idee, warum das plötzlich nicht mehr geht?
Danke. AVT

daybyter 06.02.21 06:51

In welcher Zeile tritt welcher Fehler auf?

AVT 06.02.21 08:33

Zitat:

Zitat von daybyter (Beitrag 45057)
In welcher Zeile tritt welcher Fehler auf?

SaveConfigToFile:
C:\Users\xxxx\MetaQuotes\Terminal\MT4\MQL4\Files\T stf_.DE30Cash_30.cvs not opened for writing, code=5002
(es gibt keine Leerzeichen - auch wenn hier im Text plötzlich Leerzeichen erscheinen)

Das heißt, ich kriege beim FileOpen(ConfigFile,FILE_WRITE|FILE_CSV);
ein INVALID_HANDLE.

Wahrscheinlich würde das beim Lesen genauso sein, da es aber keine Datei gibt, wird das Einlesen gar nicht erst versucht.

AVT

daybyter 06.02.21 09:03

Irgendwie kann ich den Fehler nicht erkennen. Der Browser stellt das Forum abgeschnitten dar.

Probier mal ein File ohne Pfad zu öffnen und schau mal, wo das aufgeht. Ich vermute Dein Pfad ist falsch.

AVT 06.02.21 10:19

Zitat:

Zitat von daybyter (Beitrag 45059)
Irgendwie kann ich den Fehler nicht erkennen. Der Browser stellt das Forum abgeschnitten dar.

Probier mal ein File ohne Pfad zu öffnen und schau mal, wo das aufgeht. Ich vermute Dein Pfad ist falsch.

Ich habe den kompletten Pfad mal rausgenommen und nur den Dateinamen benutzt. Da landet das ohne Fehler genau in dem MQL4\Files\ Ordner.
Für mich ist das ok, aber ich will nicht wissen, was passiert, wenn das im Common Ordner landen soll - wozu habe ich 2 unterschiedliche Pfade, wenn ich lediglich den Dateinamen benutzen kann (und schließlich hatte ich das damals exakt nach Beispielen geschrieben).

Danke für die Idee, daybyter, die erste Hürde ist damit genommen. :)

Die Info wo genau die Config Datei liegt, muß ich dann aber über den Pfad machen (wenn ich schon ein PrintConfig habe, dann erwarte ich als Benutzer, daß mir die genaue Lage angegeben wird und nicht einfach nur "hier hast Du den Dateinamen, such selber wo die Datei ist").
AVT

daybyter 06.02.21 11:08

Das Problem ist halt, dass sich der Pfad ändern kann. Läuft der EA im Tester schreibt mt4 ja woanders hin z. B.

AVT 06.02.21 11:23

Zitat:

Zitat von daybyter (Beitrag 45062)
Das Problem ist halt, dass sich der Pfad ändern kann. Läuft der EA im Tester schreibt mt4 ja woanders hin z. B.

Bei EAs gibts dafür die OnTester() Funktion, die habe ich allerdings nie benutzt (weil MT testen sowieso fürn A... ist), aber rein theoretisch sollte man da dann auch den Dateinamen bestimmen können. Nur so ein Gedanke.
AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:57 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