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

  1. Главная
  2. Уроки MQL4
  3. 2.7 Создаем подвальный индикатор. Объединение данных RSI, WPR и Stochastic в один индикатор

2.7 Создаем подвальный индикатор. Объединение данных RSI, WPR и Stochastic в один индикатор

Всем привет!

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

Создаем индикатор осциллятор

Для экспорта данных я решил взять в работу три стандартных индикатора-осциллятора:

  • RSI (Relative Strength index) — индекс относительной силы
  • WPR (Williams Percent Range) — процентный диапазон Вильямса
  • Stochastic — стохастический осциллятор

Все они имеют четкие границы построение от 0 до 100. В случае с WPR это от 0 до -100. Т.е. все имеют предел, который нельзя превысить. Тут у меня зародилась идея: что если взять все эти три показателя для каждой свечи на графике, сложить и разделить на три. Тогда мы получим среднее значение всех данных. Я далеко не математик и корректность этих действий для будущей торговли предсказать не могу. Но! Так как цель этого урока — практика написания кода, то почему бы и нет? Поехали.

Создаем индикатор. Для сохранения данных трех встроенных и одного пользовательского индикатора нам нужно 4 отдельных буфера. Поэтому в параметрах отображения индикатора создадим их, чтобы не прописывать свойства вручную. Наш индикатор должен быть в отдельном окне, иметь минимум 0 и максимум 100. Первые три буфера нам нужны просто для отрисовки, поэтому сделаем их бледно серым цветом, а четвертый —  голубым.

Созданный конструктором MetaEditor код будет иметь вид:

Теперь зададим внешние переменные для настройки каждого из индикаторов. Чтобы ограничить количество свечей, для которых мы будем стоить линии, введем параметр BarsForAnalyze. Далее для индикаторов RSI и WPR нужна только одна настройка — период, тогда как Стохастик более жадный на точность и ему нужно задать четыре настройки: период линии K, период линии D, замедление и метод усреднения.

Переходим в функцию обработки событий OnCalculate. Как и в предыдущих уроках нам нужно выполнить условие, при котором на первом тике после установки индикатора у нас произойдет анализ всех свечей на истории с последующим построением линий индикатора, а на всех последующих тиках будут обновляться данные только для [0] свечи. В этом нам помогут параметры функции rates_total и prev_calculated.

Второй строчкой кода мы ограничиваем анализ баров до указанного в настройках параметра BarsForAnalyze. Далее запускаем оператор цикла for, чтобы пробежаться по всем доступным свечам, начиная с последней указанной до самой новой открытой.

Теперь в теле цикла необходимо получить данные по каждому из осцилляторов. Благодаря тому, что эти индикаторы уже являются встроенными в терминал МТ4, то их программный код расчета показателей переписывать в наш индикатор не нужно. Для этого есть функции их подгрузки: iRSI, iWPR и iStochastic. Буква i в начале обозначает, что это индикатор. Всего для импорта доступно 37 технических индикатора.

Начнем с RSI. Создадим переменную типа double, которая будет хранить данные индикатора для выбранной свечи:

Перечень параметров функции по порядку:

  • Имя символа. Константа NULL обозначает текущий символ.
  • Таймфрейм. 0 значит, что должен использоваться текущий ТФ, на котором открыт график.
  • Период индикатора. Берем из внешних настроек.
  • Тип цены для расчета. По классике берем цену закрытия PRICE_CLOSE
  • Сдвиг. Номер бара, для которого необходимо рассчитать показания.

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

Второй индикатор это WPR. Основное отличие только в том, что тут не учитывается тип цены. Код импорта данных выглядит так:

Осталось импортировать данные стохастика.

Параметров у этой функции больше, но все интуитивно понятно. Мы перечисляем K, D периоды, замедление, метод усреднения из внешних настроек, а также параметр выбора цены для расчета и индекс линии индикатора. Нас интересует основная линия MODE_MAIN.

Если вы запутались в параметрах этих индикаторов, просто установите каретку на наименование функции и нажмите F1. Появится подробная справка по языку MQL4 с открытой страницей описания выбранной функции.

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

Единственное замечание тут связано с тем, что у индикатора WPR данные идут от 0 до -100, т.е. нам нужно «отзеркалить» единицы измерений, поэтому прибавляем число 100 к значению переменной wpr.

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

В итоге код будет выглядеть следующим образом:

Установим индикатор на график и посмотрим, что получилось.

Как и предполагалось, у нас получилось 4 кривых линии. Голубая линия выглядит невыразительно на фоне серых. Изменим ее толщину в свойствах indicator_width4.

