- Основные характеристики индикаторов
- Главное событие индикаторов: OnCalculate
- Два типа индикаторов: для главного и отдельного окна
- Настройка количества буферов и графических построений
- Назначение массива в качестве буфера: SetIndexBuffer
- Настройка графических построений: PlotIndexSetInteger
- Правила сопоставления буферов и диаграмм
- Применение директив для настройки графических построений
- Установка названий для графических построений
- Визуализация пропусков данных (пустых элементов)
- Индикаторы с собственным подокном: размер и уровни
- Общие свойства индикаторов: заголовок и точность значений
- Поэлементное раскрашивание диаграмм
- Пропуск отрисовки на начальных барах
- Ожидание данных и управление видимостью (DRAW_NONE)
- Мультивалютные и мультитаймфреймовые индикаторы
- Отслеживание формирования баров
- Тестирование индикаторов
- Ограничения и преимущества индикаторов
- Создание заготовки индикатора в Мастере MQL
Правила сопоставления буферов и диаграмм
При регистрации диаграмм с помощью PlotIndexSetInteger(i, PLOT_DRAW_TYPE, type) каждый вызов последовательно ставит в соответствие i-ой диаграмме некоторое количество буферов согласно их требуемому количеству для типа отрисовки type (см. таблицу ENUM_DRAW_TYPE в предыдущем разделе). Тем самым это количество буферов изымается из рассмотрения при привязке буферов к следующим диаграммам (при следующих вызовах PlotIndexSetInteger).
Например, если первым графическим построением (под индексом 0) идет DRAW_CANDLES, для которого необходимо 4 индикаторных буфера, то именно такое количество и будет с ним ассоциировано. Таким образом, буфера с индексами от 0 по 3 включительно получат привязку, и следующим свободным для привязки буфером станет буфер под индексом 4.
Если следом регистрируется простая линейная диаграмма DRAW_LINE (её индекс в последовательности диаграмм равен 1), она займет только 1 буфер — как раз под индексом 4.
Если далее настраивается диаграмма DRAW_ZIGZAG (следующий индекс среди диаграмм равен 2), то поскольку она использует два буфера, то к ней отойдут буфера с индексами 5 и 6.
Разумеется, количество буферов должно быть достаточным для всех регистрируемых построений. Вышеприведенный пример иллюстрируется следующей таблицей. В ней всего 7 буферов и 3 графических построения (диаграммы).
Индекс буфера в SetIndexBuffer |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
Индекс диаграммы в PlotIndexSetInteger |
0 |
1 |
2 |
||||
Тип отрисовки |
DRAW_CANDLES |
DRAW |
DRAW_ZIGZAG |
Индексация буферов и диаграмм независима в том смысле, что индекс буфера не обязан совпадать с индексом диаграммы. Вместе с тем по мере увеличения индексов диаграмм происходит увеличение индексов привязываемых к ним буферов, причем расхождение в индексации может становиться все больше и больше при наличии типов отрисовок, которые "забирают" под себя более одного буфера.
Хотя принято вызывать функции SetIndexBuffer до PlotIndexSetInteger, это не обязательно. Важным является лишь правильное соответствие индексов буферов и индексов диаграмм. В случае использования директив (см. следующий раздел), которые являются альтернативой вызовам PlotIndexSetInteger, директивы исполняются в любом случае раньше обработчика OnInit.
Для демонстрации различия в индексациях буферов и диаграмм рассмотрим простой пример IndHighLowClose.mq5. В нем станем рисовать размах каждой свечи между High и Low в виде гистограммы типа DRAW_HISTOGRAM2, а цену Close подчеркнем простой линией DRAW_LINE. Для доступа к таймсериям цен разных типов нам также потребуется сменить форму OnCalculate с упрощенной на полную.
Поскольку гистограмма требует 2 буфера, то вместе с еще одним буфером под линию Close следует описать три буфера.
#property indicator_chart_window
|
Регистрируем их в OnInit в порядке очередности.
int OnInit()
|
Попутно ширина гистограммы установлена равной 5-ти пикселям, а ширины линии — 2-м. Стили явным образом не назначаются, и равны по умолчанию STYLE_SOLID.
Теперь собственно функция OnCalculate.
int OnCalculate(const int rates_total,
|
Результат работы этого индикатора приведен на следующем изображении:
Гистограмма High-Low и линия Close
Обратите внимание на один важный момент. Диаграммы наносятся на график в порядке, соответстующем их индексам, в результате чего одни располагаются визуально выше других (перекрывают их). В данном случае сперва отрисовывается гистограмма с индексом 0, а затем поверх неё — линия с индексом 1. Иногда имеет смысл менять порядок регистрации диаграмм, чтобы обеспечить лучшую видимость более мелких графических построений, которые могут быть перекрыты более крупными (широкими).
Установка таких приоритетов по мнимой оси Z, уходящий вглубь экрана (перпендикулярно экрану) называется Z-порядком. Мы еще раз столкнемся с этой техникой при изучении графических объектов.
Напомним также, что по умолчанию индикаторы выводятся поверх графика цен, но это поведение можно изменить в настройках: диалог Свойства графика, закладка Общие, опция График сверху. Аналогичная опция есть и в программном интерфейсе (ChartSetInteger(CHART_FOREGROUND), см. раздел Режимы отображения графика).