CopyRates

Получает в матрицу или вектор исторические серии структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.

При этом данные будут скопированы таким образом, что самый старый по времени элемент помещается в начало матрицы/вектора. Существует 3 варианта метода.

Обращение по начальной позиции и количеству требуемых элементов

bool  matrix::CopyRates(
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period,       // период
   ulong            rates_mask,   // комбинация флагов для указания запрашиваемых серий
   ulong            start,        // номер начального бара, с которого начнем копировать 
   ulong            count         // сколько копируем
   );

Обращение по начальной дате и количеству требуемых элементов

bool  matrix::CopyRates(
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period,       // период
   ulong            rates_mask,   // комбинация флагов для указания запрашиваемых серий
   datetime         from,         // с какой даты 
   ulong            count         // сколько копируем
   );

Обращение по начальной и конечной датам требуемого интервала времени

bool  matrix::CopyRates(
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period,       // период
   ulong            rates_mask,   // комбинация флагов для указания запрашиваемых серий
   datetime         from,         // с какой даты 
   datetime         to            // по какую дату
   );

Для вектора методы аналогичны.

Обращение по начальной позиции и количеству требуемых элементов

bool  vector::CopyRates(
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period,       // период
   ulong            rates_mask,   // комбинация флагов для указания запрашиваемых серий
   ulong            start,        // номер начального бара, с которого начнем копировать 
   ulong            count         // сколько копируем
   );

Обращение по начальной дате и количеству требуемых элементов

bool  vector::CopyRates(
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period,       // период
   ulong            rates_mask,   // комбинация флагов для указания запрашиваемых серий
   datetime         from,         // с какой даты 
   ulong            count         // сколько копируем
   );

Обращение по начальной и конечной датам требуемого интервала времени

bool  vector::CopyRates(
   string           symbol,       // имя символа
   ENUM_TIMEFRAMES  period,       // период
   ulong            rates_mask,   // комбинация флагов для указания запрашиваемых серий
   datetime         from,         // с какой даты 
   datetime         to            // по какую дату
   );

Параметры

symbol

[in]  Символ.

period

[in]  Период.

rates_mask

[in]  Комбинация флагов из перечисления ENUM_COPY_RATES, указывающих тип запрашиваемых серий. При копировании в вектор можно указать только одно значение из перечисления ENUM_COPY_RATES, иначе будет ошибка.

start

[in]  Номер первого копируемого элемента.

count

[in]  Количество копируемых элементов.

from

[in]  Время бара, соответствующее первому элементу.

to

[in]  Время бара, соответствующее последнему элементу.

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

Возвращает true в случае успеха, иначе false в случае ошибки.

Примечание

Если интервал запрашиваемых данных полностью находится вне доступных данных на сервере, то функция возвращает false. В случае если запрашиваются данные за пределами TERMINAL_MAXBARS (максимальное количество баров на графике), функция также вернет false.

При запросе данных из эксперта или скрипта, будет инициирована загрузка с сервера, если локально этих данных у терминала нет, либо начнется построение нужной таймсерии, если данные можно построить из локальной истории, но они еще не готовы. Функция вернет то количество данных, которые будут готовы к моменту истечения таймаута, но загрузка истории будет продолжаться, и при следующем аналогичном запросе функция вернет уже больше данных.

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.

ENUM_COPY_RATES

Перечисление ENUM_COPY_RATES содержит флаги для указания типа данных, которые необходимо передать в матрицу или массив. Комбинация флагов позволяет за один запрос получить несколько серий из истории.  При этом порядок строк в матрице будет соответствовать порядку значений в перечислении ENUM_COPY_RATES — то есть строка с данными High будет в матрице всегда выше строки с данными Low.

Идентификатор

Значение

Описание

COPY_RATES_OPEN

1

Серия цен Open

COPY_RATES_HIGH

2

Серия цен  High

COPY_RATES_LOW

4

Серия цен  Low

COPY_RATES_CLOSE

8

Серия цен  Close

COPY_RATES_TIME

16

Серия Time (время открытия бара)

 

