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

Автор: lexy Вторник, Сентябрь 9th, 2014 Нет комментариев

Рубрика: Разное

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

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

 

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

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

 

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

 


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

 

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

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

double ObjectGet (string name, int prop_id)

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

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

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

 

Константа Значение Тип Описание
OBJPROP_TIME1 0 datetime Получает/устанавливает первую координату времени
OBJPROP_PRICE1 1 double Получает/устанавливает первую координату цены
OBJPROP_TIME2 2 datetime Получает/устанавливает вторую координату времени
OBJPROP_PRICE2 3 double Получает/устанавливает вторую координату цены
OBJPROP_TIME3 4 datetime Получает/устанавливает третью координату времени
OBJPROP_PRICE3 5 double Получает/устанавливает третью координату цены
OBJPROP_COLOR 6 color Получает/устанавливает цвет объекта
OBJPROP_STYLE 7 int Получает/устанавливает стиль линии объекта
OBJPROP_WIDTH 8 int Получает/устанавливает ширину линии объекта
OBJPROP_BACK 9 bool Получает/устанавливает флаг фонового отображения объекта
OBJPROP_RAY 10 bool Получает/устанавливает флаг свойства луч для объектов типа OBJ_TREND и ему подобных
OBJPROP_ELLIPSE 11 bool Получает/устанавливает флаг отображения полного эллипса для объекта OBJ_FIBOARC
OBJPROP_SCALE 12 double Получает/устанавливает значение масштаба объекта
OBJPROP_ANGLE 13 double Получает/устанавливает значение угла в градусах объекта OBJ_TRENDBYANGLE
OBJPROP_ARROWCODE 14 int Получает/устанавливает код стрелки объекта OBJ_ARROW. Может быть одним из символов wingdings или один из предопределенных кодов стрелок
OBJPROP_TIMEFRAMES 15 int Получает/устанавливает свойство отображения объекта на различных периодах. Может быть одним или комбинацией нескольких из констант видимости объекта.
OBJPROP_DEVIATION 16 double Получает/устанавливает размер отклонения для объекта OBJ_STDDEVCHANNEL
OBJPROP_FONTSIZE 100 int Получает/устанавливает размер шрифта для объектов OBJ_TEXT и OBJ_LABEL
OBJPROP_CORNER 101 int Получает/устанавливает номер угла привязки для объекта OBJ_LABEL. Принимает значения 0-3
OBJPROP_XDISTANCE 102 int Получает/устанавливает расстояние X-координаты в пикселях относительно угла привязки для объекта OBJ_LABEL
OBJPROP_YDISTANCE 103 int Получает/устанавливает расстояние Y-координаты в пикселях относительно угла привязки для объекта OBJ_LABEL
OBJPROP_FIBOLEVELS 200 int Получает/устанавливает число уровней объекта Fibonacci. Может быть от 1 до 32
OBJPROP_LEVELCOLOR 201 color Получает/устанавливает цвет линии уровня объекта
OBJPROP_LEVELSTYLE 202 int Получает/устанавливает стиль линии уровня объекта
OBJPROP_LEVELWIDTH 203 int Получает/устанавливает ширину линии уровня объекта
OBJPROP_FIRSTLEVEL+n 210+n int Получает/устанавливает номер уровня объекта, где 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.2 Kb)
Источник: mql4.com

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

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты