AM2
Андрей

 
Уровень 35

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Алерт в индикатор. Как вставить Alert и Arrow в индикатор?

Наиболее частыми запросами в поисковике и в темах разных форумах встречаются фразы:

«Индикатора алерт»,«индикатор alert»,«Как добавить в индикатор звуковой сигнал?»,«Помогите вставить звуковой сигнал в индикатор», «Как вставить Alert и Стрелки », «Как отправить сообщение на почту или телефон при сигнале от индикатора?»
В данной статье я попытаюсь максимально подробно рассказать легкий путь добавления Alert Mail Push Arrow в любой индикатор от добавочного кода www.expforex.com

Предисловие

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



www.youtube.com/watch?v=NpxwejQbP5s

Начало работы

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

#property indicator_buffers 1


Но также в индикаторе могут быть скрытые буферы, которые задаются в функции init() и объявляются переменной:

IndicatorBuffers(7);


Нам нужны только первые буферы. Если например у Вас стоит 1 внешний буфер, то смотрим на переменную:

SetIndexBuffer(0,SarBuffer);


0 — это первый буфер
1 — это второй буфер…
Эти буферы, или их название, можно получить наведя на графике на определенную линию индикатора
Value1 — , Это первый буфер Или 0 в системе исчисления в коде

SetIndexBuffer(0,SarBuffer);


Название данного нужного нам буфера SarBuffer, далее мы и будем его использовать


Далее уже дело техники = определить как будет поступать сигнал,
например если это пересечение 0 линии сверху (снизу) вниз(вверх) то будет выглядеть так:

SarBuffer[shift+1]>=0 && SarBuffer[shift]<0

Если это пересечение индикатором текущей цены или бара, пробой бара индикатором и так далее:

SarBuffer[shift+1]>=Close[shift] && SarBuffer[shift]<Close[shift]

Если Это пересечение особых уровней индикаторы например стохастика:

SarBuffer[shift+1]<=75 && SarBuffer[shift]>75
SarBuffer[shift+1]>=25 && SarBuffer[shift]<25

Если в Вашем индикаторе уже существуют стрелки, то возможен и такой вид сигнала:

DnTrend[1]!=EMPTY_VALUE && DnTrend[1]!=0&& UpTrend[2]!=EMPTY_VALUE

В любом случае, надо проявить логику и творчество, чтобы правильно записать сигнал, Если же у Вас возникли трудности, напишите в данную ветку, только при этом прикрепите индикатор, покажите на графике линии и распишите подробно, что у Вас не получается. Кидать сообщение на подобии «надо вставить алерт в индикатор» без объяснения что куда, и собственно без самого индикатора — не нужно.
Необходимые куски кода от www.expforex.com
Следующий шаг добавления нашего алерта в Ваш индикатор состоит в нескольких пунктах:
В начало эксперта перед функцией start() вставьте следующий код:

//+======================================================================================+
//+================================ www.expforex.com edit AlertArrow ====================+
//+======================================================================================+
  extern string Alerts="Алерты и стрелки от www.expforex.com";
  extern bool AlerT=true;  // Выдавать алерт на экран          
  extern bool Mail=true;   // Посылать сообщение         
  extern bool Push=true;   // Посылать ПУШ на телефон
  extern bool Arrow=true;  // Ставить стрелки на сигналах
  extern int shift=1;      // На каком баре считать сигнал 0 - на текущем 1 - на закрытом
  int timeee;              // Внутренняя переменная
  string nameInd;
 
void SetArrow(int cd, color cl,
              string nm="", datetime t1=0, double p1=0, int sz=3) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (p1<=0) p1=Bid;
  nameInd=WindowExpertName( );
int wind=WindowFind(nameInd);
if (wind==-1)wind=0;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, wind, 0,0);
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE, cd);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_WIDTH    , sz);
}
 
void Expforex_AlertArrow(string text="",int arrowdir=0)
{
nameInd=WindowExpertName( );
int wind=WindowFind(nameInd);
if (wind==-1)wind=0;
   ObjectCreate("Originalalert",OBJ_LABEL,wind,0,0);
   ObjectSetText("Originalalert","Модификация AlertArrow www.expforex.com",10,"Arial Bold",Red);
   ObjectSet("Originalalert",OBJPROP_CORNER,2);
   ObjectSet("Originalalert",OBJPROP_XDISTANCE,200);
   ObjectSet("Originalalert",OBJPROP_YDISTANCE,10);
   
                if(AlerT) Alert(text);
                if(Arrow) if (arrowdir==1) SetArrow(241,Blue,nameInd+DoubleToStr(Time[shift],0),Time[shift],Low[shift]);
                if(Arrow) if (arrowdir==2) SetArrow(242,Red,nameInd+DoubleToStr(Time[shift],0),Time[shift],High[shift]);
                if (!IsTesting())if(Mail)  SendMail(text, text);
                if (!IsTesting())if(Push)  SendNotification(text);
 
}
 
//+======================================================================================+
//+================================ www.expforex.com edit AlertArrow ====================+
//+======================================================================================+
 


Перед закрытием функции start() внутри функции перед
return(0);
  }

вставьте следующий код:

//+======================================================================================+
//+================================ www.expforex.com edit AlertArrow ====================+
//+======================================================================================+
 nameInd=WindowExpertName( );
          if(timeee!=Time[0] && SarBuffer[shift+1]<=75 && SarBuffer[shift]>75)
               {
                 Expforex_AlertArrow(Symbol()+" "+Period()+nameInd+" UP",1);
                    timeee=Time[0];           
               }
 
           if(timeee!=Time[0] && SarBuffer[shift+1]>=25 && SarBuffer[shift]<25)
               {
                 Expforex_AlertArrow(Symbol()+" "+Period()+nameInd+" DN",2);
                    timeee=Time[0];           
               }
