Язык MQL4 для; чайников

Язык MQL4 для «чайников». Пользовательские индикаторы (часть 1)

Antoniuk Oleg

Введение

Это четвертая статья из цикла «Язык MQL4 для ‘чайников'». Сегодня мы будем учиться писать пользовательские индикаторы. Мы изучим классификацию свойств индикаторов, посмотрим, как эти свойства влияют на сам индикатор, узнаем про новые функции и оптимизацию, и наконец-то напишем несколько своих индикаторов. Кроме того, в конце статьи вас ждут советы по стилю программирования. Если это первая статья «для чайников», которую вы читаете, то, пожалуйста, прочитайте предыдущие статьи, чтобы у вас не возникало никаких вопросов. Кроме того убедитесь, что вы хорошо разобрались в старом материале, так как в этой статье я не буду объяснять основы.

Какие бывают индикаторы?

Сейчас я покажу вам какие бывают индикаторы. Конечно, вы и сами видели их достаточно, но сейчас я хочу обратить ваше внимание на свойства и параметры индикаторов, чтобы сделать таким образом небольшую классификацию свойств и параметров. Это поможет вам в дальнейшем писать пользовательские индикаторы. Итак, первый простенький индикатор:

Это Скользящее Среднее (Moving Average, MA), часто используемый технический индикатор. Обратите внимание на следующие важные вещи:

  • индикатор рисуется в окне самого графика
  • индикатор выводит лишь один показатель
  • диапазон значений индикатора никак не ограничен и зависит от текущих цен
  • линия рисуется определенным цветом, толщиной и стилем (сплошная линия)

Теперь давайте посмотрим на другой индикатор:

Это Процентный Диапазон Вильямса (Williams’ Percent Range, %R). Обратите внимание, что:

  • индикатор рисуется в отдельном подокне
  • как и в предыдущем случае, индикатор выводит лишь один показатель
  • диапазон значений индикатора строго ограничен
  • сама линия рисуется другим стилем, цветом и толщиной

Таким образом, существуют следующие свойства индикаторов:

  • индикатор рисуется: в окне графика цен или в отдельном подокне. Теперь давайте разберемся, почему Скользящее Среднее рисуется на графике цен, а Процентный Диапазон Вильямса в отдельном окне. Вся разница — это диапазон выводимых значений. Обратите внимание, что второй индикатор выводит значения в диапазоне от 0 до -100. Теперь представьте, что мы выводим эти значения в окно цен. Что бы произошло?? Вы бы даже не увидели эту линию, потому что цена выводится в гораздо более скромном диапазоне. В нашем случае: от 0.6805 до 0.7495. И тут дело даже не в этом. Цены — это положительные числа, а показатель у нас отрицательный. Индикаторы рисуются в отдельном подокне, если их показатели не входят в диапазон цен активного графика. Если же диапазон приблизительно совпадает (например, различные виды скользящих средних), то индикатор рисуется в окне графика. В будущем настраивайте это свойство индикатора по этой простой логике. Посмотрите рисунок:

  • индикатор, который выводится в отдельном подокне может быть ограничен в строгом диапазоне. Это значит, что терминал установит фиксированный масштаб на вывод показателя индикатора и даже если значения «выходят» за диапазон, то вы этого просто не увидите. Если же вы отключите это свойство, то терминал будет автоматически изменять масштаб таким образом, чтобы в окно помещались все значения индикатора. Посмотрите рисунок:

  • индикатор может выводить свои значения разным цветом, стилем и толщиной. Вы часто это видели, когда настраивали внешний вид индикаторов в терминале. Здесь имеется одно ограничение: если вы используете толщину линии больше 1, то вы можете использовать только один стиль — сплошную линию.

Теперь давайте посмотрим на еще один индикатор:

Как видите, индикатор Объемов (Volumes) рисуется в виде гистограммы. Таким образом, существуют еще несколько видов вывода показателей индикатора. Вот пример другого типа вывода:

индикатор Фракталов (Fractals) рисуется в виде определенных символов. А теперь внимательно посмотрите на следующий индикатор:

Это индикатор Аллигатор (Alligator). Обратите внимание, что индикатор одновременно рисует 3 показателя (линии баланса). Как это работает?? Дело в том, что любой (есть и исключения, но о них в другой раз) индикатор при выводите использует буферы данных.

Буфер данных — это почти обычный массив. Его отличительная особенность заключается в том, что этим массивом частично управляет терминал. Терминал изменяет массив таким образом, что с появлением каждого нового бара происходит смещение. Это делается для того, чтобы каждый элемент массива соответствовал определенному бару. Максимальное количество выводимых буферов данных в одном индикаторе: 8. Да, сейчас все звучит очень запутанно, но скоро вы поймете, что иначе и быть не могло. Просто запомните, что каждой линии в индикаторе Alligator соответствует свой буфер данных. Также каждый буфер имеет свои параметры, в соответствии с которыми терминал и рисует их. В нашем случае есть 3 буфера, которые можно описать следующим образом:

  1. Первый буфер: рисуется сплошной линией зеленым цветом с толщиной 3.
  2. Второй буфер: рисуется пунктирной линией красным цветом с толщиной 1.
  3. Третий буфер: рисуется сплошной линией синим цветом с толщиной 2.

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

Теперь давайте подведем итог нашей небольшой экскурсии. Любой индикатор имеет такие свойства:

  • один или больше буферов данных (хотя это тоже не обязательно) для вывода своих показателей или расчета промежуточных результатов. В свою очередь каждый буфер также имеет свои свойства, которые определяют, как он будет рисоваться и будет ли вообще. Например: рисовать показатель в виде гистограммы, символа или линии; каким цветом и стилем.
  • где должен рисоваться индикатор (в окне графика или в подокне).
  • если индикатор рисуется в подокне, то нужно ли ограничивать диапазон или производить масштабирование автоматически.

Убедитесь, что вы хорошо разобрались и понимаете все эти свойства. Сейчас мы воспользуемся Мастером, чтобы создать пользовательский индикатор.

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

Запускаем Meta Editor, выбираем Файл->Создать:

Появляется окно Мастера создания советника, выбираем Пользовательский индикатор, нажимаем Далее:

Заполняем поля Имя, Автор и Ссылка. Тут все как обычно, но теперь вы можете добавлять параметры. Что же это такое??

Параметры — это обычные переменные, которые может настраивать пользователь. И что очень важно, эти переменные можно использовать в коде индикатора. Назначение параметров очевидно — вы позволяете пользователям настраивать некоторые аспекты работы индикатора. Это может быть что угодно. Например: какой таймфрейм использовать, в каком режиме работать, сколько баров брать для усреднения и т.д.

Сейчас (для наглядного примера) мы добавим параметр, который будет указывать, сколько баров должно обрабатываться для расчета показателя нашего индикатора. Где это может быть использовано?? Представьте, например, что ваш индикатор серьезно нагружает процессор, так как проводит много сложных вычислений. При этом вы часто меняете таймфрейм графика и просматриваете лишь 100-200 последних баров. Зачем в таком случае проводить лишние вычисления и ждать несколько лишних секунд?? Вот тут нас и выручит этот параметр. Конечно, в нашем индикаторе не будет ничего сложного и затратного для ресурсов компьютера. Это просто один из вариантов использования параметров индикатора.

Итак, чтобы добавить параметр нужно нажать на кнопку Добавить (1). После этого вы можете изменить название переменной на что-нибудь более подходящее (2). В нашем случае меняем название на barsToProcess (баров для обработки). Также вы можете изменить начальное значение (3), то есть значение по умолчанию. Меняем на 100. Кроме того, вы можете изменить тип переменной, но в нашем случае ничего менять не нужно, так как тип int идеально подходит для наших целей. После внесения всех необходимых изменений нажимаем Далее:

Почти все готово. Теперь нужно указать, как рисовать индикатор: в отдельном окне или в окне графика цен. Также вы можете ограничить диапазон. Ставим галочку напротив Индикатор в отдельном окне. Ниже мы видим пустое поле Индексы(буферы данных). Здесь вы можете добавить, сколько вам нужно буферов данных (максимум 8). Кроме того, вы всегда сможете добавить или убрать буфера позже, изменив код. Нажимаем Добавить, чтобы добавить один буфер. Теперь вы можете изменить то, как будет отображаться буфер: обычная линия, гистограмма, отрезки или стрелки (символы). Оставим все как есть, то есть тип — Line. Настройте цвет для рисования этого буфера. Нажимаем Готово:

Вуаля!! Ваш первый индикатор готов! Ну и что, что он ничего не рисует, зато сколько кода. Файл с исходным кодом будет размещен в папке с индикаторами: MetaTrader4expertsindicators.

Разбираем каждую строчку

А теперь давайте посмотри, что для нас создал Meta Editor:

Как всегда, «шапка» из однострочных комментариев включает введенные ранее вами данные. Очень мило, смотрим дальше:

Вы еще помните директиву препроцессора #define из второй статьи? Мы ее использовали для объявления констант. Так вот, это еще одна директива. Она используется для того, чтобы указать какие-то специфические свойства индикатора. В нашем случае, чтобы указать авторство. Обратите внимание, что сначала идет специальный знак — # (решетка), потом ключевое слово property (без пробела). Property означает свойство. Дальше идет конкретное свойство, которое мы хотим задать, в нашем случае copyright, а потом значение этого свойства. В нашем случае — это строка с вашим именем. С помощью директивы #property можно настроить много специфических аспектов индикатора, в чем вы сейчас убедитесь. Все эти свойства будут заданы по умолчанию. Смотрим дальше:

Эта директива указывает, как можно связаться с автором. Вы можете спросить: где же эти данные (имя автора, как связаться), они ведь нигде не отображаются? Да, не отображаются, но они «прошиваются» в исполняемый файл. Если просмотреть исполняемый файл как обычный текст, то вы сможете увидеть эти данные:

Вам будет интересно  Индикаторы на основе фракталов без перерисовки

Эта директива указывает, что индикатор должен рисоваться в отдельном подокне. Как видите, никаких дополнительных параметров не указывается, как, например, в предыдущей директиве.

Эта директива указывает, сколько буферов данных будет использовать индикатор. Как вы заметили, директивы чем-то похожи на обычные функции: Они тоже принимают какие-то параметры и что-то делают в ответ. Но есть важное отличие: директивы выполняются в первую очередь (еще до начала компиляции).

Указываем цвет по умолчанию для первого буфера. Обратите внимание, что нумерация буферов в директивах начинается с единицы, а не с нуля. Постарайтесь запомнить это, чтобы в дальнейшем не возникало никакой путаницы. Цвет указывается с помощью одного из множества предопределенных названий. Посмотреть ключевые слова для всех доступных цветов можно в справке: Справочник MQL4 -> Стандартные константы -> Набор Web-цветов. Аналогично можно указать цвет и для других буферов, нужно просто изменить номер буфера.

Это наш параметр индикатора. Мы его настраивали в Мастере. Обратите внимание, что единственное отличие от обычной переменной — это наличие ключевого слова extern перед типом переменной. Вот как будет выглядеть этот параметр для пользователя при запуске индикатора:

Это обычный массив. Просто не указывается размерность и не выполняется инициализация. Этот массив в дальнейшем будет настроен как буфер данных.

Дальше у нас идет объявление и описание функций. В отличие от привычного для вас скрипта, в каждом индикаторе имеется 3, а не 1 функция:

  • init() — эта функция вызывается терминалом только один раз, когда вы запускаете индикатор. Ее назначение: подготовить индикатор для работы. Настроить буфера данных, проверить параметры (мало ли что там мог пользователь ввести) и другие подготовительные действия. Эта функция не является обязательной. Если вы не выполняете никакого кода в ней, то можете ее просто удалить.
  • deinit() — эта функция также вызывается только один раз, когда вы удаляете индикатор с графика. В ней вы должны подготовить индикатор для завершения работы. Например, закрыть открытые файлы, удалить графические объекты с графика (не переживайте, еще научитесь). Эта функция также необязательная.
  • start() — эта функция в отличие от скриптов, в индикаторе вызывается каждый тик. То есть, как только поступают новые котировки от валютной пары, к графику которой вы применили индикатор, так и будет сразу вызвана эта функция. Кроме того, эта функция вызывается при первом запуске индикатора, то есть после функции init().

Посмотрим, что происходит в каждой функции:

Здесь у нас вызываются 2 важные функции для настройки буфера данных:

Эта функция задает, каким образом рисовать буфер данных. Первый параметр указывает, к какому буферу применить изменение. Обратите внимание, что в этой функции (и подобной ей) нумерация буферов начинается с нуля, а не с единицы как в директивах. Это важный момент, смотрите не наломайте дров. Второй параметр указывает, как рисовать выбранный буфер. В нашем случае используется константа DRAW_LINE, которая указывает, что буфер следует рисовать в виде линии. Конечно, имеются и другие константы, но к ним мы вернемся позже.

Эта функция «привязывает» массив к номеру буфера. То есть она указывает, что буфер с указанным номером будет использовать указанный массив для хранения данных. Таким образом, в результате, изменяя элементы этого массива, вы будете изменять значения самого буфера. Фактически массив — это и есть буфер данных. Первый аргументномер буфера, к которому нужно привязать массив (нумерация с нуля). Второй аргументназвание массива, который следует привязать.

Завершение функции, возвращаем нуль — инициализация прошла успешно.

Функция деинициализации по умолчанию пуста.

Вот мы и добрались до самой главной функции. Весь основной код размещается здесь. Обратите внимание, что заранее объявлена переменная counted_bars (посчитанные бары), которая инициализируется функцией IndicatorCounted(). Эта переменная обычно используется для оптимизации и ускорения работы индикатора, о чем мы поговорим позже. А сейчас давайте наконец-то что-то нарисуем в окне индикатора!

Дописываем индикатор

Определимся что выводить. Что вообще нам будет показывать индикатор? Что-нибудь простое. Для начала давайте рисовать случайные числа. А что?? Этот индикатор гарантирует вам 50% прибыльных сигналов. Решено.

Идем к нашей функции init() и дописываем код для инициализации генератора случайных чисел:

Инициализация готова, переходим к функции start():

Компилируем — F7. Запускаем терминал, находим панель Навигатор, выбираем раздел Пользовательские Индикаторы и делаем двойной клик на названии нашего индикатора:

Индикатор будет добавлен к активному графику:

Как видите, все работает, теперь давайте хорошенько разберемся, что делает этот код:

Мы используем цикл for для того, чтобы пройтись по всем элементам буфера данных. Так как каждому элементу буфера соответствует определенный бар, то мы используем цикл, начиная проход с нулевого бара (последнего доступного) и заканчиваем первым доступным, который по счету меньше на единицу, чем переменная Bars (потому что мы считаем бары с нуля).

Каждую итерацию счетчик увеличивается на единицу, и мы двигаемся от последнего до первого доступного бара и одновременно присваиваем каждому элементу буфера (который соответствует своему бару) случайное число от 0 до 1000. Если вам сложно понять, как каждому элементу буфера соответствует свой бар, то попробуйте изменить цикл следующим образом и посмотрите на результат в терминале:

Теперь индикатор будет показывать номер каждого бара, посмотрите:

Как видите, номер бара постепенно увеличивается от последнего к первому (от 0 до Bars). Надеюсь теперь вы поняли, каким образом элементы буфера данных соответствуют барам на графике.

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

Как же решить эту проблему? Обычно поступают следующим образом. Сначала индикатор рассчитывается на всех доступных свечах, а уже потом по мере поступления котировок, будет пересчитываться показатель только для последней свечи. То есть поступаем рационально — никаких лишних телодвижений. Давайте оптимизируем функцию start(), чтобы она работала именно так:

Разбираем каждую строку:

Объявляем переменную counted_bars, которая будет хранить количество посчитанных индикатором баров. На самом деле функция IndicatorCounted() возвращает количество неизмененных баров после прошлого вызова функции start(). Таким образом, если это первый вызов функции start(), то IndicatorBars() возвратит нам 0, так как все бары для нас новые. Если же, это не первый вызов, то очевидно, что изменился только последний бар, поэтому IndicatorBars() возвратит число равное Bars-1.

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

Как уже было сказано, если IndicatorCounted() возвращает 0, то это значит, что функция start() вызывается впервые и все бары для нас «новые» (еще не рассчитывался индикатор для них). Но если это не первый вызов start(), то нам будет возвращено значение равное Bars-1. Так вот, это условие отслеживает как раз такую ситуацию. После чего мы уменьшаем переменную counted_bars на 1. Зачем это делается, ведь измениться может лишь последний бар?? Оказывается, что бывают ситуации, при которых последний тик предыдущего бара оказывается необработанным из-за того, что в момент прихода этого последнего тика обрабатывался предпоследний тик. Поэтому пользовательский индикатор не был вызван и не был рассчитан. Именно поэтому мы уменьшаем на 1 переменную counted_bars, чтобы исключить эту ситуацию.

Здесь мы присваиваем переменной limit (ограничителю) количество последних баров, которые нужно пересчитать. Так как в переменной counted_bars хранится количество свечей, которые уже рассчитаны, то мы просто находим разницу между Bars (всего доступных баров) и counted_bars, чтобы определить, сколько свечей необходимо пересчитать.

Сам цикл почти не изменился. Мы всего лишь поменяли условие выполнения. Теперь цикл будет выполняться пока счетчик i меньше чем ограничитель limit.

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

Вы еще не забыли про параметр индикатора (barsToProcess), который мы добавили в мастере. Сейчас самое время чтобы его задействовать. Нужно добавить всего пару строк перед циклом:

Как видите, все достаточно тривиально. Мы проверяем или больше limit чем barsToProcess и если да, то уменьшаем ограничитель через присваивание. В результате, если установить barsToProcess=100, то вы сможете наблюдать похожую картину:

Как видите, рассчитывается только определенное нами количество баров.

Наш индикатор практически готов. Но у нас нет четких сигналов для входа в рынок. Поэтому нужно добавить определенности. Для этой цели нам подойдут уровни.

Уровни — это горизонтальные линии, которые рисуются индикатором определенным стилем, цветом и толщиной. Важно отметить, что максимальное количество уровней на одном баре: 8. Кроме того вы можете задавать уровни как с помощью директив, так и используя функции. Предпочтительнее использовать первый вариант, если вы собираетесь настроить уровни по умолчанию. Для динамического изменения уровней во время работы индикатора используйте функции. Итак, разместим 2 уровня: первый на отметке 800, второй — 200. Для этого добавим несколько директив в начале кода индикатора:

Вам будет интересно  Торговля импульсных движений на форекс | Strategy4you

Разберемся в новых директивах:

Эта директива указывает, что уровень номер 1 следует разместить на отметке 800.0. Обратите внимание, что нумерация буферов начинается с единицы, подобно тому, как это сделано в директивах для настройки буферов. Чтобы настроить другой уровень, следует просто поменять номер уровня в конце директивы:

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

Эта директива устанавливает цвет, который будет использоваться для рисования всех уровней.

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

Эта директива задает стиль для рисования линии. Доступны такие предопределенные константы:

  • STYLE_SOLID — сплошная линия
  • STYLE_DASH — штриховая линия
  • STYLE_DOT — пунктирная линия
  • STYLE_DASHDOT — штрих-пунктирная линия
  • STYLE_DASHDOTDOT — штрих-пунктирная линия с двойными точками

На этом разработка нашего «случайного» индикатора закончена. Давайте сохраним исходный файл с более подходящим названием — randomIndicator.mq4. Перекомпилируйте исходники еще раз. В следующем разделе этот индикатор нам еще пригодиться. Финальная версия с уровнями должна выглядеть примерно так:

Функция iCustom

Сейчас мы познакомимся с очень полезной функцией — iCustom. Она используется для того, чтобы получить показатели любого пользовательского индикатора. То есть, если для встроенных индикаторов мы используем функции для работы с техническими индикаторами, которые мы рассмотрели в прошлой статье (например: iADX(), iMACD и т.д.), то для всех остальных индикаторов (пользовательских индикаторов) мы используем функцию iCustom. Эта функция является универсальной и может использоваться с любым пользовательским индикатором, который соответствует таким требованиям:

  • индикатор откомпилирован и имеет вид исполняемого файла (*.ex4)
  • индикатор размещен в папке MetaTrader 4expertsindicators

Прототип функции имеет следующий вид:

  • symbol – определяет, какой финансовый инструмент (валютную пару) использовать для вычисления показателя пользовательского индикатора. Используйте NULL (или 0), если вам нужен текущий (активный) инструмент (график).
  • timeframe – определяет, на каком тайм фрейме (периоде) использовать индикатор. Используйте 0 для текущего периода или одну из констант (PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1).
  • name – название исполняемого файла пользовательского индикатора. Указывается только название: не нужно писать расширение(.ex4) или путь к файлу(experts/indicators/). Например, если название исполняемого файла пользовательского индикатора имеет вид «RandomIndicator.ex4», то нужно написать «RandomIndicator». При этом регистр не имеет значения. То есть можете написать «RANDOMindicator» и это тоже сработает.
  • . – в этом месте указываются все значения параметров пользовательского индикатора. Например, в нашем индикаторе RandomIndicator всего один параметр — barsToProcess. То есть в нашем случае, мы напишем здесь 100 (или другое подходящее вам значение). Если параметров больше одного, то они указываются в том порядке, в котором они объявлены в пользовательском индикаторе через запятую. Если не очень понятно, то не беспокойтесь, мы сейчас напишем индикатор на основе этой функции.
  • mode – режим работы пользовательского индикатора. На самом деле это всего лишь номер буфера данных, значение которого вы хотите получить. Нумерация производиться с нуля (в отличии от директив). Если пользовательский индикатор имеет всего лишь один буфер данных, то следует указать 0 в качестве этого параметра.
  • shift – определяет, к какому бару применить пользовательский индикатор.

Примеры использования:

Сигнальный индикатор

Сейчас мы с вами напишем еще один простенький индикатор. Итак, представьте себе такую ситуацию. Вы написали довольно сложный индикатор с множеством буферов данных. Многие из них выводятся в отдельном окне, остальные используются для промежуточных расчетов. Вы точно знаете сигналы на покупку и продажу. Но вот незадача: их (сигналы) достаточно сложно отследить. Вам приходится постоянно пялится в монитор, пытаясь выявить очередное пересечение линий, которые находятся выше или ниже уровней. Поэтому вы решаете написать еще один индикатор, который делал бы все это сам, а вам лишь показывал сигналы для входа в рынок. Например, это могли бы быть стрелочки, которые указывают, в каком направлении открывать позиции. Это всего лишь фантазия, которая показывает, где было бы уместно написать сигнальный индикатор. У нас ситуация намного проще, но карта той же масти.

