Основные понятия [17]
Торговые системы,тактики [70]
Форекс начинающим [16]
Разное [41]

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

Добавить в социальные закладки:

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

 
Наиболее частыми запросами в поисковике и в темах разных форумах встречаются фразы:
"Индикатора алерт","индикатор 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
 
Следующий шаг добавления нашего алерта в Ваш индикатор состоит в нескольких пунктах:
 
В начало эксперта перед функцией 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 ====================+
//+======================================================================================+
 
 Перед закрытием функции 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 ====================+
//+======================================================================================+
 
 
Данный код будет служить нашим сигналом, Естественно вам необходимо заменить некоторый код на свой. Сигналом для алерта служит следующий код:
 
Если это пересечение 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 ====================+
//+======================================================================================+
 
 
Примеры
 
Данные примеры взяты из соответствующей ветки нашего форума. Индикаторы  были модифицированны мною по вышеописанному принципу. 
 
 
 
 
Некоторые важные статьи относящиеся к данной теме
 
 
Выводы
 
В данной статье я максимально подробно и понятно объяснил процесс создания сигналов для индикатора. Вышеописанный код можно использовать без ограничений на любом индикаторе. Важно нельзя изменять авторские имена при добавлении кода в индикатор. 
 
Если Вам понравилась данная статья Вы нашли пользу от данного способа вставки сигналов, пожалуйста, оставляйте свои комментарии и оценивайте темы
 
 
 


Получить бесплатно Алерт в индикатор. Как вставить Alert и Arrow в индикатор?

Категория: Разное | Добавил: expforex (28.10.2013)
Просмотров: 20187 | Комментарии: 47 | Теги: Alert, индикатор?, как, вставить, arrow, индикатор., Алерт
Всего комментариев: 471 2 3 4 »
   47               expforex        (24.02.2017 01:30)
Добрый, я более не добавляю алерты в индикаторы. к сожалению на это нет времени.

   46               expforex        (24.02.2017 01:30)
Добрый, я более не добавляю алерты в индикаторы. к сожалению на это нет времени.

   41               max1014        (16.02.2017 20:50)
Добрый Вечер!Добавьте пожалуйста звуковое оповещение на индикатор Ultimate Arrows alert

   44               expforex        (24.02.2017 01:30)
Добрый, я более не добавляю алерты в индикаторы. к сожалению на это нет времени.

   40               max1014        (16.02.2017 20:47)
cry

   45               expforex        (24.02.2017 01:30)
Добрый, я более не добавляю алерты в индикаторы. к сожалению на это нет времени.

   39               Бека        (07.02.2017 07:05)
здравствуйте пожалуйста помогите кто  нибудь как прикрепить алерт на этот индикатор
https://yadi.sk/d/6Pi-uZ1qsi28o

   38               Maksimys        (17.11.2016 13:55)
Здравствуйте. Помогите в индикатор вставить алерт. По вашей инструкции все делал Первую часть кода вставил нажал кампилировать все нормально, потом вставляю вторую часть кода после кампилирования выдает ошибку и пропадает индикатор в МТ4. Помогите сламал голову! Алерт должен выскакивать при пересечении двух скользящих.
Прилагаю исходный код:
//+------------------------------------------------------------------+
//| macd-2.mq4 |
//| Copyright ?2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 LimeGreen
#property indicator_color2 Red
#property indicator_color3 Black
#property indicator_color4 Black
//---- indicator parameters
extern int FastEMA=13;
extern int SlowEMA=17;
extern int SignalEMA=9;
//---- indicator buffers
double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_buffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 2 additional buffers are used for counting.
IndicatorBuffers(5);
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,1);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2 );
SetIndexDrawBegin(0,SignalEMA);
SetIndexDrawBegin(1,SignalEMA);
//---- 4 indicator buffers mapping
if(!SetIndexBuffer(0,ind_buffer1) &&
!SetIndexBuffer(1,ind_buffer2) &&
!SetIndexBuffer(2,ind_buffer3) &&
!SetIndexBuffer(3,ind_buffer4))
Print("cannot set indicators\' buffers!" wink ;
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD-2 ("+FastEMA+","+SlowEMA+","+SignalEMA+" wink " wink ;
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Oscillator |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
double prev,current;
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
for(int i=0; i<limit; i++)
ind_buffer3=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE _CLOSE,i);
//---- signal line counted in the 2-nd additional buffer
for(i=0; i<limit; i++)
ind_buffer4=iMAOnArray(ind_buffer3,Bars,SignalEMA,0,MODE_EMA, i);
//---- dispatch values between 2 buffers
bool up=true;
for(i=limit-1; i>=0; i--)
{
current=ind_buffer3-ind_buffer4;
prev=ind_buffer3[i+1]-ind_buffer4[i+1];
if(current>prev) up=true;
if(current<prev) up=false;
if(!up)
{
ind_buffer2=3*current;
ind_buffer1=0.0;
}
else
{
ind_buffer1=3*current;
ind_buffer2
=0.0;
}
}
return(0);
}

   37               wvak        (12.11.2016 21:03)
написать алерт к индикатору ,если можно то даже к некоторым
вот ссылка на все индикаторы и шаблон всей стратегии

Больше всего интересуют 3 индикатора
1.PBF PB Direction -красные желтые и синие свечи ,и нужен алерт только на желтую
2.PBF_Fast_3MAs
3. PBF_OSOB -красным цветом предупреждает о перекупленности, а зелёным – о перепроданности.

вот фото на что нужны алерт

   36               Шах        (04.11.2016 15:33)
//+================================================================================ ======+
//+================================ 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=="" wink 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]);

}

}

   35               Шах        (04.11.2016 15:32)
//+================================================================================ ======+
//+================================ 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(timeee!=Time[0] && SignalBuffer[shift+1]>=0 && SignalBuffer[shift]<0)
{
Expforex_AlertArrow(Symbol()+" "+Period()+nameInd+" DN",2);
timeee=Time[0];
}

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

   34               Шах        (04.11.2016 15:29)

Спасибо большое за проделанную работу я второй день пытаюсь разобраться почему не показывает историю пожалуйста помогите буду очень благодарен так как без истории сложно подобрать параметры помогите если есть такая возможность вот код программы что я делаю не так


1-10 11-20 21-30 31-31
Имя *:
Email:
Код *:



WebMoney Яндекс цитирования.