//+------------------------------------------------------------------+ 
//|                                        Demo_FileReadDateTime.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 2 
#property indicator_plots   2 
//---- plot Label1 
#property indicator_label1  "UpSignal" 
#property indicator_type1   DRAW_ARROW 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  4 
//---- plot Label2 
#property indicator_label2  "DownSignal" 
#property indicator_type2   DRAW_ARROW 
#property indicator_color2  clrRed 
#property indicator_style2  STYLE_SOLID 
#property indicator_width2  4 
//--- Parameter zum Lesen von Daten 
input string InpFileName="MACD.csv";  // der Dateiname 
input string InpDirectoryName="Data"; // der Verzeichnisname 
//--- globale Variablen 
int      ind=0;       // Index 
double   upbuff[];    // der Indikator-Puffer der Zeiger nach oben 
double   downbuff[];  // der Indikator-Puffer der Zeiger nach unten 
bool     sign_buff[]; // ein Array von Signalen (true - kaufen, false - verkaufen) 
datetime time_buff[]; // ein Array der Zeit des Eintritts der Signale 
int      size=0;      // die Größe der Array von Signalen 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- öffnen Sie die Datei 
   ResetLastError(); 
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_CSV); 
   if(file_handle!=INVALID_HANDLE) 
     { 
      PrintFormat("%s Datei ist zum Lesen geöffnet",InpFileName); 
      //--- Lesen Sie zuerst die Anzahl der Signale 
      size=(int)FileReadNumber(file_handle); 
      //--- trennen Sie den Speichern für den Arrays 
      ArrayResize(sign_buff,size); 
      ArrayResize(time_buff,size); 
      //--- lesen Sie die Dateidaten 
      for(int i=0;i<size;i++) 
        { 
         //--- Die Zeit des Signals 
         time_buff[i]=FileReadDatetime(file_handle); 
         //--- Der Signalwert 
         sign_buff[i]=FileReadBool(file_handle); 
        } 
      //--- schließen Sie die Datei 
      FileClose(file_handle); 
     } 
   else 
     { 
      PrintFormat("Fehler beim Öffnen der Datei %s, Fehlercode = %d",InpFileName,GetLastError()); 
      return(INIT_FAILED); 
     } 
//--- Arrays-Bindung 
   SetIndexBuffer(0,upbuff,INDICATOR_DATA); 
   SetIndexBuffer(1,downbuff,INDICATOR_DATA); 
//--- geben Sie den Zeichencode für das Rendering in PLOT_ARROW vor 
   PlotIndexSetInteger(0,PLOT_ARROW,241); 
   PlotIndexSetInteger(1,PLOT_ARROW,242); 
//---- erstellen Sie die Indikatorwerte, die im Diagramm nicht sichtbar sein werden 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); 
//--- 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| 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(high,false); 
   ArraySetAsSeries(low,false); 
//--- der Zyklus für die noch unbearbeiteten Bars 
   for(int i=prev_calculated;i<rates_total;i++) 
     { 
      //--- die Voreinstellung 0 
      upbuff[i]=0; 
      downbuff[i]=0; 
      //--- prüfen Sie, ob es noch Daten gibt 
      if(ind<size) 
        { 
         for(int j=ind;j<size;j++) 
           { 
            //--- Wenn die Daten übereinstimmen, dann verwenden Sie den Wert aus einer Datei 
            if(time[i]==time_buff[j]) 
              { 
               //--- zeichnen Sie den Zeiger je nach dem Signal 
               if(sign_buff[j]) 
                  upbuff[i]=high[i]; 
               else 
                  downbuff[i]=low[i]; 
               //--- vergrößern Sie den Zähler 
               ind=j+1; 
               break; 
              } 
           } 
        } 
     } 
//--- den Wert prev_calculated für den nächsten Anruf zurückgeben 
   return(rates_total); 
  } 
 |