Получение времени во float вектора и матрицы (vectord и matrixf), приводит к потерям ~100 секунд, т.к. точность float сильно ограничена, и целые числа со значением более 1<<24 не могут быть точно представлены во float.

COPY_RATES_VOLUME_TICK

32

Тиковые объемы

COPY_RATES_VOLUME_REAL

64

Торговые объемы

COPY_RATES_SPREAD

128

Спреды

Комбинация

 

 

COPY_RATES_OHLC

15

Серии Open, High, Low и Close

COPY_RATES_OHLCT

31

Серии Open, High, Low, Close и Time

Расположение данных

 

 

COPY_RATES_VERTICAL

32768

Серии копируются в матрицу вдоль вертикальной оси. Это означает, что полученные значения серии в матрице расположены вертикально — то есть самые старые данные находятся в первой строке, а самые свежие в последней строке матрицы.

 

По умолчанию при копировании в матрицу серии добавляются вдоль горизонтальной оси.

 

Флаг имеет значение только при копировании в матрицу.

Пример:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- получим котировки в матрицу
  matrix matrix_rates;
  if(matrix_rates.CopyRates(Symbol(), PERIOD_CURRENTCOPY_RATES_OHLCT110))
    Print("matrix rates: \n"matrix_rates);
  else
    Print("matrix_rates.CopyRates failed. Error "GetLastError());
//--- проверка
  MqlRates mql_rates[];
  if(CopyRates(Symbol(), PERIOD_CURRENT110mql_rates)>0)
   {
    Print("mql_rates array:");
    ArrayPrint(mql_rates);
   }
  else
    Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error "GetLastError());
//--- получим котировки в вектор = неправильный вызов
  vector vector_rates;
  if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENTCOPY_RATES_OHLC115))
    Print("vector_rates COPY_RATES_OHLC: \n"vector_rates);
  else
    Print("vector_rates.CopyRates COPY_RATES_OHLC failed. Error "GetLastError());
//--- получим цены закрытия в вектор
  if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENTCOPY_RATES_CLOSE115))
    Print("vector_rates COPY_RATES_CLOSE: \n"vector_rates);
  else
    Print("vector_rates.CopyRates failed. Error "GetLastError());
 };
/*
   matrix rates:
   [[0.99686,0.99638,0.99588,0.99441,0.99464,0.99594,0.99698,0.99758,0.99581,0.9952800000000001]
    [0.99708,0.99643,0.99591,0.9955000000000001,0.99652,0.99795,0.99865,0.99764,0.99604,0.9957]
    [0.9961100000000001,0.99491,0.99426,0.99441,0.99448,0.99494,0.9964499999999999,0.99472,0.9936,0.9922]
    [0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
    [1662436800,1662440400,1662444000,1662447600,1662451200,1662454800,1662458400,1662462000,1662465600,1662469200]]
   mql_rates array:
                    [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
   [02022.09.06 04:00:00 0.99686 0.99708 0.99611 0.99641          4463        0             0
   [12022.09.06 05:00:00 0.99638 0.99643 0.99491 0.99588          4519        0             0
   [22022.09.06 06:00:00 0.99588 0.99591 0.99426 0.99441          3060        0             0
   [32022.09.06 07:00:00 0.99441 0.99550 0.99441 0.99464          3867        0             0
   [42022.09.06 08:00:00 0.99464 0.99652 0.99448 0.99594          5280        0             0
   [52022.09.06 09:00:00 0.99594 0.99795 0.99494 0.99697          7227        0             0
   [62022.09.06 10:00:00 0.99698 0.99865 0.99645 0.99758         10130        0             0
   [72022.09.06 11:00:00 0.99758 0.99764 0.99472 0.99581          7012        0             0
   [82022.09.06 12:00:00 0.99581 0.99604 0.99360 0.99528          6166        0             0
   [92022.09.06 13:00:00 0.99528 0.99570 0.99220 0.99259          6950        0             0
   vector_rates.CopyRates COPY_RATES_OHLC failedError 4003
   vector_rates COPY_RATES_CLOSE:
   [0.9931,0.99293,0.99417,0.99504,0.9968399999999999,0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
*/

Смотри также

Доступ к таймсериям и индикаторам, CopyRates