Не хватает только горизонтальных линий перекупленности/перепроданности. Давайте зададим количество линий INDICATOR_LEVELS равное двум и их значения равными 20 и 80 в функции обработки событий OnInit.

Посмотрим, что получилось

Для проверки корректности всех указанных данных в настройках можно вручную установить все три индикатора по очереди на график и сравнить их показания как визуально:

так и с помощью окна данных. Все должно сойтись, кроме данных по WPR, к ним прибавлено число 100.

Давайте добавим последний штрих. Предположим, что данный индикатор должен быть сигнальным на открытие сделок для пользователей, которые предпочитают ручную торговлю. Для этого он должен стрелочками указывать где именно должен осуществляться вход в покупки и продажи. Предположим, по классике что линия перекупленности находится на отметке 80 и когда индикатор выше, либо равен ей, то пришло время продавать. В свою очень при значении индикатора ниже линии 20 — время покупать.

Давайте запишем пользовательскую функцию создания графического объекта типа «Стрелка».

В самом коде нет ничего сложного, мы проходили создания подобной функции на прошлом уроке для типа объекта «Текст». Единственное глобальное различия в том, что теперь тип объекта тут «Стрелка» OBJPROP_ARROWCODE.

Добавляем следующие строки в самый низ цикла for.

В первом условном операторе if проверяется условие, когда значение индикатора ниже или равно 20, во втором выше или равно 80. При результате true создается графический объект с параметрами:

  • ID графика. В нашем случае 0.
  • Уникальное имя объекта. Для уникальности прибавляем к имени номер итерации.
  • Номер подокна индикатора. Сохранен в переменную wnd.
  • Время на графике для построения стрелки.
  • Значение индикатора для стрелки с отступом в единицу, чтобы избежать наложения на линию.
  • Код графического объекта в виде шрифта Wingdings, для стрелок это 241 и 242
  • Привязка к стрелке снизу или сверху
  • Цвет графического объекта
  • Толщина объекта.

Все остальные параметры были мою удалены из функции за ненадобностью. В итоге окончательная версия индикатора приняла следующий вид:

Заключение

Мы создали очень простой, компактный код всего на 140 строк. Научились импортировать данные стандартных индикаторов терминала MT4 и писать свой индикатор в отдельном окне.

В свое время я создавал для нашего сайта по подобному сценарию мультивалютный индикатор Multi Stochastic. По ссылке можно изучить его метод работы и при желании повторить это в вашем коде.

Остается последний вопрос. Можно ли использовать написанный нами индикатор в торговле? Скорее да, чем нет. Нужно проверить его эффективность на истории котировок и получить положительную статистику. Это можно сделать вручную, либо написать простенький советник, что мы научимся делать в дальнейших уроках. Но так или иначе, торговать только по сигналам одного индикатора некорректно. Для создания полноценной торговой системы нужно куда больше данных, чем предполагаемые точки входа/выхода по одному осциллятору.

Если наш урок вам был полезен, подпишитесь на рассылку и поделитесь им с друзьями.

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

7 комментариев. Оставить новый

  • Сергей
    22.07.2021 07:48

    Здравствуйте! Спасибо большое за урок, только благодаря ему понял, как объединять и выводить стрелки. Но мучает еще один вопрос)) Как сделать, чтобы при пересечении линий стрелки показывались в главном окне терминала, а не в подвале?

    Ответить
    • В настройках функции ObjectCreate есть параметр, отвечающих за окно, в котором будет отображение. Главное окно имеет номер 0. Т.е. нужно в настройках пользовательской функции ArrowCreate изменить номер окна и цену отображения

      Ответить
      • Сергей
        28.07.2021 17:57

        Благодарности моей нет предела. Всех благ, мил человек.

        Ответить
      • Сергей
        29.07.2021 08:53

        Вот зараза)) я то думал, добавив Ваши 2 строки в код индикатора, будет и в подвале и в главном окне, а не. Почему-то либо отображение либо там, либо там. Дублировать, в двух окнах, почему-то не хочет

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

          Ответить
      • Сергей
        29.07.2021 16:16

        А если только касание уровня 80, по идее должно быть SumBuffer[i] == 80, но не работает)

        Ответить
        • Цена не может быть именно на уровне 80, это большая редкость, чтобы так совпало. Поэтому ничего и не отображается. В данном случае нужно оставить, как есть знак больше или меньше какого-либо уровня.

          Ответить

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

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

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

Меню