Характеристики массивов

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

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

В двумерном массиве элементы расходятся в двух логически перпендикулярных направлениях, образуя своего рода квадрат (или прямоугольник, в общем случае), причем для доступа к каждому элементу нужно два индекса — по одному в каждом измерении. Такой массив можно было бы использовать для хранения четверок цен (Open, High, Low, Close) для каждого бара истории. По первому измерению отсчитывались бы номера баров, а по второму — число от 0 до 3 (включительно), обозначающее один из типов цен.

Трехмерный массив — это эквивалент куба (или более строго с позиций геометрии — прямоугольного параллелепипеда) с тремя осями. Продолжая пример с массивом побаровых цен, мы могли бы добавить в него третье измерение, отвечающее за перебор финансовых инструментов из Обзора рынка.

По каждому из измерений массив имеет некоторую протяженность (размер), задающую диапазон возможных индексов. Если бы, предположим, история была загружена для 1000 баров для 10 инструментов, мы получили бы массив с размером 1000 элементов в первом измерении, 4 элемента во втором (OHLC) и 10 — в третьем.

Произведение размеров по всем измерениям дает общее количество элементов массива, в данном случае — 40000. В MQL5 оно не может быть больше 2147483647 (максимум для int).

Для массива с 4-мя измерениями уже трудно представить пространственную фигуру, потому что мы привыкли жить в трехмерном мире. Однако MQL5 допускает создание массивов с количеством измерений вплоть до четырех.

Следует отметить, что всегда можно использовать одномерный массив вместо многомерного массива с произвольным количеством измерений (в том числе, больше 4) — это всего лишь вопрос организации пересчета нескольких индексов в один сквозной. Например, если двумерный массив имеет 10 колонок (измерение 1, ось X) и 5 строк (измерение 2, ось Y), его можно преобразовать в одномерный массив с таким же количеством элементов, то есть 50. При этом индекс элемента получается по формуле:

index = Y * N + X

Здесь N — количество элементов по первому измерению, в данном случае 10, это размер каждой строки; Y — номер строки (0..4); X — номер колонки (0..9) в строке.

Размеры по всем измерениям — еще одна характеристика, отличающая массив от переменной. Таким образом, количество измерений и размер по каждому из них должны некоторым образом указываться при описании, в дополнении к названию массива и типу данных (см. следующий раздел).

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

По способу выделения памяти массивы делятся на динамические и фиксированного размера.

Фиксированный массив описывается в коде с точными размерами по всем измерениям. Изменить его размер потом нельзя. Однако на практике часто возникают задачи, когда количество данных для обработки заранее не известно, и потому желательно изменять размер массива в процессе работы алгоритма. Для этих целей и существуют динамические массивы. Как мы увидим далее, они описываются без указания размера по первому измерению и могут затем "растягиваться" или "сжиматься" с помощью специальных функций MQL5 API.

В документации MQL5 используется неоднозначная терминология, называющая массивы фиксированного размера статическими. Данное понятие также используется для модификатора static, который может быть применен к массиву. Если такой массив объявлен динамическим, тогда он одновременно нестатический с точки зрения выделения памяти и статический с точки зрения модификатора static. Чтобы исключить неоднозначность, в данной книге под статичностью будем понимать исключительно атрибут декларации.

Помимо динамических и фиксированных массивов в MQL5 существуют массивы особого рода для хранения котировок и буферов технических индикаторов. Такие массивы называются массивами с временными рядами (таймсериями), поскольку их индексы соответствуют отсчетам во времени. По сути эти массивы являются одномерными динамическими, но в отличие от прочих динамических массивов, память под них выделяется самим терминалом. Мы изучим их в разделах про таймсерии и индикаторы.