Русский

Справочник MQL4 Операции с массивами ArrayCopyRates

Справка MQL4 одним файлом:

ArrayCopyRates

Копирует в массив данные баров указанного графика и возвращает количество скопированных баров. Существует 2 варианта вызова функции:

int  ArrayCopyRates(
   MqlRates&  rates_array[],   // массив MqlRates, переданный по ссылке
   string     symbol=NULL,     // инструмент
   int        timeframe=0      // таймфрейм
   );

Копирует в двумерный массив вида double RateInfo[][6] данные баров указанного графика и возвращает количество скопированных баров.

int  ArrayCopyRates(
   void&     dest_array[][],    // массив, переданный по ссылке
   string    symbol=NULL,       // инструмент
   int       timeframe=0        // таймфрейм
   );

Параметры

rates_array[]

[out]  Ссылка на массив структур MqlRates.

dest_array[][]

[out]  Ссылка на двумерный массив типа double.

symbol=NULL

[in]  Наименование инструмента (символ валютной пары).

timeframe=0

[in]  Период. Может быть любым значением из перечисления ENUM_TIMEFRAMES.

Возвращаемое значение

Возвращает количество скопированных баров, либо -1 в случае неудачи.

Если копируются данные "чужого" инструмента и/или таймфрейма, то возможна ситуация отсутствия требуемых данных. В этом случае в переменную last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку копирования (см. пример в ArrayCopySeries()).

Примечание

Обычно массив используется для передачи данных в DLL функцию.При использовании первой формы вызова происходит виртуальное копирование таймсерии в массив структур MqlRates. Это означает, что если данные таймсерии обновились, то повторное копирование не требуется - массив rates_array[] по-прежнему будет ссылаться на актуальную версию таймсерии и данные будут корректными всегда.

При использовании второй формы вызова происходит реальное копирование данных в массив dest_array[][], сам массив автоматически перераспределяется, чтобы соответствовать размеру таймсерии (даже если массив был объявлен статическим).

Первое измерение массива содержит количество баров. Второе измерение имеет 6 элементов со значениями:

0 - время (time),
1 - цена открытия (open),
2 - наименьшая цена (low),
3 - наивысшая цена (high),
4 - цена закрытия (close),
5 - объём (volume).

Пример:

#property copyright "Copyright © 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property description "Советник для демонстрации двух вариантов"
#property description "вызова функции ArrayCopyRates()"
//--- массив для физического копирования исторических данных
double   double_array[][6];
//--- массив для получения исторических данных без физического копирования
MqlRates mqlrates_array[];
//--- флаг первого запуска эксперта
bool first_call;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- для лучшей наглядности просим запустить эксперта на минутном таймфрейме
   if(Period()!=PeriodSeconds(PERIOD_M1)/60)
     {
     Alert("Необходимо запустить на M1!");
     return(INIT_FAILED);
     }
//--- это первый запуск
   first_call=true;
//--- всё хорошо
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- удалим с графика комментарии при завершении работы 
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(first_call)
     {
      //--- физически копируем данные в массив double_array
      ArrayCopyRates(double_array,NULL,0);
      //--- виртуальное копирование -> mqlrates_array будет просто ссылаться на данные
      ArrayCopyRates(mqlrates_array,NULL,0); 
      //--- первый запуск уже был
      first_call=false;
     }
   //--- выводим на каждом тике значения элемента с нулевым индексом и видим разницу между ними
   Comment("Значения в массиве double не меняются (реальное копирование):\n",
           "0 - время (time): ",(datetime)double_array[0][0],"\n",
           "1 - цена открытия (open): ",double_array[0][1],"\n"
           "2 - наименьшая цена (low): ",double_array[0][2],"\n"
           "3 - наивысшая цена (high): ",double_array[0][3],"\n"
           "4 - цена закрытия (close): ",double_array[0][4],"\n"
           "5 - объём (volume): ",DoubleToString(double_array[0][5],0),"\n\n",
           "Значения в массиве MqlRates обновляются (виртуальное копирование):\n",
           "0 - время (time): ",mqlrates_array[0].time,"\n",
           "1 - цена открытия (open): ",mqlrates_array[0].open,"\n"
           "2 - наименьшая цена (low): ",mqlrates_array[0].low,"\n"
           "3 - наивысшая цена (high): ",mqlrates_array[0].high,"\n"
           "4 - цена закрытия (close): ",mqlrates_array[0].close,"\n"
           "5 - объём (volume): ",mqlrates_array[0].tick_volume);
  }

ArrayCopyRates