Справочник MQL4 Доступ к таймсериям и индикаторам
Доступ к таймсериям и данным индикаторовФункции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования самостоятельно распределяют необходимый размер массивов-приемников значений. Из этого правила есть важное исключение: если копирование таймсерий и значений индикаторов необходимо делать часто, например, при каждом вызове OnTick() в экспертах или при каждом вызове OnCalculate() в индикаторах, то в этом случае лучше использовать статически распределенные массивы, так как операции распределения памяти под динамические массивы требуют дополнительного времени и это скажется при тестировании и оптимизации экспертов. При использовании функций доступа к таймсериям и значениям индикаторов необходимо учитывать направление индексации, это подробно описано в разделе Направление индексации в массивах и таймсериях. Доступ к данным индикаторов и таймсерий осуществляется независимо от факта готовности запрашиваемых данных (так называемый асинхронный доступ). Это критически важно для расчета пользовательских индикаторов, поэтому при отсутствии запрашиваемых данных функции типа Copy...() сразу же возвращают ошибку. Однако при доступе из экспертов и скриптов производится несколько попыток получения данных с небольшой паузой, призванной обеспечить время, необходимое для загрузки недостающих таймсерий либо для расчета значений индикаторов. Если запрашивается информация с другого графика (название инструмента и/или значение таймфрейма отличаются от текущих), то возможна ситуация, что в клиентском терминале не открыт соответствующий график и необходимые данные должны быть запрошены у сервера. В этом случае в переменную _Last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку запроса (см. пример ArrayCopySeries()). Исторически сложилось так, что доступ к данным в ценовом массиве производился с конца данных. Физически новые данные всегда дописываются в конец массива, но индекс этого массива всегда равен нулю. Индекс 0 в массиве-таймсерии означает данные текущего бара, то есть бара, который соответствует незавершенному промежутку времени на данном таймфрейме. Таймфрейм – период времени, в течение которого формируется один ценовой бар. Существует несколько предопределенных стандартных таймфреймов.
Несмотря на то, что функцией ArraySetAsSeries() можно задавать массивам способ доступа к элементам как для таймсерии, нужно помнить, что физически элементы массива всегда хранятся в одном и том же порядке, меняется только направление индексации. Для демонстрации этого факта можно выполнить пример:
В результате будет произведен вывод подобный этому:
Как видно из результатов вывода, для массива TimeAsSeries с ростом индекса уменьшается значение времени, находящегося под этим индексом, то есть мы продвигаемся от настоящего к прошлому. Для обычного массива ArrayNotSeries все наоборот - с ростом индекса мы двигаемся из прошлого к настоящему. Смотри также ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries |