Массивы и таймсерии
При работе с массивами очень важно помнить, что в 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:
int 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.