Dostęp do danych historycznych:   CopyRates()

Funkcja int CopyRates() kopiuje do tablicy dane struktury MqlRates świec dla określonego instrumentu finansowego, określonego przedziału czasowego oraz dla określonej ilości świec. Więcej informacji można znaleźć w specyfikacji MQL4.

Należy podkreślić, że liczenie świec idzie od teraźniejszości do przeszłości, tj. bieżąca świeca ma indeks 0, wcześniejsza 1 itd. Jeśli trzeba skopiować znaną ilość danych, to najlepiej to zrobić do tablicy statycznej. Jeśli ilość danych nie jest znana, to należy kopiować do tablicy dynamicznej. Jeśli operacja kopiowania się powiedzie, funkcja zwróci ilość skopiowanych elementów, inaczej zwróci -1.

Istnieje 3 warianty funkcji:

  • kopiowanie danych w oparciu o pozycję początkową i ilość elementów,
  • kopiowanie danych w oparciu o datę początkową i ilość elementów,
  • kopiowanie danych w oparciu o datę początkową i datę końcową.

Kopiowanie danych w oparciu o pozycję początkową i ilość elementów


Przykład 1

Przykład skryptu, gdzie do dynamicznej tablicy ratesArray[] typu MqlRates skopiowano pełne dane 5 świeć o indeksach od 10 do 14, dla bieżącego instrumentu finansowego _Symbol i bieżącego przedziału czasowego PERIOD_CURRENT . W tym skrypcie, po operacji ustawienia odwrotnej indeksacji, pierwszy element tablicy ratesArray[] o indeksie 0 będzie zawierał dane świecy o indeksie 10, tj. świecy z której zacznie się kopiowanie. Ostatni piąty element tablicy ratesArray[] o indeksie 4 - dane świecy o indeksie 14.

#property strict
void OnStart()
  {
//---
   string          symbolName = _Symbol;        // bieżący instrument finansowy
   ENUM_TIMEFRAMES timeFrame  = PERIOD_CURRENT; // bieżący przedział czasowy
   int             startPos   = 10;             // indeks świecy początkowej
   int             count      = 5;              // ilość kopiowanych świec
   MqlRates        ratesArray[];                /* tablica dynamiczna, do której
                                                   zostaną skopiowane dane */


//--- skopiować dane i sprawdzić czy nie wystąpił błąd
   if(CopyRates(symbolName, timeFrame, startPos, count, ratesArray) < 0)
     {
      Print("Kopiowanie CopyRates() nie powiodło się. Błąd = ",GetLastError());
      return;
     }

//--- ustawić w tablicy odwrotną indeksację
   ArraySetAsSeries(ratesArray, true);
//--- ustawić rozmiar tablicy
   ArrayResize(ratesArray, count);

//--- wyświetlić wynik
   for(int i = 0; i < count; i++)
      Print("Świeca z indeksem ",startPos+i,
            ", time = ",         ratesArray[i].time,
            ", open = ",         ratesArray[i].open,
            ", high = ",         ratesArray[i].high,
            ", low = ",          ratesArray[i].low,
            ", close = ",        ratesArray[i].close,
            ", ticks volume = ", ratesArray[i].tick_volume,
            ", spread = ",       ratesArray[i].spread,
            ", trade volume = ", ratesArray[i].real_volume);
  }

Rys. 1. Przykład stosowania funkcji CopyRates().


Przykład 2

Przykład skryptu, gdzie do statycznej tablicy ratesArray[] skopiowano dane jednej świecy o indeksie 0 dla EURUSD i przedziału czasowego H1.

#property strict
void OnStart()
  {
//--- tablica statyczna z 1 elementem
   MqlRates ratesArray[1];

//--- skopiować dane świecy o indeksie 0 i sprawdzić czy nie wystąpił błąd
   if(CopyRates("EURUSD", PERIOD_H1, 0, 1, ratesArray) < 0)
     {
      Print("Kopiowanie CopyRates() nie powiodło się. Błąd = ",GetLastError());
      return;
     }

//--- wyświetlić wynik
   Print("Dane świecy EURUSD, PERIOD_H1, indeks 0",
         ", time = ",         ratesArray[0].time,
         ", open = ",         ratesArray[0].open,
         ", high = ",         ratesArray[0].high,
         ", low = ",          ratesArray[0].low,
         ", close = ",        ratesArray[0].close,
         ", ticks volume = ", ratesArray[0].tick_volume,
         ", spread = ",       ratesArray[0].spread,
         ", trade volume = ", ratesArray[0].real_volume);
  }

