Доступ к таймсериям и индикаторам
© 2000-2011, MetaQuotes Software Corp.
521
Направление индексации в массивах, буферах и
таймсериях
Все массивы и индикаторные буферы по умолчанию имеют направление индексации слева
направо. Индекс первого элемента всегда равен нулю. Таким образом, самый первый элемент
массива или индикаторного буфера с индексом 0 по умолчанию находится на крайней левой
позиции, последний элемент находится на крайней правой позиции.
Индикаторный буфер представляет из себя динамический массив типа double, размером которого
управляет клиентский терминал с тем, чтобы он всегда соответствовал количеству баров, на
которых индикатор рассчитывается. Обычный динамический массив типа double назначается в
качестве индикаторного буфера с помощью функции SetIndexBuffer(). Для индикаторных буферов
не требуется задавать размер с помощью функции ArrayResize(), исполняющая система терминала
сама позаботится об этом.
Таймсерии представляют из себя массивы с обратной индексацией, то есть самый первый элемент
таймсерии находится на крайней правой позиции, а последний элемент таймсерии находится на
крайней левой позиции. Так как таймсерии предназначены для хранения исторических ценовых
данных по финансовым инструментам и обязательно содержат информацию о времени, то можно
сказать, что самые свежие данные в таймсерии находятся в правой крайней позиции, а самые
старые в крайней левой позиции.
Поэтому, элемент с индексом ноль в таймсерии содержит информацию о самой последней
котировке по инструменту. Если таймсерия представляет данные по дневному таймфрейму, то на
нулевой позиции содержатся данные текущего незавершенного дня, а на позиции с индексом один
хранятся данные вчерашнего дня.
Изменение направления индексации
Функция ArraySetAsSeries() позволяет изменять способ доступа к элементам динамического
массива, но при этом физически порядок хранения данных в памяти компьютера не изменяется.
Эта функция просто изменяет способ адресации к элементам массива, поэтому при копировании
одного массива в другой с помощью функции ArrayCopy() содержимое массива-приемника не
будет зависеть от направления индексации в массиве-источнике.
Нельзя изменять направление индексации для статически распределенных массивов. Даже если
массив был передан в качестве параметра в функцию, то и внутри этой функции попытки
изменения направления индексации ни к чему не приведут.
Для индикаторных буферов, как и для обычных массивов, также разрешается устанавливать
направление индексации задом наперед как в таймсерии, то есть, обращение к нулевой позиции в
индикаторном буфере в этом случае будет означать обращение к самому последнему значению в
соответствующем индикаторном буфере и это будет соответствовать значению индикатора на
самом последнем баре. При этом физически размещение данных в индикаторном буфере
останется неизменным, как уже упоминалось.
Получение ценовых данных в индикаторах
В каждом пользовательском индикаторе обязательно должна присутствовать функция OnCalculate
(), которой передаются ценовые данные, необходимые для расчета значений в индикаторных
буферах. Направление индексации в этих переданных массивах можно выяснить с помощью