- Основные характеристики индикаторов
- Главное событие индикаторов: OnCalculate
- Два типа индикаторов: для главного и отдельного окна
- Настройка количества буферов и графических построений
- Назначение массива в качестве буфера: SetIndexBuffer
- Настройка графических построений: PlotIndexSetInteger
- Правила сопоставления буферов и диаграмм
- Применение директив для настройки графических построений
- Установка названий для графических построений
- Визуализация пропусков данных (пустых элементов)
- Индикаторы с собственным подокном: размер и уровни
- Общие свойства индикаторов: заголовок и точность значений
- Поэлементное раскрашивание диаграмм
- Пропуск отрисовки на начальных барах
- Ожидание данных и управление видимостью (DRAW_NONE)
- Мультивалютные и мультитаймфреймовые индикаторы
- Отслеживание формирования баров
- Тестирование индикаторов
- Ограничения и преимущества индикаторов
- Создание заготовки индикатора в Мастере MQL
Визуализация пропусков данных (пустых элементов)
Во многих случаях показания индикаторов должны выводиться лишь на некоторых барах, оставляя остальные бары нетронутыми (визуально, без лишних линий или меток). Например, многие сигнальные индикаторы выводят стрелки вверх или вниз на тех барах, где появляется рекомендация к покупке или продаже. Но сигналы встречаются нечасто.
Для установки "пустого" значения, которое не выводится ни на графике, ни в Окне данных, применяется функция PlotIndexSetDouble.
bool PlotIndexSetDouble(int index, ENUM_PLOT_PROPERTY_DOUBLE property, double value)
Функция предназначена для установки у диаграммы под номером index свойств типа double. Набор таких свойств сведен в перечисление ENUM_PLOT_PROPERTY_DOUBLE, но на текущий момент в нем только один элемент: PLOT_EMPTY_VALUE. Он и задает "пустое" значение. Само значение передается в последнем параметре value.
В качестве подходящего примера индикатора с "редкими" значениями мы рассмотрим довольно известный детектор фракталов. Суть его работы в том, чтобы пометить на графике высокие цены (High), которые выше N соседних баров, и низкие цена (Low), которые ниже N соседних баров, в обе стороны. Файл индикатора называется IndFractals.mq5.
В индикаторе будет два буфера и два графических построения типа DRAW_ARROW.
#property indicator_chart_window
|
Входная переменная FractalOrder позволит задавать количество соседних баров, по которым определяется верхний или нижний экстремум.
input int FractalOrder = 3; |
Для символов-стрелок предусмотрим отступ в 10 пикселей от экстремумов для лучший видимости.
const int ArrowShift = 10; |
В функции OnInit выполним традиционные действия по объявлению массивов буферами и их привязке к визуализируемым диаграммам.
int OnInit()
|
Обратите внимание, что по умолчанию "пустым" значением является специальная константа EMPTY_VALUE, поэтому вышеприведенные вызовы PlotIndexSetDouble необязательны.
В обработчике OnCalculate в момент первого вызова инициализируем оба массива значением EMPTY_VALUE, и далее присваиваем его новым элементам по мере формирования баров. Заполнение необходимо, потому что распределенная под буфера память может содержать произвольные данные (мусор).
int OnCalculate(const int rates_total,
|
В основном цикле по барам сравниваем цены high и low с этими же типами цен на соседних барах и оставляем метки там, где обнаруживается экстремум среди FractalOrder баров в каждую из сторон.
// просматриваем все или новые бары, имеющие в окружении FractalOrder баров
|
Посмотрим, как этот индикатор выглядит на графике.
Индикатор фракталов
Теперь заменим тип отрисовки с DRAW_ARROW на DRAW_ZIGZAG и сравним эффект "пустых" значений для обоих вариантов. Очевидно, что в результате должен получиться зигзаг на фракталах. Модифицированная версия индикатора прилагается в файле IndFractalsZigZag.mq5.
Одно из главных изменений касается количества диаграмм: она теперь одна, так как DRAW_ZIGZAG "потребляет" оба буфера.
#property indicator_chart_window
|
Из OnInit уходят все вызовы функций, связанных с настройкой стрелок.
int OnInit()
|
В остальном исходный код без изменений.
На следующем изображении приведен график, на который зигзаг наложен в дополнение к фракталам: тем самым можно наглядно сравнить их результаты. Оба индикатора работают совершенно независимо, но из-за одинакового алгоритма найденные экстремумы совпадают.
Индикатор Зиг-Заг по фракталам
Важно отметить, что в случае, если подряд встречаются экстремумы одного типа, зигзаг использует первый из них. Это следствие того, что в качестве экстремумов используются фракталы. В стандартном зигзаге такого, разумеется, быть не может. При необходимости желающие могут усовершенствовать алгоритм, предварительно проредив последовательности фракталов.
Также следует отметить, что для отрисовки DRAW_ZIGZAG (так же, как и DRAW_SECTION), видимые отрезки соединяют "непустые" элементы и потому, строго говоря, какой-то фрагмент отрезка рисуется на каждом баре, включая и те, что имеют значение EMPTY_VALUE (или другое назначенное вместо него). Однако в Окне данных четко видно, что "пустые" элементы действительно пусты: для них значения не выводятся.