Мы будем писать сигнальный индикатор на основе прошлого индикатора RandomIndicator. Сначала нужно точно определить условия для входа в рынок. Уровни мы ведь не просто так добавляли, поэтому условия будут следующие:

  • если линия поднимается выше верхнего уровня (800.0), то покупаем
  • если линия опускается ниже нижнего уровня (200.0), то продаем

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

А последний шаг настройте следующим образом:

Сначала нужно добавить 2 буфера данных, которые будут использоваться, чтобы рисовать сигналы на покупку и продажу в виде стрелочек. Измените тип буферов данных на Arrow. Поменяйте цвета и измените коды символов. Ниже представлены все доступные коды символов:

Также не нужно рисовать индикатор в отдельном окне, так как мы собираемся рисовать сигналы прямо в окне графика цен.

Мы используем 2 буфера данных, потому что мы не можем рисовать разные стрелочки (символы) одним буфером. Каждый буфер данных, который выводится в виде символов, может рисоваться только одним символом. Теперь давайте внимательно посмотрим на код инициализации индикатора:

Обратите внимание, что теперь используется другая константа для типа вывода буфера данных — DRAW_ARROW:

Также появилось 2 новые функции, которые используются специально для настройки вывода символов. SetIndexArrow используется, чтобы задать каким символом рисовать буфер. Первый аргумент — номер буфера, второй — код символа, которым следует рисовать:

SetIndexEmptyValue используется, чтобы указать «пустое» значение. То есть мы указываем, при каком значении не нужно ничего рисовать вообще. Это очень удобно в нашем случае, так как сигналы встречаются далеко не на каждом баре. Это работает следующим образом. Когда вам не нужно выводить стрелочку на текущем баре, вы присваиваете соответствующему элементу буфера данных «пустое» значение, в нашем случае 0. Первый аргумент функции — номер буфера данных. Второй — «пустое» значение:

Остальной код инициализации настраивает буферы аналогично «случайному» индикатору, который мы рассмотрели выше. Теперь давайте допишем код в функцию start():

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

Сначала мы объявляем переменную randomValue (случайное значение), которой присваиваем значение нашего «случайного» индикатора на текущем баре. Для этого мы используем функцию iCustom:

Если значение «случайного» индикатора больше верхнего уровня (800), то это сигнал на покупку:

Иначе, если сигнала на покупку нет, то:

Если же значение «случайного» индикатора меньше нижнего уровня (200), то это сигнал на продажу:

Иначе, если сигнал на продажу отсутствует, то:

Вот и весь цикл. Откомпилируйте индикатор и запустите его в терминале:

О стиле

Нет, не о том, как правильно подобрать галстук к костюму и рубашке, хотя всегда актуально. Стиль программирования очень важен, если вы не пишите код исключительно для себя. Дело в том, что у каждого программиста свой индивидуальный стиль. Каждый по-разному оформляет циклы, делает разные отступы (а некоторые вообще не делают), объявляет переменные и т.д. Вы должны выработать свой стиль программирования, которого вы будете придерживаться в дальнейшем. Я хочу дать вам пару советов, которые помогут сделать код более читабельным и приятным для восприятия:

  • не пишите много операций в одну строку через точку с запятой (;).
  • пишите названия переменных и функций на английском языке
  • в названиях переменных используйте заглавные буквы как разделители
  • не злоупотребляйте сокращениями, называя переменные и функции
  • делайте отступы строгой длины, чтобы блоки кода были выровнены
  • в каждом новом теле (цикла, условия) делайте дополнительный отступ
  • группируйте объявления однотипных переменных
  • хорошо комментируйте большие и сложные блоки кода
  • хорошо комментируйте написанные вами функции (их назначение, параметры)

Заключение

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

Конструкторы советников Forex

Конструкторы советников

Уровень знаний и навыков торговли, которыми владеет трейдер, влияет на степень успеха Forex торговли. Без этого невозможно правильно анализировать ситуацию на рынке и находить точки входа в рынок, чтобы получить профит. Первые роботы появились, когда акулы трейдинга, в целях экономии времени, задались вопросом автоматизации торговли.

Вам будет интересно  Supertrend – точный трендовый индикатор

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

В основу каждой Automatic Trading System или ATS закладывается конкретная торговая стратегия. В случае, когда автоматизация торговли не приносит желаемого результата, трейдеры винят экспертов, а не автора торговой стратегии – каркасной основы будущего робота. Не дают твердую гарантию прибыли и платные советники, покупателями которых чаще становятся начинающие трейдеры и те, кто не желает изучать теорию рынка, вникать в алгоритм работы торговых инструментов.

Трейдеры мечтают самостоятельно написать робота на базе собственной торговой стратегии. Эта задача решается несколькими способами:

  1. заказать робота у программистов;
  2. садиться за изучение языков программирования, чтобы не на пальцах объяснять компьютеру правила и условия, по которым будут работать роботы;
  3. использовать конструктор торговых роботов для модификации готовой или создания новой ATS.

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

Получить бесплатно ТОП 5 лучших торговых роботов можно здесь!

Классификация экспертов

Перед созданием торгового робота, важно понимать, какого типа будет советник, и какую задачу будет решать:

  • автоматический советник анализирует рынок круглосуточно и торгует по условиям, которые трейдер указал в алгоритме работы бота;
  • полуавтоматический советник также круглосуточно анализирует рынок, подает сигналы на открытие торговых позиций, рекомендует уровни для Take Profit и Stop Loss, объемы лотов. Решение по сигналам и рекомендациям этого советника принимает трейдер;
  • скрипты — небольшие программы, которые предлагают варианты сделок. Выбор варианта и решение на вход остается за трейдером. Сигналы скриптов рассматривают, как подтверждение или усиление сигналов торговой стратегии.

По свойствам и типу торговой стратегии в алгоритме советников разделают на категории:

  • комбинированных – рабочий алгоритм таких ATS базируется на нескольких торговых стратегиях;
  • мультивалютных – роботов, которые одновременно торгуют несколькими валютными инструментами;
  • роботы для долгосрочной торговли;
  • скальперы или советники для краткосрочной торговли.

Торговый робот функционирует по алгоритму, который построил программист. Алгоритм строится на базе торговой стратегии, которую разработал трейдер. Поэтому не стоит возлагать большие надежды на советников – роботы работают по сценариям, которые пишут люди.

Торговые эксперты, которых собирают с помощью конструкторов, мало чем отличаются. В некоторых конструкторах роботы сразу создаются с расширением «*.ex4» и без проблем встраиваются в торговый терминал Metatrader4. Для установки такой файл перетаскивают в окно графика нужного валютного инструмента. Некоторые конструкторы легко интегрируются и функционируют непосредственно из среды МТ4.

Конструктор советников Форекс

При выборе конструктора трейдеров интересуют следующие нюансы:

  • функционал программы – при создании сложных ATS желательно, чтобы генерирование кода, отладка, тестирование и запуск готового советника, проводились в одной программе;
  • интерфейс – одни конструкторы русифицированы, другие с англоязычным, но интуитивно понятным и комфортным в работе интерфейсом;
  • язык программирования – в большинстве конструкторов коды и скрипты пишутся на языке С# или C++, который сложно выучить рядовому трейдеру и MQL, изучить который можно в течение двух недель. Некоторые конструкторы для построения советников предлагают использовать функциональные блоки. В этом случае знание языков программирования не требуется.

Ниже приводим описание 10 популярных сегодня конструкторов.

1. MetaEditor

Редактор запускается из среды МТ4 и представляет собой бесплатный, конструктор с полным функционалом и языком программирования MQL, знать который – не обязательное условие работы с этой программой. На рисунке 1 видно, какие задачи этот редактор советников предлагает выполнить пользователю.

конструктор MetaEditor

Готовый алгоритм можно сразу протестировать в тестере стратегий и запустить в МТ4.

StockSharp

Конструктор представляет собой библиотеку торговых роботов. Коды новых экспертов создаются в Visual Studio или другой программной среде. Для работы в этом конструкторе трейдеру сначала придется изучить язык программирования С# и содержимое библиотеки. Это причины, по которым новичкам в этом редакторе работать не рекомендуется.

платформа StockSharp

TSLab

Работать в этой среде, в сравнении с предыдущим редактором, легче и проще. Конструктор предлагает создавать советников из готовых функциональных блоков. Код блоков, которые писались в среде С++, не виден пользователю в процессе работы и не доступен для изменений. Скрипты и коды, которые пользователь пишет самостоятельно, остаются открытыми для изменения и коррекции.

TSLab

WealtLab

Программа представляет собой визуальный редактор, в котором роботов пишут на языке программирования С#. Конструктор слабоват, но тестер стратегий, посредством которого тестируется работа советников или скриптов, в работе безупречен.

редактор WealtLab

