|
|
|
|
|
|
|
|
|
Любая торговая система состоит из сигналов открытия и закрытия позиций, подтягивания защитных стопов. Большинство экспертов пишутся на основе стандартных индикаторов, входящих в состав МТ4, которые в справке называются техническими индикаторами. Рассмотрим простейшую систему, основанную на пересечении двух скользящих средних (Moving Average). Этот индикатор имеет два параметра — период усреднения(количество баров, используемых для расчета) и метод усреднения (тип цены). Есть еще и третий параметр — смещение, но мы его в данном примере использовать не будем. Ситуация, когда средняя с коротким периодом пересекает среднюю с длинным периодом, обычно используется для продажи, для покупки все наоборот. Сделаем скрипт (CrossMASignals. mq4), который будет наносить на график сигналы покупок в виде синих стрелок, направленных вверх, и сигналы продаж в виде красных стрелок, направленных вниз.
|
|
|
|
|
На рисунке видно, что 21 июля 2005 года средняя с периодом 13 (значение 1.2052) пересекла снизу вверх среднюю с периодом 21 (значение 1.2050). Синюю стрелку мы поставим по цене открытия дневного бара 22.07.2005, так как сигналы мы будем принимать по закрывшимся барам, это избавит от ложных сигналов, когда цена может в течение дня несколько раз сходить вверх и вниз. Создадим такую блок-схему:
|
|
|
|
|
Хотя проверять пересечение средних в самом начале графика (от бара с индексом Bars-1) и не совсем правильно, но в данном случае ошибку мы не получим и не будем пока разбирать — почему в начале графика значения средних равны нулю.
|
|
|
|
|
Нам необходимо в своем коде получить значения этих средних на каждом баре. Зададим две переменные maLong и maShort и будем присваивать им соответствующие значения. Из справки видно, что необходимо указать символ (NULL), тайм-фрейм (0), значения периодов (21 и 13), смещение (у нас будет нулевым), тип усреднения (простое), тип цены (применим цены закрытия) и индекс бара.
|
|
|
|
|
Факт пересечения двух средних можно проверить таким образом — на текущем баре быстрая средняя выше медленной средней, а на предыдущем баре наоборот- медленная средняя выше быстрой средней. Поэтому сделаем не две, а четыре переменные maLongCur, maLongPrev, maShortCur, maShortPrev.
|
|
|
|
|
Я сделал рисунок, который показывает связь между параметрами индикатора на графике и параметрами технического индикатора, вызываемого в коде. Для любого встроенного индикатора в МТ4 существует его вызов в языке MQL-4 в виде технического индикатора.
|
|
|
|
|
Скрипт почти готов, осталось только как-то поставить в нужных местах стрелки. Тут нам на помощь придут функции для работы с графическими объектами. Чтобы создать стрелку, необходимо: 1. создать Объект типа символ 2. задать координаты времени (X) и цены (Y) , к которым привязывается объект 3. указать вид символа и цвет, которым он будет отображаться на графике
Все графические объекты в МТ4 создаются функцией ObjectCreate() . При этом объекту при создании сразу дается уникальное имя, двух объектов с одинаковым именем быть не может. При попытке создать второй объект с уже существующим именем объект создан не будет, ошибка в терминал выведена не будет (но сам факт ошибки проверить можно будет ) чтобы не мешать пользователю. Это самая частая ошибка при работе с графическими объектами, складывается впечатление, что программа не работает, начинаются бесплодные попытки найти ошибку в алгоритме кода, а ее нет — есть ошибка создания множества графических объектов с одинаковыми именами. Мы создаем стрелку функцией ObjectCreate(«уникальное_имя_объекта», OBJ_ARROW, handle_окна, время, цена). Параметр OBJ_ARROW — указывает, что создается объект типа стрелка(символ), handle_окна — указатель на окно, в котором объект будет создан (обычно равен нулю, что указывает на «родное» окно), время и цена — координаты стрелки. После создания стрелки нам необходимо указать код символа — ObjectSet(«уникальное_имя_объекта», OBJPROP_ARROWCODE, код_символа) . Функция ObjectSet() служит для установки свойств графического объекта, для каждого типа объекта требуется свой второй тип параметра, в нашем случае для объекта OBJ_ARROW установить код символа мы можем параметром OBJPROP_ARROWCODE, коды символов можно посмотреть в справке MetaEditor. Кроме того, можно использовать символы из шрифта Wingdings, справка по ним тоже приведена.
|
|
|
|
|
Нам подойдут символы с кодом 241 и 242. Далее осталось только задать последнее свойство — цвет символа. Опять используем функцию ObjectSet() и зададим свойство OBJPROP_COLOR либо Red либо Blue по ситуации.
|
|
|
|
|
Скрипт готов, но остался последний вопрос — уникальность имени для каждой стрелки. В коде есть объявление строковой переменной arrowName, это имя используется при создании каждой новой стрелки и при изменении атрибутов объектов-стрелок. Самый простой способ решить эту проблему — использовать переменную целого типа, например int arrowCounter, и при каждом создании новой стрелки стрелки увеличивать счетчик стрелок на единицу с помощью arrowCounter++. Уникальное имя будем получать сложением выражения «arrow» и arrowCounter, будем получать имена типа arrow1, arrow2 и так далее.
|
|
|
|
|
Скрипт почти окончательно готов, он работает, запускаем на графике EURUSD D1 и мгновенно появляются стрелки. Нажимаем кнопки Ctrl+B — появляется окно со списком графических объектов, прикрепленных к графику.
|
|
|
|
|
Мы получили «графический» индикатор, его достоинство — стрелки остаются на своих местах при смене тайм-фрейма, например, при переключении на Weekly. Если мы нажмем кнопку «Правка», то попадем в окно свойств выделенного объекта. Я выбрал стрелку(объект Arrow) с именем arrow1. На вкладках «Общие» и «Параметры» мы видим те значения, что были заданы скриптом — имя объекта, цвет, координаты время и цена, а также код символа — 242.
|
|
|
|
|
Единственный неучтенный момент — если мы попробуем запустить скрипт второй раз — он или не сработает или сработает не совсем правильно. Ведь при каждом запуске скрипта создаются объекты с именами arrow1, arrow2 и так далее, но ведь эти объекты уже существуют после запуска скрипта в первый раз. И поэтому, если нам будет необходимо его запустить на том же инструменте, но на другом тайм-фрейме, нам придется вручную предварительно удалить все стрелки, это можно сделать с помощью меню «Графики» — «Объекты» — «Удалить все значки». Это не самый удачный путь, удаление объектов можно проводить функцией ObjectsDeleteAll(номер_окна, тип_объекта). Она возвращает количество объектов, которое было удалено. Выведем это значение на график с помощью функции Comment(строка_вывода). Эта функция удобна для использования в индикаторах и советниках для отражения необходимой текущей информации. Теперь у нас есть скрипт, в котором учтено все для правильной работы.
Сам скрипт CrossMASignals можно взять здесь
Перейти к статье «Функции init() и deinit()».
|
|
|
|
|
|