Группа функций для работы с массивами.
Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 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