Этот конструктор считается средним звеном между двумя предыдущими программами. Тестер WealtLab, который выводит результаты тестов в графическом виде, в тестировании среднесрочных и внутридневных торговых форекс стратегий считается полезным инструментом. Одним, но весомым недостатком этого редактора пользователи называют слабую скорость тестирования – на одном процессорном ядре тестер не умеет работать быстрее.

Forex EA Generator

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

конструктор Forex EA Generator

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

Gordago Forex Optimizer

Графически окно этого конструктора напоминает рабочую среду МТ4. В верхней зоне окна указываются условия по входу в рынок. В нижней части окна фиксируются условия на выход из рынка. Конструктор отличается интуитивно-понятным интерфейсом. Редактор хранит торговые стратегии в файлах с собственным – «*.gso», расширением. Готовый форекс советник без проблем интегрируется в МТ4.

Конструктор Gordago Forex Optimizer

В платформу входит торговый сервер, пользователь может сразу протестировать нового советника на архивных котировках и начать торговлю при наличии соединения серверов. При работе с Gordago Forex Optimizer пользователь:

  • добавляет в окно редактора необходимые торговые инструменты и определяет задачи для анализа рыночной ситуации;
  • указывает параметры на автоматическое открытие торговых позиций;
  • определяет значения для установки отложенных ордеров, уровней Stop Loss и Take Profit.

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

Hlaiman EA Generator

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

Программная среда Hlaiman EA Generator

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

Ensed Cor

Это платный редактор кодов. Конструктор мало функциональный, с минимальным набором инструментов. Даже в demo варианте недостаточно инструментов, слабый функционал программы. Насколько полезен этот редактор, решайте сами. У бесплатного редактора MetaEditor и то функционал больше. Готовые советники сохраняются с расширением «*.ex4» и легко встраиваются в торговую платформу МТ4.

Ensed Cor

Forex Strategy Builder

Конструктор в чести у профессиональных трейдеров. Платформа функционирует на базе ядра МТ4, поэтому на 100% совместима с торговым терминалом, без него работать не сможет. В центре окна редактора лежит поле для ввода скриптов и кода с описанием условий и параметров торговой стратегии. В левой части окна – панель для вывода результатов тестирования. Робота проверяют в тестере стратегий, после чего советник интегрируется в соответствующий каталог МТ4 и готов к работе.

Конструктор Forex Strategy Builder

Trading diagram

Конструктор «Торговая диаграмма» — это графический редактор с блочным интерфейсом, блоки которого выстраиваются в виде диаграммы. Блоки соединяют стрелками для связи программных компонентов между собой. Точное введение параметров и указание связей для блоков гарантирует правильную и корректную работу советника.

Поместите необходимые блоки «Technical Analysis» на диаграмму редактора:

Размещение блоков в редакторе Trading diagram

Кликом мыши по иконке «ТА» вызовите окно параметров и задайте нужные значения торговых условий для длинных позиций:

Trading diagram

Таким же способом задайте значения на вход по коротким позициям:

Ввод значений для коротких позиций

Теперь поставьте на диаграмму блоки «Buy» и «Sell»:

Размещение в поле диаграммы блоков «Buy» и «Sell»

Следующим шагом, задайте параметры значений для Stop Loss и Take Profit, укажите шаг для Trailing Stop блока «BUY»:

Задание параметров для Buy

Задайте параметры Stop Loss, Take Profit и Trailing Stop для блока «SELL»:

Указание значений для Sell

Соедините между собой блоки, чтобы получить диаграмму торговли:

Соединение программных блоков в Trading Diagram

На следующем шаге сгенерируйте диаграмму, чтобы получить программный код советника. В меню «Trading Diagram» на панели инструментов выберите пункт «Generate MQL5 Code» для генерирования программного кода диаграммы. Сгенерированный торговый робот готов к использованию и доступен для работы в МТ4 или МТ5. Для активации советника перетащите файл бота на рабочий график терминала.

Получить бесплатно ТОП 5 лучших торговых роботов можно здесь!

Заключение

Конструктор форекс советников необходим:

  • профессионалам трейдинга;
  • молодым игрокам
  • тем, кто не знает языков программирования.

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

Ни один советник не будет работать в прибыль на недоработанной торговой стратегии. Готовых экспертов используйте в трейдинге только после тщательного тестирования. Конструктор помогает в создании экспертов, но стратегию торговли разрабатывает сам трейдер.

Комментарии

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

https://www.mql5.com/ru/articles/1500
https://1sovetniki.ru/sozdanie-torgovix-robotov/konstruktory-sovetnikov-forex