Скачать MetaTrader 5

Alert и Comment для внешних индикаторов

14 апреля 2009, 07:16
Vladimir
4
2 415

Введение

Создатели индикаторов, как показывает практика, не всегда включают возможность вывода «Алертов» или «Комментов» в коде индикатора, что приводит к поступлению просьб доработать индикатор с возможностью вывода сигналов.

Возможности языка MQL4 для вывода информации от индикаторов

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

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

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



Типовой вывод сигнала


В MQL4 можно использовать некоторые встроенные возможности для более информативного представления информации.

Среди команд языка функция

double ObjectGet (string name, int prop_id)

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

Параметры:
name - имя объекта.
prop_id - Идентификатор свойства объекта. Может быть любым из значений списка свойств объекта.

Идентификаторы свойств объекта используются в функциях ObjectGet() и ObjectSet(). Mогут быть любыми из следующих величин:

Константа Значение Тип Описание
OBJPROP_TIME10datetimeПолучает/устанавливает первую координату времени
OBJPROP_PRICE11doubleПолучает/устанавливает первую координату цены
OBJPROP_TIME22datetimeПолучает/устанавливает вторую координату времени
OBJPROP_PRICE23doubleПолучает/устанавливает вторую координату цены
OBJPROP_TIME34datetimeПолучает/устанавливает третью координату времени
OBJPROP_PRICE35doubleПолучает/устанавливает третью координату цены
OBJPROP_COLOR6colorПолучает/устанавливает цвет объекта
OBJPROP_STYLE7intПолучает/устанавливает стиль линии объекта
OBJPROP_WIDTH8intПолучает/устанавливает ширину линии объекта
OBJPROP_BACK9boolПолучает/устанавливает флаг фонового отображения объекта
OBJPROP_RAY10boolПолучает/устанавливает флаг свойства луч для объектов типа OBJ_TREND и ему подобных
OBJPROP_ELLIPSE11boolПолучает/устанавливает флаг отображения полного эллипса для объекта OBJ_FIBOARC
OBJPROP_SCALE12doubleПолучает/устанавливает значение масштаба объекта
OBJPROP_ANGLE13doubleПолучает/устанавливает значение угла в градусах объекта OBJ_TRENDBYANGLE

OBJPROP_ARROWCODE

14

int

Получает/устанавливает код стрелки объекта OBJ_ARROW. Может быть одним из символов wingdings или один из предопределенных кодов стрелок

OBJPROP_TIMEFRAMES15intПолучает/устанавливает свойство отображения объекта на различных периодах. Может быть одним или комбинацией нескольких из констант видимости объекта.
OBJPROP_DEVIATION16doubleПолучает/устанавливает размер отклонения для объекта OBJ_STDDEVCHANNEL
OBJPROP_FONTSIZE100intПолучает/устанавливает размер шрифта для объектов OBJ_TEXT и OBJ_LABEL
OBJPROP_CORNER101intПолучает/устанавливает номер угла привязки для объекта OBJ_LABEL. Принимает значения 0-3
OBJPROP_XDISTANCE102intПолучает/устанавливает расстояние X-координаты в пикселях относительно угла привязки для объекта OBJ_LABEL
OBJPROP_YDISTANCE103intПолучает/устанавливает расстояние Y-координаты в пикселях относительно угла привязки для объекта OBJ_LABEL
OBJPROP_FIBOLEVELS200intПолучает/устанавливает число уровней объекта Fibonacci. Может быть от 1 до 32
OBJPROP_LEVELCOLOR201colorПолучает/устанавливает цвет линии уровня объекта
OBJPROP_LEVELSTYLE202intПолучает/устанавливает стиль линии уровня объекта
OBJPROP_LEVELWIDTH203intПолучает/устанавливает ширину линии уровня объекта
OBJPROP_FIRSTLEVEL+n210+nintПолучает/устанавливает номер уровня объекта, где n - индекс устанавливаемого/получаемого уровня. Может быть от 0 до 31

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

Создаем код для получения информации о наименованиях японских свечей для индикатора “japan”. Код получается такой:

int    obj_total=ObjectsTotal(); // Определяем общее количество объектов на графике
  for(int i=0;i<obj_total;i++) // Цикл перебора всех значков с целью нахождения нужных
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE) // считывание кода

Сначала мы должны определить, какие будем учитывать значки Wingdings и соответственно настроить параметры в программном коде. В данном примере мы будем учитывать часть таблицы Wingdings,начинающуюся со 100.

if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>100&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])

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

Теперь нам остается вывести на Алерты и (или) Комменты.

       if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
       if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}

В строке комментов

("\n","\n","\n",

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

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

Применяя указанный подход, получаем такой результат:


Результат работы индикатора по выводу внешней информации


Аналогично код работает с индикатором ExCandles2. Это второй индикатор, который есть в базе индикаторов MQL4, он был опробован совместно с опубликованным кодом.

Заключение

Исходный код индикатора для вывода информации о появляющихся сигналах индикаторов:

//+------------------------------------------------------------------+
//|                                                  AlertSignal.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                                 http://fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, FIBOOK.RU"
#property link      "http://fibook.ru"

#property indicator_chart_window
extern int ExtBars=10;        // Количество последних баров для просчета
extern int ExtArrow=100;      // Номер кода в таблице "wingdings"  для начала отсчета
extern bool ExtAlert=true;    // Переключатель вывода "Алертов"
extern bool ExtComment=true;  // Переключатель вывода "Комментов"
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   if (per == Time[0]) return; // Корректируем один раз в период
      per = Time[0];

   int cod=0;
//----

int    obj_total=ObjectsTotal();
  for(int i=0;i<obj_total;i++)
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>ExtArrow&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])
                {
                  if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
                  if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}
                }
     }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Прикрепленные файлы |
