why not write csv?

 

Hi guys  nayone  can help me  to understund why not  write  the file .csv in File foder?

this  is my code

#property strict


  
double spreadSumCurrentMinute = 0.0;
datetime currentM1BarTime = 0;
string FileName;

//+------------------------------------------------------------------+
int OnInit()
{

string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH); 
 FileName=terminal_data_path+"\\MQL5\\Files\\"+"SpreadSumPerMinute.csv"; 
  
   Print("EA avviato, salvataggio spread in: ", FileName);
   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
void OnTick()
{
   MqlRates m1Rates[];
   if(CopyRates(_Symbol, PERIOD_M1, 0, 2, m1Rates) < 2)
      return;

   datetime barTime = m1Rates[0].time;

   if(currentM1BarTime == 0)
      currentM1BarTime = barTime;

   // Se siamo in un nuovo minuto
   if(barTime != currentM1BarTime)
   {
      // Salva la somma dello spread del minuto appena finito
      SaveSpreadSum(currentM1BarTime, spreadSumCurrentMinute);

      // Resetta contatori per nuovo minuto
      currentM1BarTime = barTime;
      spreadSumCurrentMinute = 0.0;
   }

   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   if(ask == 0 || bid == 0)
      return;

   double spread = ask - bid;

   spreadSumCurrentMinute += spread;
}

//+------------------------------------------------------------------+
void SaveSpreadSum(datetime time, double spreadSum)
{
   // FILE_WRITE apre e sovrascrive sempre il file, quindi per appendere si usa FILE_READ|FILE_WRITE con FileSeek a fine
   // Per sicurezza: apriamo in modalità FILE_READ|FILE_WRITE (file deve esistere o verrà creato)
   int file_handle = FileOpen(FileName, FILE_WRITE|FILE_CSV);
   if(file_handle == INVALID_HANDLE)
   {
      // Se non esiste il file, apriamo in FILE_WRITE per crearlo
      file_handle = FileOpen(FileName, FILE_WRITE|FILE_CSV);
      if(file_handle == INVALID_HANDLE)
      {
         Print(" Errore apertura file ", FileName, ", errore: ", GetLastError());
         return;
      }
   }
   else
   {
      // Se il file esiste, posizioniamoci in fondo per appendere
      FileSeek(file_handle, 0, SEEK_END);
   }

   // Scriviamo data e spread sommato in CSV (es. "2025.05.28 12:30", "0.00023")
   FileWrite(file_handle, TimeToString(time, TIME_DATE|TIME_MINUTES), DoubleToString(spreadSum, 10));

   FileClose(file_handle);

   Print("Salvato spread somma: ", spreadSum, " alle ", TimeToString(time, TIME_MINUTES));
}
 
Stefano Cerbioni:
#property strict    double spreadSumCurrentMinute = 0.0; datetime currentM1BarTime = 0; string FileName; //+------------------------------------------------------------------+ int OnInit() { string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH); FileName=terminal_data_path+"\\MQL5\\Files\\"+"SpreadSumPerMinute.csv";       Print("EA avviato, salvataggio spread in: ", FileName);    return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ void OnTick() {    MqlRates m1Rates[];    if(CopyRates(_Symbol, PERIOD_M1, 0, 2, m1Rates) < 2)       return;    datetime barTime = m1Rates[0].time;    if(currentM1BarTime == 0)       currentM1BarTime = barTime;    // Se siamo in un nuovo minuto    if(barTime != currentM1BarTime)    {       // Salva la somma dello spread del minuto appena finito       SaveSpreadSum(currentM1BarTime, spreadSumCurrentMinute);       // Resetta contatori per nuovo minuto       currentM1BarTime = barTime;       spreadSumCurrentMinute = 0.0;    }    double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);    double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);    if(ask == 0 || bid == 0)       return;    double spread = ask - bid;    spreadSumCurrentMinute += spread; } //+------------------------------------------------------------------+ void SaveSpreadSum(datetime time, double spreadSum) {    // FILE_WRITE apre e sovrascrive sempre il file, quindi per appendere si usa FILE_READ|FILE_WRITE con FileSeek a fine    // Per sicurezza: apriamo in modalità FILE_READ|FILE_WRITE (file deve esistere o verrà creato)    int file_handle = FileOpen(FileName, FILE_WRITE|FILE_CSV);    if(file_handle == INVALID_HANDLE)    {       // Se non esiste il file, apriamo in FILE_WRITE per crearlo       file_handle = FileOpen(FileName, FILE_WRITE|FILE_CSV);       if(file_handle == INVALID_HANDLE)       {          Print(" Errore apertura file ", FileName, ", errore: ", GetLastError());          return;       }    }    else    {       // Se il file esiste, posizioniamoci in fondo per appendere       FileSeek(file_handle, 0, SEEK_END);    }    // Scriviamo data e spread sommato in CSV (es. "2025.05.28 12:30", "0.00023")    FileWrite(file_handle, TimeToString(time, TIME_DATE|TIME_MINUTES), DoubleToString(spreadSum, 10));    FileClose(file_handle);    Print("Salvato spread somma: ", spreadSum, " alle ", TimeToString(time, TIME_MINUTES)); }
double spreadSumCurrentMinute = 0.0;
datetime currentM1BarTime = 0;
string FileName;
int OnInit()
{
FileName="SpreadSumPerMinute.csv"; 
Print("EA avviato, salvataggio spread in: ", FileName);
return INIT_SUCCEEDED;
}
void OnTick()
{
   MqlRates m1Rates[];
   if(CopyRates(_Symbol, PERIOD_M1, 0, 2, m1Rates) < 2)
      return;

   datetime barTime = m1Rates[0].time;

   if(currentM1BarTime == 0)
      currentM1BarTime = barTime;

   // Se siamo in un nuovo minuto
   if(barTime != currentM1BarTime)
   {
      // Salva la somma dello spread del minuto appena finito
      SaveSpreadSum(currentM1BarTime, spreadSumCurrentMinute);

      // Resetta contatori per nuovo minuto
      currentM1BarTime = barTime;
      spreadSumCurrentMinute = 0.0;
   }

   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   if(ask == 0 || bid == 0)
      return;

   double spread = ask - bid;

   spreadSumCurrentMinute += spread;
}

//+------------------------------------------------------------------+
void SaveSpreadSum(datetime time, double spreadSum)
{
   // FILE_WRITE apre e sovrascrive sempre il file, quindi per appendere si usa FILE_READ|FILE_WRITE con FileSeek a fine
   // Per sicurezza: apriamo in modalità FILE_READ|FILE_WRITE (file deve esistere o verrà creato)
   int file_handle = FileOpen(FileName, FILE_WRITE|FILE_READ|FILE_CSV);
   if(file_handle!=INVALID_HANDLE){
      ulong size=FileGetInteger(file_handle,FILE_SIZE);
      // Se il file esiste, posizioniamoci in fondo per appendere
      FileSeek(file_handle, size, SEEK_SET);
      // Scriviamo data e spread sommato in CSV (es. "2025.05.28 12:30", "0.00023")
      FileWrite(file_handle, TimeToString(time, TIME_DATE|TIME_MINUTES), DoubleToString(spreadSum, 10));
      
      FileClose(file_handle);

   Print("Salvato spread somma: ", spreadSum, " alle ", TimeToString(time, TIME_MINUTES));
   }else{
   Print("Cannot save");
   }
}

It needed to have the property FILE_READ too to be able to get file size

File size is then used to move the cursor 

 
thanks