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

Vladimir | 14 апреля, 2009

Введение

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

Возможности языка 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);
  }
//+------------------------------------------------------------------+