MetaTrader 5 herunterladen

FileReadStruct

Liest den Inhalt aus der binären Datei in die Struktur, die als Parameter übertragen wird. Lesen wird von der laufenden Position des Dateianzeigers durchgeführt.

uint  FileReadStruct(
   int          file_handle,        // Datei-Handle
   const void&  struct_object,      // Zielstruktur für Einlesen 
   int          size=-1             // Strukturgröße in Bytes 
   );

Parameter

file_handle

[in] Dateittribut der geöffneten binären Datei .

struct_object

[out]  Objekt der angegebenen Struktur. Die Struktur darf keine Strings, dynamischen Arrays, virtuellen Funktionen, Objekte von Klassen sowie keine Pointer auf Objekte und Funktionen beinhalten.

size=-1

[in]  Anzahl der Bytes, die eingelesen werden müssen. Wenn die Größe nicht angegeben wird oder die Anzahl der angegebenen Bytes größer als die Strukturgröße ist, wird die genaue Größe der angegebenen Struktur verwendet.

Rückgabewert

Im Erfolgsfall gibt die Funktion die Anzahl der eingelesenen Bytes zurück. Dateianzeiger wird um dieselbe Zahl der Bytes verschoben.

Beispiel (die Datei wird verwendet, die infolge der Arbeit des Beispiels für die Funktion FileWriteStruct bekommen ist)

//+------------------------------------------------------------------+
//|                                          Demo_FileReadStruct.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_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Candles"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrOrange
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_separate_window
//--- Die Parameter für das Erhalten der Daten
input string  InpFileName="EURUSD.txt"// der Dateiname
input string  InpDirectoryName="Data";  // der Verzeichnisname
//+------------------------------------------------------------------+
//| Struktur für die Speicherung von Daten-Kerzen                    |
//+------------------------------------------------------------------+
struct candlesticks
  {
   double            open;  // Eröffnungspreis
   double            close; // Schlußspreis
   double            high;  // der maximale Preis
   double            low;   // der minimale Preis
   datetime          date;  // Datum
  };
//--- Indikator Buffers
double       open_buff[];
double       close_buff[];
double       high_buff[];
double       low_buff[];
//--- globale Variablen
candlesticks cand_buff[];
int          size=0;
int          ind=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int default_size=100;
   ArrayResize(cand_buff,default_size);
//--- öffnen Sie die Datei
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_BIN|FILE_COMMON);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s Datei ist zum Lesen geöffnet",InpFileName);
      PrintFormat("Pfad zur Datei: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
      //--- lesen Sie die Dateidaten
      while(!FileIsEnding(file_handle))
        {
         //--- zeichnen Sie die Dateien in den Array auf
         FileReadStruct(file_handle,cand_buff[size]);
         size++;
         //--- prüfen Sie das Array für Überbelegung
         if(size==default_size)
           {
            //--- erhöhen die Dimensionalität des Arrays
            default_size+=100;
            ArrayResize(cand_buff,default_size);
           }
        }
      //--- schließen Sie die Datei
      FileClose(file_handle);
      PrintFormat("Die Daten sind gelesen, die Datei %s geschlossen",InpFileName);
     }
   else
     {
      PrintFormat("Fehler beim Öffnen der Datei %s, Fehlercode = %d",InpFileName,GetLastError());
      return(INIT_FAILED);
     }
//--- Bindung von Array zum Indikator-Puffer
   SetIndexBuffer(0,open_buff,INDICATOR_DATA);
   SetIndexBuffer(1,high_buff,INDICATOR_DATA);
   SetIndexBuffer(2,low_buff,INDICATOR_DATA);
   SetIndexBuffer(3,close_buff,INDICATOR_DATA);
//--- der Leerwert
   PlotIndexSetDouble(0,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);
//--- der Zyklus für die noch unbearbeiteten Kerzen
   for(int i=prev_calculated;i<rates_total;i++)
     {
      //--- die Voreinstellung 0
      open_buff[i]=0;
      close_buff[i]=0;
      high_buff[i]=0;
      low_buff[i]=0;
      //--- prüfen Sie, ob es noch Daten gibt
      if(ind<size)
        {
         for(int j=ind;j<size;j++)
           {
            //--- wenn die Daten identisch sind, dann verwenden Sie den Wert aus einer Datei
            if(time[i]==cand_buff[j].date)
              {
               open_buff[i]=cand_buff[j].open;
               close_buff[i]=cand_buff[j].close;
               high_buff[i]=cand_buff[j].high;
               low_buff[i]=cand_buff[j].low;
               //--- 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);
  }

Sehen Sie auch

Strukturen und Klassen, FileWriteStruct