Rys. 2. Przykład stosowania funkcji CopyRates().


Kopiowanie danych w oparciu o datę początkową i ilość elementów


Przykład 3

Przykład skryptu, gdzie do dynamicznej tablicy ratesArray[] skopiowano dane 3 świeć dla EURUSD i przedziału czasowego H4. Data pierwszej świecy to 2016.11.03 12:00 i jej dane będą znajdować się w ratesArray[0]. W ratesArray[1] dane świecy z datą 2016.11.03 08:00, a w ostatnim trzecim elemencie tablicy ratesArray[2] dane świecy 2016.11.03 04:00.

#property strict
void OnStart()
  {
//---
   string          symbolName = "EURUSD";
   ENUM_TIMEFRAMES timeFrame  = PERIOD_H4;
   datetime        startTime  = D'2016.11.03 12:00';
   int             count      = 3;
   MqlRates        ratesArray[];

//--- skopiować dane i sprawdzić czy nie wystąpił błąd
   if(CopyRates(symbolName, timeFrame, startTime, count, ratesArray) < 0)
     {
      Print("Kopiowanie CopyRates() nie powiodło się. Błąd = ",GetLastError());
      return;
     }

//--- ustawić w tablicy odwrotną indeksację
   ArraySetAsSeries(ratesArray, true);
//--- ustawić rozmiar tablicy
   ArrayResize(ratesArray, count);

//--- wyświetlić wynik
   for(int i = 0; i < count; i++)
      Print("ratesArray[",i,"]",
            ", time = ",        ratesArray[i].time,
            ", open = ",        ratesArray[i].open,
            ", high = ",        ratesArray[i].high,
            ", low = ",         ratesArray[i].low,
            ", close = ",       ratesArray[i].close,
            ", ticks volume = ",ratesArray[i].tick_volume,
            ", spread = ",      ratesArray[i].spread,
            ", trade volume = ",ratesArray[i].real_volume);
  }

Rys. 3. Przykład stosowania funkcji CopyRates().


Kopiowanie danych w oparciu o datę początkową i datę końcową


Przykład 4

Przykład skryptu, gdzie do dynamicznej tablicy ratesArray[] skopiowano dane świeć dla EURUSD i przedziału czasowego H4. Data pierwszej świecy 2016.11.03 12:00, a ostatniej 2016.11.03 00:00. W tym układzie funkcja skopiuje dane dla 4 świec.

#property strict
void OnStart()
  {
//---
   string          symbolName = "EURUSD";
   ENUM_TIMEFRAMES timeFrame  = PERIOD_H4;
   datetime        startTime  = D'2016.11.03 12:00';
   datetime        stopTime   = D'2016.11.03 00:00';
   MqlRates        ratesArray[];

//--- skopiować dane i sprawdzić czy nie wystąpił błąd
   if(CopyRates(symbolName, timeFrame, startTime, stopTime, ratesArray) < 0)
     {
      Print("Kopiowanie CopyRates() nie powiodło się. Błąd = ",GetLastError());
      return;
     }

//--- ustawić w tablicy odwrotną indeksację
   ArraySetAsSeries(ratesArray, true);
//--- określić ilość elementów tablicy
   int ratesArraySize = ArraySize(ratesArray);
//--- ustawić rozmiar tablicy
   ArrayResize(ratesArray, ratesArraySize);

//--- wyświetlić wynik
   for(int i = 0; i < ratesArraySize; i++)
      Print("ratesArray[",i,"]",
            ", time = ",        ratesArray[i].time,
            ", open = ",        ratesArray[i].open,
            ", high = ",        ratesArray[i].high,
            ", low = ",         ratesArray[i].low,
            ", close = ",       ratesArray[i].close,
            ", ticks volume = ",ratesArray[i].tick_volume,
            ", spread = ",      ratesArray[i].spread,
            ", trade volume = ",ratesArray[i].real_volume);
  }

Rys. 4. Przykład stosowania funkcji CopyRates().


W przypadku żądania danych na podstawie dat (wariant 2 lub 3), funkcja uwzględnia czas co do sekundy. Jeśli w przykładzie 4 do daty ostatniej świecy dopisać 1 sekundę, tj. data wyglądałaby jako 2016.11.03 00:00:01 to funkcja skopiuje dane nie dla 4, a dla 3 świec (rys 5).

Rys. 5. Przykład stosowania funkcji CopyRates().