Русский

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

ArrayCopySeries

Копирует массив-таймсерию в пользовательский массив и возвращает количество скопированных элементов.

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

Параметры

array[]

[out]  Ссылка на одномерный числовой массив.

series_index

[in]  Идентификатор массива-таймсерии. Должен быть одним из перечисленных идентификаторов таймсерий.

symbol

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

timeframe

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

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

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

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

Примечание

Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.

Замечание: если series_index - MODE_TIME, то передаваемый в функцию массив должен иметь тип datetime[].

Пример:

datetime daytimes[];
int      shift=10,dayshift,error;
//---- массив Time[] отсортирован в порядке убывания
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
error=GetLastError();
if(error==4066)
  {
   //---- делаем еще 2 попытки чтения
   for(int i=0;i<2; i++)
     {
      Sleep(5000);
      ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
      //---- проверим время текущего дневного бара
      datetime last_day=daytimes[0];
      if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) && Day()==TimeDay(last_day)) break;
     }
  }
if(Time[shift]>=daytimes[0]) dayshift=0;
else
  {
   dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);
   if(Period()<PERIOD_D1) dayshift++;
  }
Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at "TimeToStr(daytimes[dayshift]));