Временн́ые ряды (таймсерии)

Временн́ые ряды — это массивы с данными, в которых индексы элементов соответствуют упорядоченным временным отсчетам. В силу прикладной специфики терминала, практически вся информация, необходимая трейдеру, предоставляется в виде временных рядов или таймсерий. К ним, в частности, относятся массивы котировок, тиков, показания технических индикаторов и другие. С этими данными работает и подавляющее большинство MQL-программ, а потому для них выделена группа функций в MQL5 API, которые мы рассмотрим в данном разделе.

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

  • Обычное (прямое) — нумерация элементов идет от начала массива к концу (от старых отсчетов к новым);
  • Обратное (таймсерия) — нумерация идет от конца массива к началу (от новых отсчетов к старым).

Мы уже освещали данный вопрос в разделе Направление индексации массивов как в таймсерии.

Смена режима индексации выполняется с помощью функции ArraySetAsSeries и не влияет на физическое размещение массива в памяти. Изменяется только способ обращения к элементам по номеру: если в обычном мы получаем i-ый элемент как array[i], то в режиме таймсерии эквивалентная формула равна array[N - i - 1], где N — размер массива ("эквивалентная" — потому что прикладному разработчику не нужно везде делать такой пересчет — его автоматически делает терминал, если для массива задан режима индексации таймсерии). Это иллюстрирует следующая таблица (для символьного массива из 10 элементов).

Элементы массива

A

B

C

D

E

F

G

H

I

J

Обычный индекс

0

1

2

3

4

5

6

7

8

9

Индекс как в таймсерии

9

8

7

6

5

4

3

2

1

0

Напомним, что индексация массивов всегда начинается с нуля.

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

По умолчанию массивы имеют направление индексации слева направо. Если представить, что такой массив отображен на стандартном графике MetaTrader 5, то чисто визуально, элемент с индексом 0 будет находиться на крайней левой позиции, а последний — на крайней правой. В таймсериях с обратной индексацией 0-й элемент соответствует крайней правой позиции, а последний элемент — крайней левой. Так как таймсерии хранят историю ценовых данных по финансовым инструментам в привязке ко времени, более свежие данные в них всегда находятся правее старых.

Элемент с индексом ноль в массиве-таймсерии содержит информацию о самой последней котировке по инструменту. Нулевой бар, как правило, незавершен, поскольку продолжает формироваться.

Еще одной характеристикой котировочной таймсерии является её период, то есть промежуток времени между соседними отсчетами. Этот период также называется "таймфреймом" и может быть переформулирован более точно. Таймфрейм — промежуток времени, в течение которого формируется один бар котировок, причем его начало и конец выровнены в абсолютном времени с тем же шагом. Например, в таймфрейме "1 час" (H1) бары начинаются строго в 0 минут каждого часа суток. Начало каждого такого периода включено в текущий бар, а конец принадлежит уже следующему бару.

В разделе Символы и таймфреймы приведен полный перечень стандартных таймфреймов.

В рамках метафоры временных рядов и таймсерий работают, как правило, и буфера технических индикаторов, но мы изучим их особенности позднее.

При необходимости в любой MQL-программе можно запросить значения таймсерий по любому символу и таймфрейму, а также значения индикаторов, рассчитанных на любом символе и таймфрейме. Для получения таких данных служат Copy-функции, среди которых есть несколько, читающих массивы цен разных типов по отдельности (например, Open, High, Low, Close) или массивы структур MqlRates, содержащих все характеристики каждого бара.

Бары и тики
 
Помимо баров с котировками MetaTrader 5 предоставляет пользователям и MQL-программам возможность анализировать тики — элементарные изменения цен, на основе которых и строятся бары. Каждый тик содержит время с точностью до миллисекунды, несколько видов цен (Bid, Ask, Last) и флагов, описывающих суть изменений, а также торговый объем сделки. Чуть позже мы изучим соответствующую структуру MqlTick в разделе Работа с массивами реальных тиков.
 
В зависимости от типа торгового инструмента бары могут строиться по ценам Bid или Last. В частности, цены Last доступны для биржевых инструментов, по которым также транслируется стакан цен ("глубина рынка"). Для небиржевых инструментов, таких как Forex или CFD, используется цена Bid.
 
Те периоды, в течение которых не было изменений цен, не порождают баров — такова особенность представления цен в MetaTrader 5. Например, если таймфрейм равен 1 дню (D1), то пара баров для выходных дней, как правило, отсутствует, и после пятницы сразу идет понедельник.
 
Котировочный бар появляется, если в соответствующий ему промежуток времени случился хотя бы один тик. При этом время открытия бара всегда выровнено строго по границе периода, даже если первый тик пришел позже (как обычно и происходит). Например, первый бар M1 за сутки может быть сформирован в 00:05, если 4 минуты после полуночи не было тиков, а затем изменение цен случилось в 00:05:15 (то есть на 15-й секунде пятой минуты). Таким образом, тик включается в тот или иной бар на основе следующего соотношения меток времени: Topen <= Ttick < Topen + P, где Topen — время открытия бара, Ttick — время тика, Topen + P — время открытия следующего потенциального бара через период P ("потенциальным" бар назван, потому что его наличие зависит от других тиков).