Русский

Учебник по MQL4  Стандартные функции  Массивы и таймсерии

Массивы и таймсерии


При работе с массивами очень важно помнить, что в MQL4 нумерация любой последовательности однотипных элементов начинается с нуля.

Ранее указывалось, что не следует путать максимальное значение индекса элемента массива с количеством элементов этого массива (см. Массивы). Например, если объявлен массив:

  int Erray_OHL[3];         // Объявление массива

то это значит, что одномерный массив (имеющий одно измерение) с именем Erray_OHL состоит из трёх элементов. Индексация элементов массива начинается с нуля, т.е. первый из трёх элементов имеет индекс 0 (Erray_OHL[0]), второй элемент - индекс 1 (Erray_OHL[1 ]), а третий элемент - индекс 2 (Erray_OHL[2 ]). Таким образом, максимальное значение индекса элемента массива на единицу меньше, чем количество элементов в этом измерении. В данном случае массив является одномерным, т.е можно говорить о количестве элементов в первом измерении: поскольку количество элементов в массиве равно 3, значит максимальное значение индекса равно 2.

То же можно сказать и о нумерации измерений массива. Например, если объявлен массив:

  int Erray_OHL[3][8];      // Объявление массива

то это значит, что массив имеет два измерения. Первое измерение этого массива определяет количество строк (в данном примере 3), а второе измерение - количество элементов в строке (или, что то же самое, количество столбцов, в данном примере 8). Сами измерения также нумеруется. Первое измерение имеет номер 0, а второе измерение - номер 1. Номера измерений используются, например, в функции ArrayRange().

Функция ArrayRange()

 int ArrayRange(object array[], int range_index)

Функция возвращает число элементов в указанном измерении массива.

Использование функции ArrayRange() можно продемонстрировать при решении следующей задачи:

Задача 38. Значения элементов матрицы 3х5 содержатся в массиве Mas_1. Получить значения массива Mas_2, значения элементов в котором равны значениям транспонированной матрицы. Использовать произвольные значения элементов.

Зададимся некоторыми значениями элементов и представим исходную и искомую матрицы, содержащиеся, соответственно, в массивах Mas_1 и Mas_2:

Индексы 0 1 2 3 4
0 1 2 3 4 5
1 11 12 13 14 15
2 21 22 23 24 25
Индексы 0 1 2
0 1 11 21
1 2 12 22
2 3 13 23
3 4 14 24
4 5 15 25
Исходная матрица, массив Mas_1. Транспонированная матрица, массив Mas_2.

Рис. 151. Исходная и транспонированная матрицы.

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

//--------------------------------------------------------------------
// matrix.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start() // Спец. функция start
{
int Mas_1[3][5]={1,2,3,4,5, 11,12,13,14,15, 21,22,23,24,25};
int Mas_2[5][3];
int R0= ArrayRange( Mas_1, 0); // Число элементов в первом изм
int R1= ArrayRange( Mas_1, 1); // Число элементов в втором изм

for(int i=0; i

В функции start() эксперта открыты два массива. Массив Mas_1 имеет 3 строки по 5 элементов в каждой строке, а массив Mas_2 - 5 строк по 3 элемента в строке. Собственно перезапись значений элементов из одного массива в другой выполняется в строке:

         Mas_2[[j][i] = Mas_1[i][j];    // Транспонирование матрицы

Для того чтобы определить условия выполнения (количество итераций) двух вложенных операторов цикла, необходимо знать значения элементов в каждом из массивов. В данном примере можно было бы использовать значения констант 3 и 5. Однако такой способ составления программ является некорректным. В общем случае программа может содержать объёмный код, во многих местах которого выполняется обращение к одним и тем же значениям. Программа должна быть составлена так, чтобы при необходимости внесения изменений исправления можно было бы сделать в одном месте, а во всех других местах все необходимые значения вычислялись. В данном случае, если необходимо будет изменить размеры массивов, то исправления нужно внести только в строки, в которых эти массивы открываются и инициализируются, и не придётся править код нигде в других местах.

Для определения количества элементов в первом и втором измерении массива Mas_1 выполняются вычисления:

   int R0 =  ArrayRange( Mas_1, 0);    // Число элементов в первом изм
int R1 = ArrayRange( Mas_1, 1); // Число элементов в втором изм

Обратите внимание, для первого измерения используется значение 0, а для второго 1. Вычисленные значения переменных R0 и R1 используются для определения количества итераций в циклах for.

Полученные значения элементов массива Mas_2 выводятся на экран с помощью функции Comment().


Рис. 152. Результат работы эксперта matrix.mq4.


Функции для работы с массивами


Функция Краткое описание
ArrayBsearch Возвращает индекс первого найденного элемента в первом измерении массива. Если элемент с указанным значением в массиве отсутствует, функция вернет индекс ближайшего элемента (по значению).
ArrayCopy Копирует один массив в другой. Массивы должны иметь одинаковый тип. Массивы типа double[], int[], datetime[], color[], и bool[], можно копировать как массивы одного типа. Возвращает количество скопированных элементов.
ArrayCopyRates Копирует в двухмерный массив, вида RateInfo[][6], данные баров текущего графика и возвращает количество скопированных баров, либо -1 в случае неудачи.
ArrayCopySeries Копирует массив-таймсерию в пользовательский массив и возвращает количество скопированных элементов.
ArrayDimension Возвращает ранг многомерного массива.
ArrayGetAsSeries Возвращается TRUE, если массив организован как таймсерия (элементы массива индексируются от последнего к первому), иначе возвращается FALSE.
ArrayInitialize Устанавливает все элементы числового массива в одну величину. Возвращает количество инициализированных элементов.
ArrayIsSeries Возвращается TRUE, если проверяемый массив является массивом-таймсерией (Time[], Open[],Close[],High[],Low[] или Volume[]), иначе возвращается FALSE.
ArrayMaximum Поиск элемента с максимальным значением. Функция возвращает позицию максимального элемента в массиве.
ArrayMinimum Поиск элемента с минимальным значением. Функция возвращает позицию минимального элемента в массиве.
ArrayRange Возвращает число элементов в указанном измерении массива. Поскольку индексы начинаются с нуля, размер измерения на 1 больше, чем самый большой индекс.
ArrayResize Устанавливает новый размер в первом измерении массива. При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера, в противном случае возвращает -1, и массив не меняет размеры.
ArraySetAsSeries Устанавливает направление индексирования в массиве.
ArraySize Возвращает количество элементов массива.
ArraySort Сортировка числовых массивов по первому измерению. Массивы-таймсерии не могут быть отсортированы.

Функции доступа к таймсериям


Функция Краткое описание
iBars Возвращает количество баров на определенном графике.
iBarShift Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости от параметра exact, -1 или смещение ближайшего бара.
iClose Возвращает значение цены закрытия указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0.
iHigh Возвращает значение максимальной цены указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0.
iHighest Возвращает индекс найденного наибольшего значения (смещение относительно текущего бара).
iLow Возвращает значение минимальной цены указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0.
iLowest Возвращает индекс найденного наименьшего значения (смещение относительно текущего бара).
iOpen Возвращает значение цены открытия указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0.
iTime Возвращает значение времени открытия указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0.
iVolume Возвращает значение тикового объема указанного параметром shift бара с соответствующего графика (symbol, timeframe). В случае ошибки функция возвращает 0.

Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Ltd. или к разделу "Справка" в редакторе MetaEditor.