Группа функций для работы с массивами.
Допускаются не более чем четырехмерные массивы. Индексация каждого измерения производится от 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()
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
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 © 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=daytimes[0])
dayshift=0;
else
{
dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);
if(Period()
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
ArraySize
int ArraySize (object array[])
Возвращает количество элементов массива. Для одномерного массива значение, возвращаемое функцией ArraySize, равно значению ArrayRange(array,0).
Параметры:
array[] — Массив любого типа.
Пример:
int count=ArraySize(array1);
for(int i=0; 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