FileReadDouble

Legge un numero a doppia-precisione floating point (double) dalla corrente posizione del file binario.

double  FileReadDouble(
   int  file_handle    // File handle
   );

Parametri

file_handle

[in] Il descrittore di file restituito da FileOpen().

Valore restituito

Il valore di tipo double.

Nota

Per più dettagli riguardo l'errore, chiamare GetLastError().

Esempio (il file ottenuto dopo l'esecuzione dell'esempio per la funzione FileWriteDouble è qui utilizzato)

//+--------------------------------------------------------------------------------+
//|                                                        Demo_FileReadDouble.mq5 |
//|                                      Copyright 2013, MetaQuotes Software Corp. | 
//|                                                           https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#property indicator_separate_window
//--- parametri di lettura dei dati
input string InpFileName="MA.csv";    // nome del file
input string InpDirectoryName="Data"// nome della directory
//--- variabili globali
int      ind=0;
int      size=0;
double   ma_buff[];
datetime time_buff[];
//--- buffer indicatore
double   buff[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- apre il file
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s il file è disponibile per la lettura",InpFileName);
      PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- prima, legge la quantità di dati nel file 
      size=(int)FileReadDouble(file_handle);
      //--- alloca la memoria per gli array
      ArrayResize(ma_buff,size);
      ArrayResize(time_buff,size);
      //--- legge i dati dal file
      for(int i=0;i<size;i++)
        {
         time_buff[i]=(datetime)FileReadDouble(file_handle);
         ma_buff[i]=FileReadDouble(file_handle);
        }
      //--- chiude il file
      FileClose(file_handle);
      PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
     }
   else
     {
      PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- lega l'array al buffer indicatore con l'indice 0
   SetIndexBuffer(0,buff,INDICATOR_DATA);
//---- imposta i valori dell'indicatore che non saranno visibili sul chart
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato                                |
//+--------------------------------------------------------------------------------+
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[])
  {
   ArraySetAsSeries(time,false);
//--- il loop per la barra che non è stata ancora maneggiata
   for(int i=prev_calculated;i<rates_total;i++)
     {
      //--- 0 per default
      buff[i]=0;
      //--- controlla se esistono ancora dati
      if(ind<size)
        {
         for(int j=ind;j<size;j++)
           {
            //--- se le date coincidono, viene usato il valore dal file
            if(time[i]==time_buff[j])
              {
               buff[i]=ma_buff[j];
               //--- incrementa il contatore
               ind=j+1;
               break;
              }
           }
        }
     }
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }

Vedi anche

Tipi Real (double, float), StringToDouble, DoubleToString, FileWriteDouble