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

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

Работа с почтой и уведомлениями PUSH в МетаТрейдер
Секреты моего Автолота DynamicLot Autolot
Работа с почтой и уведомлениями PUSH в МетаТрейдер
Секреты моего Автолота DynamicLot Autolot


Наиболее частыми запросами в поисковике и в темах разных форумах встречаются фразы:“Индикатора алерт”,”индикатор alert”,”Как добавить в индикатор звуковой сигнал?”,”Помогите вставить звуковой сигнал в индикатор”, “Как вставить Alert и Стрелки “, “Как отправить сообщение на почту или телефон при сигнале от индикатора?”В данной статье я попытаюсь максимально подробно рассказать легкий путь добавления Alert Mail Push Arrow в любой индикатор от 

добавочного кода www.expforex.com 

Предисловие 

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

Если у Вас вопросы, задавайте их на наш форум

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

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

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

#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

Следующий шаг добавления нашего алерта в Ваш индикатор состоит в нескольких пунктах:

ШАГ 1

В начало эксперта перед функцией start() (OnCalculate) вставьте следующий код:

//+==+//+ 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);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,bool history=false,int i=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(!history)
     {
      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);
     }
   if(history)
     {
      if(Arrow) if(arrowdir==1) SetArrow(241,Blue,nameInd+DoubleToStr(Time[shift+i],0),Time[shift+i],Low[shift+i]);
      if(Arrow) if(arrowdir==2) SetArrow(242,Red,nameInd+DoubleToStr(Time[shift+i],0),Time[shift+i],High[shift+i]);

     }

  }//+==+//+ www.expforex.com edit AlertArrow +//+==+

void OnDeinit(const int reason)
  {
   for(int i=ObjectsTotal();i>=0;i–)
     {
      if(StringFind(ObjectName(i),nameInd)!=-1)
         ObjectDelete(ObjectName(i));

     }

  }

ШАГ 2

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

   return(rates_total);  }вставьте следующий код:

//+==+//+ 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 +//+==+

ШАГ 3

Данный код будет служить нашим сигналом, Естественно вам необходимо заменить некоторый код на свой. Сигналом для алерта служит следующий код:Если это пересечение 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

Если Вам необходимы стрелки на истории, то необходимо сделать так:

после вышеупомянутого кода добавляем еще один:

//+==+//+ www.expforex.com edit AlertArrow +//+==+

     if(counted_bars>0) counted_bars–;
   int limit2=Bars-counted_bars;

   for(int i2=0; i2<limit2; i2++)
     {

 nameInd=WindowExpertName( );

          if( SarBuffer[shift+1+i2]<=75 && SarBuffer[shift+i2]>75)

               {

                 Expforex_AlertArrow(Symbol()+” “+Period()+nameInd+” UP”+i2,1,true,i2);      

               }

           if( SarBuffer[shift+1+i2]>=25 && SarBuffer[shift+i2]<25)

               {

                 Expforex_AlertArrow(Symbol()+” “+Period()+nameInd+” DN”+i2,2,true,i2);     

               }

}//+==+//+ www.expforex.com edit AlertArrow +//+==+

Примеры

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

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

Некоторые важные статьи относящиеся к данной теме

1. Как настроить терминал на отправку почты2. Как установить индикатор в терминал3. Заказ на программирование советников индикаторов

Выводы

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

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.


    This website uses cookies to improve your experience. By using this website you agree to our Data Protection Policy.
    Read more