Операции с массивами

Группа функций для работы с массивами.

Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 0 до размер измерения-1. В частном случае одномерного массива из 50 элементов обращение к первому элементу будет выглядеть как array[0], к последнему элементу — array[49].

При помощи данных функций (кроме тех функций, которые меняют качественные и количественные характеристики массива) могут обрабатываться и предопределенные массивы-таймсерии Time[], Open[], High[], Low[], Close[], Volume[]

ArrayBsearch

int ArrayBsearch (double array[], double value, int count=WHOLE_ARRAY, int start=0, int direction=MODE_ASCEND)

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

Замечание: двоичный поиск обрабатывает только сортированные массивы. Для сортировки числового массива используется функция ArraySort().

Параметры:

array[] — Числовой массив для поиска.
value — Значение для поиска.
count — Количество элементов для поиска. По умолчанию, ищется в целом массиве.
start — Начальный индекс для поиска. По умолчанию, поиск начинается с первого элемента.
direction — Направление поиска. Может быть любой из следующих величин:
MODE_ASCEND поиск в направлении возрастания,
MODE_DESCEND поиск в направлении убывания.

Пример:

datetime daytimes[];
int shift=10,dayshift;// Все Time[] серии времени отсортировано в направлении убывания

ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);

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]));

 

ArrayCopy

int ArrayCopy (void dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY)

Копирует один массив в другой. Массивы должны иметь одинаковый тип. Массивы типа double[], int[], datetime[], color[], и bool[], можно копировать как массивы одного типа.
Возвращает количество скопированных элементов.

Параметры:

dest[] — Массив-приемник.
source[] — Массив-источник.
start_dest — Начальный индекс для приемного массива. По умолчанию, стартовый индекс — 0.
start_source — Начальный индекс для исходного массива. По умолчанию, стартовый индекс — 0.
count — Количество элементов, которые нужно скопировать. По умолчанию, весь массив (WHOLE_ARRAY).

Пример:

void OnTick() 
{ 
   int src_data[10]; 

   for (int i=0; i<ArraySize(src_data); i++)
      src_data[i]=i; 

   int dst_data[]; 

   //--- копируем данные из массива src_data[] в массив dst_data[] 
   ArrayCopy(dst_data,src_data,0,0,WHOLE_ARRAY); 

   //--- вывод скопированных данных 
   PrintFormat("Copied array size=%d",ArraySize(dst_data)); 

   for (int i=0; i<ArraySize(dst_data); i++)
      PrintFormat("index=%d, value=%d",i,dst_data[i]); 
}

 

ArrayCopyRates

int ArrayCopyRates (void dest_array[], string symbol=NULL, int timeframe=0)

Копирует в двухмерный массив, вида RateInfo[][6], данные баров текущего графика и возвращает количество скопированных баров, либо -1 в случае неудачи. Первое измерение содержит количество баров. Второе измерение имеет 6 элементов со значениями:

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

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

Замечания: обычно массив используется, чтобы передать данные в DLL функцию.
Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа.

Параметры:

dest_array[] — Ссылка на двумерный массив.
symbol — Наименование инструмента (символ валютной пары).
timeframe  — Период. Может быть любым значением из перечисленных периодов.

Пример:

#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); 
  }

 

ArrayCopySeries

int ArrayCopySeries (void array[], int series_index, string symbol=NULL, int timeframe=0)

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

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

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

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

Параметры:

array[] — Ссылка на одномерный числовой массив.
series_index — Идентификатор массива-таймсерии. Должен быть одним из перечисленных идентификаторов таймсерий.
symbol — Наименование инструмента (символ валютной пары).
timeframe — Период графика (таймфрейм). Может быть любым значением из перечисленных периодов.

Пример:

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]));

 

ArrayDimension

int ArrayDimension (object array[])

Возвращает ранг многомерного массива.

Параметры:

array[] — Массив, для которого будет возвращен ранг.

Пример:

int num_array[10][5];
int dim_size;
dim_size=ArrayDimension(num_array); // dim_size=2

 

ArrayGetAsSeries

bool ArrayGetAsSeries (object array[])

Возвращается TRUE, если массив организован как таймсерия (элементы массива индексируются от последнего к первому), иначе возвращается FALSE.

Параметры:

array[] — Проверяемый массив.

Пример:

if(ArrayGetAsSeries(array1)==true)
  Print("array1 индексирован как таймсерия");
else 
  Print("array1 индексирован обычно (слева направо)");

 

ArrayInitialize

int ArrayInitialize (void array[], double value)

Устанавливает все элементы числового массива в одну величину. Возвращает количество инициализированных элементов.

