Работа с почтой и уведомлениями 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. Заказ на программирование советников индикаторов
Выводы
В данной статье я максимально подробно и понятно объяснил процесс создания сигналов для индикатора. Вышеописанный код можно использовать без ограничений на любом индикаторе. Важно нельзя изменять авторские имена при добавлении кода в индикатор. Если Вам понравилась данная статья Вы нашли пользу от данного способа вставки сигналов, пожалуйста, оставляйте свои комментарии и оценивайте темы.