Наши рекомендации:

  1. Главная
  2. Уроки MQL4
  3. 2.8 Пишем пользовательский индикатор-гистограмму волатильности периода Н1

2.8 Пишем пользовательский индикатор-гистограмму волатильности периода Н1

Доброго времени суток!

В этом уроке мы создадим индикатор-гистограмму в отдельном окне для определения средней волатильности. Для этого мы используем период график H1, чтобы точно видеть, какое движением в среднем проходит цена в пунктах за каждый анализируемый час. Цель этого урока: повторить уже пройденный материал, проанализировать бары на истории, а также научиться использовать буфер гистограммы.

Создаем индикатор волатильности

В редакторе MetaEditor жмем Файл -> Создать -> Пользовательский индикатор. Задаем все настройки по умолчанию, жмем далее, в окне параметров отображения ставим галочку «индикатор в отдельном окне«, а также создаем два отдельных буфера. Первый будет иметь тип гистограммы для расчета волатильности по часам, а второй — линия, чтобы видеть суммарное изменение волатильности всего графика.

Созданный код будет иметь следующий вид:

Сразу же изменим толщину гистограммы до трех, чтобы было пожирнее и весомее.

Все дальнейшие строки кода я буду писать в той последовательности, в которой они есть в готовом коде, т.е. сверху вниз.

Далее определимся с количеством дней для анализа свечей. Возьмем ни много ни мало 50 дней. Но, чтобы иметь возможность менять это значение, вынесем его во внешние настройки индикатора.

Добавим две переменные на глобальном уровне: PipsDivided для перевода пунктов в старый вариант отображения (про эту переменную я писал подробнее в этом уроке). Переменная TimeNewBar будет нужна для сохранения времени открытия текущей свечи.

Переходим к функции обработки событий OnInit. В нее нужно добавить проверку на количество знаков на счете брокера для множителя PipsDivided. Также перевести дни для анализа в часы, т.к. нами будет использоваться часовой график. Можно было сразу задать время в настройках в часах, но в днях это делать просто удобнее.

Дополнительно для пользователей, который захотят установить индикатор на любой ТФ, отличный от Н1 мы сделаем проверку ТФ графика. Если она не проходит — индикатор напишет об этом в журнале и самоликвидируется с графика.

Переходим к основной функции OnCalculate. Первой же проверкой нужно узнать, подгрузились ли все необходимые бары на график. И если нет, то принудительно перерисуем график. Возьмем для построения гистограммы последние 3000 баров, т.е. 3000 часов или 125 дней. Т.к. для каждой свечи анализ будет проходить только за последние 50 дней, то вычтем это значение из общего числа баров.

Так как нас интересует волатильность по уже закрытым свечам, то нет смысла делать все перерасчеты каждый тик. Для этого с помощью условного оператора сделаем проверку на текущее время открытой свечи. Если оно будет совпадать с сохраненным в памяти временем, то мы завершаем работу с функцией OnCalculate на этом тике. В итоге построение гистограммы будет обновляться один раз в час при открытии новой свечи.

Чтобы рассчитать волатильность для каждой свечи, нам нужно ввести две пары переменных. Первые две переменные будут считать суммарное количество анализируемых свечей, а также сумму длин этих свечей от цены открытия до цены закрытия. Это нужно для того, чтобы поделить одно на другое и узнать волатильность для текущей свечи. Вторая пара нужна, чтобы узнать сумму свечей на заданный час и сумму их значений.

Для анализа свечей мы воспользуемся оператором циклом for. Параметры для подсчета волатильности вообще всех свечей необходимо объявлять вне цикла, чтобы они не обнулились при следующей итерации. По этим значениям будет строиться желтая линия индикатора. Соответственно параметры для свечей каждого часа задаются внутри цикла.

Далее нам необходимо создать второй цикл for внутри существующего. Суть первого цикла в том, чтобы пробежать по всем 3000 свечам и построить гистограмму и линию, а второго, чтобы рассчитать эту волатильность для каждой отдельной свечи за CalculatedDays дней. Второй цикл будет иметь вид:

Он начинается свой отчет с переменной i вышестоящего цикла, т.е. с выделенной свечи и идет он ровно обозначенное количество свечей подряд. Второе выражение i+CalculatedDays должно вести отчет от последней анализируемой свечи цикла первого уровня, т.е. i.

Чтобы не выйти за пределы массива из-за недостатка баров на графике нам необходимо сделать проверку. Если свеча на очередной итерации превысит максимально допустимое количество баров — второй цикл прерывается.

Расчет длины свечи прост, необходимо лишь вычесть от цены открытия свечи ее цену закрытия, перевести все в пункты и возвести в модуль, т.к. нам все равно в каком направлении двигалась анализируемая свеча.

Есть вам необходимо знать движения с учетом хвостов (теней), то просто измените цены Open, Close на High, Low.

Следующим условием будет проверка времени анализируемой свечи внутреннего цикла со временем свечи первого цикла. Если оно совпадает, значит час текущей, анализируемой свечи совпадает с часом прошлых свечей на истории. Нам нужно только обновить данные в памяти переменных длины свечей и счетчика.

Помимо этого, нам не важно время свечи для общей линии волатильности, поэтому ниже просто дописываем ее данные в переменные первой пары.

С циклом внутри цикла разобрались. Осталось передать данные в массивы двух буферов, если счетчики были не нулевые для текущей итерации.

Если вы все правильно написали, то полученный индикатор будет иметь следующий вид:

Желтая, почти горизонтальная линия будет показывать волатильность за 50 дней всех свечей на графике, тогда как оранжевые гистограммы будут показывать, какая средняя волатильность была за каждый час этих 50 дней. Общая тенденция не особо заметна глазу, но если отдалишь график, то можно увидеть, как волатильность изменяется из-за дня в день.

Создаем текстовый лейбл

Осталось добавить последний штрих. Так как мы уже умеет создавать графические объекты, почему бы цифрами не обозначить волатильность на каждой свече в пунктах. Для этого создадим пользовательскую функцию TextCreate, которая будет создавать объект текст OBJ_TEXT.

Останавливаться на этом коде подробно не буду, мы проходили создания объектов в этом уроке.

Добавим эту функцию после кода заполнения буфера данных гистограммы.

В функцию TextCreate мы передаем ID графика, имя объекта, номер подокна, время для построения и значение бара гистограммы с отступом в 1 пункт вверх, текст в виде цифр, тип шрифта, размер шрифта, цвет объекта, угол наклона в 90 градусов, а также точку привязки к объекту.

Конечный код функции OnCalculate будет иметь вид:

Все, индикатор готов. Теперь все смотрится куда гармоничнее.

Если повнимательнее посмотреть на бары гистограммы, то можно увидеть простую закономерность: ночью, начиная с 22 часов до 7 утра рынок очень спокойный, тогда как в Американскую и Лондонскую торговые сессии график максимально волатильный. А значит во флете рынок находится больше ночью, чем днем. Наша команда использует данную особенность рынка в наших советниках Night Hawk и Sakura.

Заключение

В этом уроке мы создали небольшой индикатор (всего 131 строка), который определяет как почасовую, так и общую волатильность на графике терминала MetaTrader 4. Закрепили ранее полученную информацию и немного приблизились к званию «гуру» кодинга.

В свое время я написал для нашего сайта индикатор волатильности Truly Volatility по подобной логике. Единственное отличие его в том, что он также умеет определять волатильность по дням внутри рабочей недели. Я думаю, что зная основы, вам не составит труда повторить это в данном код при необходимости.

На этом все, всем профитов!

0. Начало работы

Предыдущая запись
2.7 Создаем подвальный индикатор. Объединение данных RSI, WPR и Stochastic в один индикатор
Следующая запись
2.9 Создаем информационную панель с сигналами индикаторов на вход. Графические объекты OBJ_RECTANGLE_LABEL, OBJ_LABEL

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Меню