//+======================================================================================+
//+================================ www.expforex.com edit AlertArrow ====================+
//+======================================================================================+
 

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

SarBuffer[shift+1]>=0 && SarBuffer[shift]<0

Если это пересечение индикатором текущей цены или бара, пробой бара индикатором и так далее:

SarBuffer[shift+1]>=Close[shift] && SarBuffer[shift]<Close[shift]

Если Это пересечение особых уровней индикаторы например стохастика:

SarBuffer[shift+1]<=75 && SarBuffer[shift]>75
SarBuffer[shift+1]>=25 && SarBuffer[shift]<25

Примеры

Данные примеры взяты из соответствующей ветки нашего форума. Индикаторы были модифицированны мною по вышеописанному принципу.





Пример индикаторов Parabolic, MACD, Stochastic в архиве можно скачать здесь.

Выводы

В данной статье максимально подробно и понятно приводится процесс создания сигналов для индикатора. Вышеописанный код можно использовать без ограничений на любом индикаторе. Важно нельзя изменять авторские имена при добавлении кода в индикатор.
Если Вам понравилась данная статья Вы нашли пользу от данного способа вставки сигналов, пожалуйста, оставляйте свои комментарии.
  • +1
  • Просмотров: 35127
  • 4 мая 2015, 12:01
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Проверка торговой стратегии
Следующая запись в группе  
Еще один советник за 2000$
04 декабря 2014
10 мая 2015

Брокер для ваших роботов, 15 лет на рынке

Комментарии (4)

+
0
Благодарю за содержательную и полезную статью. Функция хорошая и довольно простая, для новичков самое то!!!
avatar

  18  Andrju81 Сообщений: 245 - Андрей

  • 4 мая 2015, 14:25
+
0
Попытался я пришпилить оповещалки к индикатору Q2MA. Через слеши я пометил чего надобавлял.

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1  
#property indicator_width4 1  
//-------------------------------------------------------------------+
extern bool Alerts   = true;         
extern bool Mail=true;   // Посылать сообщение              //ЭТО ДОБАВИЛ Я
extern bool Push=true;   // Посылать ПУШ на телефон         //И ЭТО
//-------------------------------------------------------------------+
extern int  MAPeriod =13;
extern int  MAMode=0; // 0=SMA,1=EMA,2=SSMA,3=LWMA
//-------------------------------------------------------------------+
//-------------------------------------------------------------------+
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double trend[];
datetime barTime=0;
double prevTicTrend=0;
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(5);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(2,174);
   SetIndexBuffer(3,ExtMapBuffer4); SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,174);
   SetIndexBuffer(4,trend);
   return(0);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
int start()
  {

  int counted_bars = IndicatorCounted();
   if(counted_bars < 0)  return(-1);
   if(counted_bars > 0)   counted_bars--;
   int limit = Bars - counted_bars;
   if(counted_bars==0) limit-=1+1;
//-----   
   for(int i=limit; i>=0; i--)
     {
      ExtMapBuffer1[i] = iMA(NULL,0,MAPeriod,0,MAMode,PRICE_CLOSE,i);
      ExtMapBuffer2[i] = iMA(NULL,0,MAPeriod,0,MAMode,PRICE_OPEN,i);
      ExtMapBuffer3[i] = EMPTY_VALUE;
      ExtMapBuffer4[i] = EMPTY_VALUE;
      trend[i]         = trend[i+1];
      //-----     
      double dist = iATR(NULL,0,0,i);
      double diff = (ExtMapBuffer1[i]-ExtMapBuffer2[i]);
      //-----
      if(diff > 0) trend[i] =  1;
      if(diff < 0) trend[i] = -1;
      if(trend[i]!=trend[i+1])
         if(trend[i]==1)
            ExtMapBuffer3[i] = ExtMapBuffer1[i]-dist;
      else ExtMapBuffer4[i] = ExtMapBuffer1[i]+dist;
 //+------------------------------------------------------------------+   
      if(Alerts && i==0 && trend[0]!=trend[i+1])
        {
         if(barTime!=Time[0])
           {
            if(trend[0]==1)
              {
          Alert("Q2MA BUY! " + Symbol() + " " + Period());
          if(Mail == true) SendMail("Q2MA BUY! " + Symbol() + " " + Period());          //И ЭТО
          if(Push == true) SendNotification("Q2MA BUY! " + Symbol() + " " + Period());  //И ЭТО
        } 
        if(trend[0] == -1)
        {
          Alert("Q2MA BUY! " + Symbol() + " " + Period());
          if(Mail == true) SendMail("Q2MA BUY! " + Symbol() + " " + Period());          //И ЭТО
          if(Push == true) SendNotification("Q2MA BUY! " + Symbol() + " " + Period());  //И ЭТО
              }
           }
         barTime=Time[0];
         if(prevTicTrend!=trend[0])
           {
            PlaySound("alert.wav");
           }
         prevTicTrend=trend[0];
        }
     }
   return(0);
  }


Чёт не вышел каменный цветок…

В результате получил
'SendMail' — wrong parameters count Q2MA.mq4

Дальше уже косячить не стал.

Помогите пожалуйста понять, что и где я не догнал?

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

  20  Anatoly74 Сообщений: 3710 - Анатолий

  • 7 июня 2015, 13:16
+
0
Будьте добры дополнить индикатор
avatar

  2  Niceman84 Сообщений: 2

  • 21 октября 2019, 11:56
+
0
Будьте добры дополнить индикатор, или написать индикатор алерт на появление графического обЪекта прямоугольник. Алерт на email и pop-up со звуком (по умолчанию). Заранее благодарен
avatar

  2  Niceman84 Сообщений: 2

  • 21 октября 2019, 11:58

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий