Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 05.02.21
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
AVT befindet sich auf einem aufstrebenden Ast
Standard 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