Замечание: не рекомендуется инициализировать индексные буферы в функции OnInit() пользовательских индикаторов, так как они инициализируются автоматически «пустым значением» при распределении и перераспределении буферов.

Параметры:

array[] — Числовой массив, который нужно инициализировать.

value — Новая величина, которая нужно установить.

Пример:

//---- инициализация всех элементов массива значением 2.1
double myarray[10];
ArrayInitialize(myarray,2.1);

 

ArrayIsSeries

bool ArrayIsSeries (object array[])

Возвращается TRUE, если проверяемый массив является массивом-таймсерией (Time[],Open[],Close[],High[],Low[] или Volume[]), иначе возвращается FALSE.

Параметры:

array[] — Проверяемый массив.

Пример:

if(ArrayIsSeries(array1)==false)
  ArrayInitialize(array1,0);
else 
{
  Print("Таймсерия не может быть инициализирована!");
  return(-1); 
}

 

ArrayMaximum

int ArrayMaximum (double array[], int count=WHOLE_ARRAY, int start=0)

Поиск элемента с максимальным значением. Функция возвращает позицию максимального элемента в массиве.

Параметры:

array[] — Числовой массив, в котором производится поиск.

count — Количество элементов для поиска.

start — Начальный индекс для поиска.

Пример:

double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int maxValueIdx=ArrayMaximum(num_array);
Print("Max value = ", num_array[maxValueIdx]);

 

ArrayMinimum

int ArrayMinimum (double array[], int count=WHOLE_ARRAY, int start=0)

Поиск элемента с минимальным значением. Функция возвращает позицию минимального элемента в массиве.

Параметры:

array[] — Числовой массив, в котором производится поиск.

count — Количество элементов для поиска.

start — Начальный индекс для поиска.

Пример:

double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int minValueidx=ArrayMinimum(num_array);
Print("Min value = ", num_array[minValueIdx]);

 

ArrayRange

int ArrayRange (object array[], int range_index)

Возвращает число элементов в указанном измерении массива. Поскольку индексы начинаются с нуля, размер измерения на 1 больше, чем самый большой индекс.

Параметры:

array[] — Проверяемый массив

range_index — Индекс измерения.

Пример:

int dim_size;
double num_array[10,10,10];
dim_size=ArrayRange(num_array, 1);

 

ArrayResize

int ArrayResize (void array[], int new_size)

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

Параметры:

array[] — Массив для изменения размеров.

new_size — Новый размер для первого измерения.

Пример:

double array1[][4];
int element_count=ArrayResize(array1, 20); // новый размер - 80 элементов

 

ArraySetAsSeries

bool ArraySetAsSeries (void array[], bool set)

Устанавливает направление индексирования в массиве. Значение параметра set TRUE устанавливает направление индексирования в обратном порядке, то есть, последний элемент имеет нулевой индекс. Значение FALSE устанавливает нормальное направление индексирования. Функция возвращает предыдущее состояние.

Параметры:

array[] — Числовой массив для установки.

set — Направление индексирования массива.

Пример:

double macd_buffer[300];
double signal_buffer[300];
int i,limit=ArraySize(macd_buffer);

ArraySetAsSeries(macd_buffer,true); 
for(i=0; i<limit; i++) 
   macd_buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);

for(i=0; i<limit; i++)
   signal_buffer[i]=iMAOnArray(macd_buffer,limit,9,0,MODE_SMA,i);

 

ArraySize

int ArraySize (object array[])

Возвращает количество элементов массива. Для одномерного массива значение, возвращаемое функцией ArraySize, равно значению ArrayRange(array,0).

Параметры:

array[] — Массив любого типа.

Пример:

int count=ArraySize(array1);
for(int i=0; i<count; i++) 
{
   // некоторые вычисления. 
}

 

ArraySort

int ArraySort (void array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND)

Сортировка числовых массивов по первому измерению. Массивы-таймсерии не могут быть отсортированы.

Параметры:

array[] — Числовой массив для сортировки.

count — Количество элементов для сортировки.

start — Начальный индекс.

sort_dir — Направление сортировки массива. Это может быть любым из следующего величин
MODE_ASCEND — сортировка в порядке возрастания
MODE_DESCEND — сортировка в порядке убывания.

Пример:

double num_array[5]={4,1,6,3,9}; // массив содержит величины 4,1,6,3,9

ArraySort(num_array);// теперь массив отсортирован 1,3,4,6,9

ArraySort(num_array,WHOLE_ARRAY,0,MODE_DESCEND);// теперь массив отсортирован 9,6,4,3,1