FileReadNumber

Lit du fichier du type CSV la chaîne de la position courante jusqu'au délimiteur (ou jusqu'à la fin de la ligne de texte) et transforme la chaîne lue en valeur du type double.

double  FileReadNumber(
   int  file_handle      // handle du fichier
   );

Paramètres

file_handle

[in] Le descripteur de fichier rendu par la fonction FileOpen().

La valeur rendue

La valeur du type double.

Exemple (on utilise le fichier reçu à la suite du travail de l'exemple pour la fonction FileWriteString)

//+------------------------------------------------------------------+
//|                                          Demo_FileReadNumber.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 5
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Overbought & Oversold"
#property indicator_type1   DRAW_COLOR_BARS
#property indicator_color1  clrRedclrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- les paramètres pour la lecture des données
input string InpFileName="RSI.csv";   // le nom du fichier
input string InpDirectoryName="Data"// le nom du répertoire
//--- les tampons d'indicateur
double   open_buff[];
double   high_buff[];
double   low_buff[];
double   close_buff[];
double   color_buff[];
//--- les variables du surachat
int      ovb_ind=0;
int      ovb_size=0;
datetime ovb_time[];
//--- les variables de la survente
int      ovs_ind=0;
int      ovs_size=0;
datetime ovs_time[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- les variables des tailles des tableaux par défaut
   int ovb_def_size=100;
   int ovs_def_size=100;
//--- allouons la mémoire pour les tableaux
   ArrayResize(ovb_time,ovb_def_size);
   ArrayResize(ovs_time,ovs_def_size);
//--- ouvrons le fichier
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV|FILE_ANSI);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Le fichier %s est ouvert pour la lecture",InpFileName);
      PrintFormat("La voie vers le fichier : %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      double value;
      //--- lisons les données du fichier
      while(!FileIsEnding(file_handle))
        {
         //---lisons la première signification dans la chaîne
         value=FileReadNumber(file_handle);
         //--- lisons aux tableaux différents en fonction du résultat de la fonction
         if(value>=70)
            ReadData(file_handle,ovb_time,ovb_size,ovb_def_size);
         else
            ReadData(file_handle,ovs_time,ovs_size,ovs_def_size);
        }
      //--- fermons le fichier
      FileClose(file_handle);
      PrintFormat("Les données sont lues, le fichier %s est fermé",InpFileName);
     }
   else
     {
      PrintFormat("On n' a pas réussi à ouvrir le fichier %s, le code de l'erreur = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- le rattachement des tableaux
   SetIndexBuffer(0,open_buff,INDICATOR_DATA);
   SetIndexBuffer(1,high_buff,INDICATOR_DATA);
   SetIndexBuffer(2,low_buff,INDICATOR_DATA);
   SetIndexBuffer(3,close_buff,INDICATOR_DATA);
   SetIndexBuffer(4,color_buff,INDICATOR_COLOR_INDEX);
//---- l'établissement des valeurs de l'indicateur, qui ne seront pas vus sur le graphique
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| La lecture des données de la chaîne du fichier                                       |
//+------------------------------------------------------------------+
void ReadData(const int file_handle,datetime &arr[],int &size,int &def_size)
  {
   bool flag=false;
//--- lisons jusqu'à ce que nous arrivons à la fin d'une chaîne ou d'un fichier
   while(!FileIsLineEnding(file_handle) && !FileIsEnding(file_handle))
     {
      //--- rapprocherons le chariot, ayant lu le nombre
      if(flag)
         FileReadNumber(file_handle);
      //--- retenons la date courante
      arr[size]=FileReadDatetime(file_handle);
      size++;
      //--- augmentons en cas de nécessité la taille du tableau
      if(size==def_size)
        {
         def_size+=100;
         ArrayResize(arr,def_size);
        }
      //--- on a passé la première itération
      flag=true;
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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);
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
//--- le cycle pour les barres non-traitées
   for(int i=prev_calculated;i<rates_total;i++)
     {
      //--- par défaut 0
      open_buff[i]=0;
      high_buff[i]=0;
      low_buff[i]=0;
      close_buff[i]=0;
      color_buff[i]=0;
      //--- la vérification s'il y a encore des données
      if(ovb_ind<ovb_size)
         for(int j=ovb_ind;j<ovb_size;j++)
           {
            //--- si les dates correspondent, la barre se trouve dans la zone de surachat
            if(time[i]==ovb_time[j])
              {
               open_buff[i]=open[i];
               high_buff[i]=high[i];
               low_buff[i]=low[i];
               close_buff[i]=close[i];
               //--- 0 - la couleur rouge
               color_buff[i]=0;
               //--- augmentons le compteur
               ovb_ind=j+1;
               break;
              }
           }
      //--- la vérification s'il y a encore des données
      if(ovs_ind<ovs_size)
         for(int j=ovs_ind;j<ovs_size;j++)
           {
            //--- si les dates correspondent, la barre se trouve dans la zone de la survente
            if(time[i]==ovs_time[j])
              {
               open_buff[i]=open[i];
               high_buff[i]=high[i];
               low_buff[i]=low[i];
               close_buff[i]=close[i];
               //--- 1 - la couleur bleue
               color_buff[i]=1;
               //---augmentons le compteur
               ovs_ind=j+1;
               break;
              }
           }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Le gestionnaire de l'événement ChartEvent                                    |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam
                  )
  {
//---changeons l'épaisseur de l'indicateur en fonction de l'échelle
   if(ChartGetInteger(0,CHART_SCALE)>3)
      PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   else
      PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);
  }

Voir aussi

FileWriteString