Раздельный запрос массивов цен, объемов, спредов, времени

Вместо запроса всех характеристик кодировок в виде массива MqlRates, можно читать только данные конкретного поля (цены, объема, спреда или времени) в отдельный массив. Для этого определено несколько функций, действующих по общим принципам, рассмотренным в разделе Обзор Copy-функций для получения массивов котировок.

Следующая схема объединяет описания всех прототипов.

Схема прототипов Copy-функций

Схема прототипов Copy-функций

В скрипте SeriesRates.mq5 воспользуемся функциями копирования цен OHLC, чтобы сравнить их с результатом вызова CopyRates.

void OnStart()
{
   const int N = 10;
   MqlRates rates[];
   
   // запрашиваем и отображаем всю информацию о N барах из массива MqlRates
   PRTF(CopyRates("EURUSD"PERIOD_D1D'2021.10.01', Nrates));
   ArrayPrint(rates);
   
   // теперь запрашиваем цены OHLC раздельно
   double open[], high[], low[], close[];
   PRTF(CopyOpen("EURUSD"PERIOD_D1D'2021.10.01', Nopen));
   PRTF(CopyHigh("EURUSD"PERIOD_D1D'2021.10.01', Nhigh));
   PRTF(CopyLow("EURUSD"PERIOD_D1D'2021.10.01', Nlow));
   PRTF(CopyClose("EURUSD"PERIOD_D1D'2021.10.01', Nclose));
   
   // сравниваем цены полученные разными методами
   for(int i = 0i < N; ++i)
   {
      if(rates[i].open != open[i]
      || rates[i].high != high[i]
      || rates[i].low != low[i]
      || rates[i].close != close[i])
      {
         // здесь мы не должны оказаться
         Print("Data mismatch at "i);
         return;
      }
   }
   
   Print("Copied OHLC arrays match MqlRates array"); // успех: соответствие есть
}

Запустив скрипт, получим в журнале следующие записи.

CopyRates(EURUSD,PERIOD_D1,D'2021.10.01',N,rates)=10 / ok

                 [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]

[0] 2021.09.20 00:00:00 1.17272 1.17363 1.17004 1.17257         58444        0             0

[1] 2021.09.21 00:00:00 1.17248 1.17486 1.17149 1.17252         58514        0             0

[2] 2021.09.22 00:00:00 1.17240 1.17555 1.16843 1.16866         72571        0             0

[3] 2021.09.23 00:00:00 1.16860 1.17501 1.16835 1.17381         68536        0             0

[4] 2021.09.24 00:00:00 1.17379 1.17476 1.17007 1.17206         51401        0             0

[5] 2021.09.27 00:00:00 1.17255 1.17255 1.16848 1.16952         57807        0             0

[6] 2021.09.28 00:00:00 1.16940 1.17032 1.16682 1.16826         64793        0             0

[7] 2021.09.29 00:00:00 1.16825 1.16901 1.15894 1.15969         68964        0             0

[8] 2021.09.30 00:00:00 1.15963 1.16097 1.15626 1.15769         68517        0             0

[9] 2021.10.01 00:00:00 1.15740 1.16075 1.15630 1.15927         66777        0             0

CopyOpen(EURUSD,PERIOD_D1,D'2021.10.01',N,open)=10 / ok

CopyHigh(EURUSD,PERIOD_D1,D'2021.10.01',N,high)=10 / ok

CopyLow(EURUSD,PERIOD_D1,D'2021.10.01',N,low)=10 / ok

CopyClose(EURUSD,PERIOD_D1,D'2021.10.01',N,close)=10 / ok

Copied OHLC arrays match MqlRates array

Напомним, что тиковый объем в поле tick_volume представляет собой простой счетчик тиков за период. Биржевой объем в поле real_volume равен нулю у небиржевых инструментов (как и у EURUSD, в данном случае).

Другой пример использования функции CopyTime был представлен в скрипте SeriesCopy.mq5 в разделе Обзор Copy-функций для получения массивов котировок.