AlertSignal.mq4 (3.18 KB)
Sergey Kravchuk
Sergey Kravchuk | 14 апр 2009 в 09:03
При использовании этой техники необходимо помнить, что стрелки OBJPROP_ARROWCODE из символов wingdings позиционируются очень не точно. Например, там есть занятные символы в виде точек, ромбиков, перекрестий-прицелов и т.п. которые хотелось бы поставить точно по месту (на нужный бар и нужную цену). Но поскольку эти стрелки это на самом деле обычные тексты (просто нарсованны не буквы а картинки), то координаты привязки берутся для одного из углов (помоему верхнего левого) всего знакоместа символа. Т.е. в заданную вами координату будет установлен именно этот угол а не центр точки или перекрестие. Пока размер стрелок не большой - погрешности не очень заметны, но если вы решите сделать их побольше, то символ (особенно при сильно ужатом масштабе графика) может вообще "перепрыгнуть" на соседний бар.
Vladimir
Vladimir | 14 апр 2009 в 20:33
ForexTools:
При использовании этой техники необходимо помнить, что стрелки OBJPROP_ARROWCODE из символов wingdings позиционируются очень не точно. Например, там есть занятные символы в виде точек, ромбиков, перекрестий-прицелов и т.п. которые хотелось бы поставить точно по месту (на нужный бар и нужную цену). Но поскольку эти стрелки это на самом деле обычные тексты (просто нарсованны не буквы а картинки), то координаты привязки берутся для одного из углов (помоему верхнего левого) всего знакоместа символа. Т.е. в заданную вами координату будет установлен именно этот угол а не центр точки или перекрестие. Пока размер стрелок не большой - погрешности не очень заметны, но если вы решите сделать их побольше, то символ (особенно при сильно ужатом масштабе графика) может вообще "перепрыгнуть" на соседний бар.
А данный индикатор не рисует, а считывает информацию из объектов уже нанесенных на график. В указанном примере я привел возможность считывания описаний объектов, причем можно поставить фильтр и выбрать только необходимые объекты для комментирования.
Genkov
Genkov | 14 апр 2009 в 20:43
ForexTools:
При использовании этой техники необходимо помнить, что стрелки OBJPROP_ARROWCODE из символов wingdings позиционируются очень не точно. Например, там есть занятные символы в виде точек, ромбиков, перекрестий-прицелов и т.п. которые хотелось бы поставить точно по месту (на нужный бар и нужную цену). Но поскольку эти стрелки это на самом деле обычные тексты (просто нарсованны не буквы а картинки), то координаты привязки берутся для одного из углов (помоему верхнего левого) всего знакоместа символа. Т.е. в заданную вами координату будет установлен именно этот угол а не центр точки или перекрестие. Пока размер стрелок не большой - погрешности не очень заметны, но если вы решите сделать их побольше, то символ (особенно при сильно ужатом масштабе графика) может вообще "перепрыгнуть" на соседний бар.

Спасибо за работу! по-моему это хорошая дополнительная информация. Однако, надо не переусердствовать т.к. избыток информации может навредить!
Юрий Лукошко
Юрий Лукошко | 11 сен 2016 в 07:36
Здравствуйте.Прошу прощения за то, что возможно попал не на ту ветку. Сколько я не читал о том, как вставить алерт в индикатор, не могу уложить в голову, как это происходит. Читаешь-все просто. Откроешь код своего индикатора- что-то похожее видишь, дальше мозговой коллапс. Просто здесь заметил пользователя Sergey Kravchuk(когда искал инфу о вставке алерта, его на какой-то ветке нашел). Смысл в том что мне это не доходит. Здесь туп как пробка. Поэтому и прошу помощи. Нужно, чтобы индюк Better Volume трезвонил когда гистограмма обьема окрашивается в красный и белый цвета.Извиняйте, что дурим вам голову.Спасибо.
Конструктор трейдера: Украшение индикаторов Конструктор трейдера: Украшение индикаторов

Основные задачи при раскрашивании индикаторов, их решение и автоматизация.

Взаимодействие между MеtaTrader 4  и MATLAB Engine (виртуальная машина MATLAB) Взаимодействие между MеtaTrader 4 и MATLAB Engine (виртуальная машина MATLAB)

В данной статье рассматривается вопрос создания DLL библиотеки - обертки, которая позволит взаимодействовать MetaTrader 4 с математическим рабочим столом пакета MATLAB. Описаны "подводные камни" и пути их преодоления. Статья рассчитана на подготовленных программистов С/С++, использующих компилятор Borland C++ Builder 6.

Принцип суперпозиции и интерференции финансовых инструментов Принцип суперпозиции и интерференции финансовых инструментов

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

К вопросу об управлении капиталом К вопросу об управлении капиталом

В статье рассмотрены некоторые аспекты, возникающие при использовании различных систем управления капиталом, применительно к ФОРЕКС. Приведены данные экспериментов с моделью процесса торговли, в которой при совершении торговых сделок используются разные методы управления капиталом (Money Management - ММ).