- Символы и таймфреймы
- Технические особенности организации и хранения таймсерий
- Получение характеристик массивов котировок
- Количество доступных баров (Bars/iBars)
- Поиск индекса бара по времени (iBarShift)
- Обзор Copy-функций для получения массивов котировок
- Получение котировок в виде массива структур MqlRates
- Раздельный запрос массивов цен, объемов, спредов, времени
- Чтение цены, объема, спреда и времени по индексу бара
- Поиск максимального и минимального значения в таймсерии
- Работа с массивами реальных тиков в структурах MqlTick
Поиск максимального и минимального значения в таймсерии
Среди группы функций для работы с временными рядами котировок присутствуют две, предоставляющих простейшую агрегатную обработку: поиск максимального и минимального значений ряда на заданном интервале — соответственно iHighest и iLowest.
int iHighest(const string symbol, ENUM_TIMEFRAMES timeframe, ENUM_SERIESMODE type, int count = WHOLE_ARRAY, int offset = 0)
int iLowest(const string symbol, ENUM_TIMEFRAMES timeframe, ENUM_SERIESMODE type, int count = WHOLE_ARRAY, int offset = 0)
Функции возвращают индекс наибольшего/наименьшего значения для конкретного типа таймсерии, которая задается парой параметров symbol/timeframe, а также элементом перечисления ENUM_SERIESMODE (оно описывает уже знакомые нам поля котировок).
Идентификатор |
Описание |
---|---|
MODE_OPEN |
цена открытия |
MODE_LOW |
минимальная цена |
MODE_HIGH |
максимальная цена |
MODE_CLOSE |
цена закрытия |
MODE_VOLUME |
тиковый объем |
MODE_REAL_VOLUME |
реальный объем |
MODE_SPREAD |
спред |
Параметр offset задает индекс, с которого начинается поиск. Напомним, что нумерация ведется как в таймсерии, то есть увеличение offset приводит к смещению в прошлое, а 0-й индекс означает текущий бар (это значение по умолчанию). Количество анализируемых баров указывается в параметре count (по умолчанию, весь массив WHOLE_ARRAY).
В случае ошибки функции возвращают -1, а код ошибки можно узнать с помощью GetLastError.
Для демонстрации работы одной из этих функций (iHighest) модифицируем пример из предыдущего раздела по оценке реальных размеров спредов по барам и сравним результаты — они, разумеется, должны совпасть. Новая версия скрипта прилагается в файле SeriesSpreadHighest.mq5.
Изменения коснулись структуры SpreadPerBar и рабочего цикла внутри OnStart.
В структуру были добавлены поля, которые позволяют понять принцип работы новой функции. По сути алгоритма они не обязательны.
struct SpreadPerBar
|
Основные преобразования затронули OnStart, но они локализованы внутри цикла (все остальные фрагменты кода остались без изменений).
for(int i = 0; i < BarCount; ++i)
|
Границы текущего бара prev и next определяются как раньше. Однако вместо копирования элементов таймсерии между этими метками в собственный массив spreads и последующего вызова ArrayMaximum для него, мы определяем индексы и количество M1-баров, формирующих текущий бар старшего таймфрейма. Делается это следующим образом.
Функция iBarShift позволяет узнать смещение (переменная p) в истории M1, где находится правая граница бара с временем next - 1. Функция Bars вычисляет количество баров M1 (переменная n), попадающих между метками prev и next - 1. Эти два значения становятся параметрами в вызове функции iHighest, чтобы найти максимальное значение типа MODE_SPREAD, среди n баров M1, начиная с индекса p. Если максимум найден без проблем (m > -1), нам остается взять соответствующее значение с помощью iSpread и поместить в структуру.
const int p = iBarShift(WorkSymbol, PERIOD_M1, next - 1);
|
При выводе массива с результатами в журнал мы теперь дополнительно увидим индексы баров M1, где "начинается" бар старшего таймфрейма и где в нем нашелся максимальный спред. Слово "начинается" взято в кавычки, потому что по мере поступления новых баров M1 эти индексы будут увеличиваться, и виртуальное "начало" каждого будет сдвигаться, хотя времена открытия исторических баров, разумеется, остаются постоянными.
Maximal speeds per intraday bar
|
Например, на момент запуска скрипта бар с меткой 2021.10.12 14:00 начинался с 67-го бара M1 (т.е. был открыт 67 минут назад), а M1-бар с максимальным спредом внутри этого H1-бара нашелся под индексом 89. Очевидно, что этот индекс должен быть меньше, чем номер M1-бара, на котором начинался предыдущий H1-бар: 2021.10.12 13:00 — он отметился 127 минут назад. В этом H1-баре, в свою очередь, был найден максимальный спред по индексу 181. И это меньше индекса 187 у еще более старого бара 2021.10.12 12:00.
Индексы в колонках pos и max постоянно возрастают, потому что мы обходим бары в порядке от настоящего в прошлое. В колонке num почти всегда будет выводиться 60, поскольку большинство баров H1 состоит из 60 баров M1. Но так бывает не всегда. Например, ниже показаны неполные часовые бары, состоящие из меньшего числа минут: это могут быть как последствия более раннего закрытия рынка из-за праздничного расписания, так и реальные пропуски в торговой активности (отсутствие ликвидности).
...
|