Статьи по MQL4
Тиковый индикатор в отдельном окне

Тиковый индикатор в отдельном окне


например, forex
Думаю, большинство видело тиковый график в «Обзоре рынка» в терминале МТ4. Также он доступен при ручном выставлении ордеров.

 
 


Многие трейдеры по достоинству оценили появление этого вида графика в МТ4 (в МТ3 его не было). Но к хорошему привыкаешь быстро, и уже многим не хватает этого, было много просьб добавить такой вид графика в отдельном окне. Мы попробуем создать тиковый график самостоятельно. Размещать такой график в окне цен не очень удобно, так как будет не совпадать масштаб, поэтому мы его создадим в подокне основного графика. Чтобы добиться внешнего сходства, выберем тип отображения в виде линии. Запускаем «Мастера создания Советника», называем Ticks, внешних параметров нет, на втором шаге ставим чек-бокс «Индикатор в отдельном окне», добавляем индекс типа Line ( цвет я поставил Navy ) , жмем «Готово».

 
 


Наша задача крайне проста: приходит новый тик — вызывается функция start(), в этой функции в нулевом баре ставим значение Bid. Пришло 100 тиков — имеем 100 заполненных значений. Единственная проблема — просто так у нас это не получится. Если мы запускаем индикатор на 5 минутном тайм-фрейме, то новый бар у нас будет появляться только каждые 5 минут, а нам необходимо, чтобы на каждый тик индикатор сдвигался влево.

 
 


Если для стандартных индикаторов(как встроенных, так и пользовательских) терминал сам производит нужный сдвиг, то для тикового графика нам самим придется продумать механизм сдвига. По сути, мы имеем индикаторный массив ExtMapBuffer1[], значения которого нам необходимо сдвигать вглубь, значение ExtMapBuffer1[0] переносим в ExtMapBuffer1[1], ExtMapBuffer1[1] переносим в ExtMapBuffer1[2], и так далее, в освободившийся индекс ExtMapBuffer1[0] записываем значение Bid.

 
 


Таким образом, нужна некая функция ShiftArray() (сдвинуть массив), после которой пишем по нулевому адресу Bid.

 
 


Осталось написать функцию ShiftArray() :

 
 


Нам пришлось ввести новую глобальную переменную tickCounter, чтобы знать на какую глубину сдвигать значения массива. Индикатор практически готов. Но мы забыли, что при появлении нового бара индикаторный массив сдвигается автоматически. Добавим обработку события «Новый бар» и изменим код:

 
 


Функция isNewBar() аналогична той, что используется в советнике BlackBox, просто скопируем ее. Правда, вместо глобальной переменной expertBars я написал myBars.

 
 


Теперь индикатор безупречен. Правда, мы не использовали возможности оптимизации, но как можно оптимизировать этот индикатор? Это редкий случай, когда нет никакой пользы от встроенной функции IndicatorCounted() . Но оптимизировать можно и его. Предположим, мы запустили индикатор минут 10 назад, за это время набежало 100 тиков, значит, на каждом новом тике мы сдвигаем 100 значений массива, и при этом количество сдвигаемых значений растет. А спустя сутки этих значений будет тысячи. Помножим это на количество графиков, на которые мы набросим этот индикатор. Возможно, наступит момент, когда все ресурсы компьютера будут уходить на бессмысленный сдвиг десятков тысяч значений в разных массивах. Чтобы этого избежать, я ввел внешний параметр MaxDrawTicks=500 (максимальное число рисуемых тиков) и ввел правило: как только счетчик тиков tickCounter в два раз превысит это значение — происходит «обрезка» массива, значения от MaxDrawTicks+1 до 2*MaxDrawTicks заполняются нулями. Дальше как обычно. Я исходил из того, что пятисот значений на графике обычно достаточно для оценки текущей ситуации, вы можете изменить это число или изменить правило «обрезки».

 
 


Индикатор написан без ошибок, оптимизация проведена, что еще нужно для счастья? В терминале, если нажать Ctrl+Y , появляются разделители периодов. Почему бы и нам не сделать подобное. И тогда мы увидим, что графики имеют свое собственное время, которое не совпадает с астрономическим. И по законам внутреннего времени также развиваются периоды тренда, которые сменяются рейнджем или консолидацией. Да и понять по разделителям будет проще- как себя вела цена внутри того или иного бара, как менялись тики в модели флаг или ложный пробой.
Разделители рисовать мы сможем только с помощью объектов, это объект «Вертикальная линия». Теперь при наступлении события «Новый бар» мы рисуем вертикальную линию с уникальным именем, реализуем это функцией SetDelimeter() (установить разделитель). Блок start() окончательно выглядит так:

 
 


Функция SetDelimeter() будет создавать объект типа OBJ_VLINE, размещать его в окне индикатора, задавать цвет линии и стиль. Вы можете задать свои параметры цвета и стиля. Вопрос уникальности создаваемых имен решен просто — каждый новый разделитель имеет имя delimeterDate, которое содержит в себе текстовый формат начала нового бара. Таким образом, мы всегда можем подвести курсор к нашему разделителю, и понять — в какой период времени развивалась данная последовательность тиков.

 
 


Посмотрев справку в МЕ, вы поймете полностью все тонкости использованных функций для работы с объектом. Осталась последняя деталь — мы породили объекты , теперь нам нужно не забыть двигать их по той же причине, что и индикаторный массив. Немного расширим функцию ShiftArray(), теперь она не только сдвигает индикаторный массив, но и двигает все вертикальные линии, которые найдет на окне индикатора.

 
 


Изучив код этого индикатора, вы сможете легко создавать и менять свойства вертикальных линий. На этом можно поставить окончательную точку в написании этого индикатора. Хотя, при желании, вы можете его улучшить и добавить какую-то свою функциональность. Запускаем его на графике EURUSD M5 и начинаем наблюдать.

 
 


Я подвел курсор к разделителю и увидел имя вертикальной линии(которое нам дает Time[] этого отрезка времени ).

 
 


Видно, что на тиковом графике хорошо видны линии поддержки и сопротивления (1.2644).

 
 


Видим, как цена пробила линию поддержки и вновь вернулась вверх. Спустя 10 минут цена все-таки пробивает линию поддержки 1.2620 . Мы можем нанести горизонтальную линию на наш индикатор.


 
 


С помощью нашего индикатора мы можем изучить развитие цены в каждый момент времени, не находясь физически в этот момент перед монитором. Думаю, те, кто торгует внутри дня, по достоинству оценят этот индикатор. Скачать индикатор можно здесь .
Перейти к статье «Замечательная функция».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100