Прошу помощи в добавлении Алерта в индикатор Volumes

 

Добрый день! 

К сожалению поиском не нашел то, что мне нужно.

Имеется стандартный индикатор в МТ5 Volumes для тиковых объёмов. Необходимо в него добавить возможность отправки уведомлений в телефон, либо в почту при достижении определённого уровня.

В стандартном меню создания алертов МТ5 есть параметр Volume, но он не работает, возможно под реальный объём заточен. 

Индикатор объёма со звуковым уведомлением в терминале есть, но нужен именно для получения уведомлений в мобильном терминале.

Спасибо всем откликнувшимся  

 
KEI80:

Добрый день! 

К сожалению поиском не нашел то, что мне нужно.

Имеется стандартный индикатор в МТ5 Volumes для тиковых объёмов. Необходимо в него добавить возможность отправки уведомлений в телефон, либо в почту при достижении определённого уровня.

В стандартном меню создания алертов МТ5 есть параметр Volume, но он не работает, возможно под реальный объём заточен. 

Индикатор объёма со звуковым уведомлением в терминале есть, но нужен именно для получения уведомлений в мобильном терминале.

Спасибо всем откликнувшимся  

//+------------------------------------------------------------------+
//|                                                      Volumes.mq5 |
//|                             Copyright 2000-2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
//---
enum ENUM_ALERT_TYPE
  {
   ALERT_TYPE_ALERT,       // Alert
   ALERT_TYPE_MAIL,        // Mail
   ALERT_TYPE_NOTIFICATION // Notification
  };
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrGreen,clrRed
#property indicator_style1  0
#property indicator_width1  1
#property indicator_minimum 0.0
//--- input data
input    ENUM_APPLIED_VOLUME  InpVolumeType  =  VOLUME_TICK;      // Volumes
input    long                 InpVolumeValue =  3;                // Volume value
input    ENUM_ALERT_TYPE      InpAlertTipe   =  ALERT_TYPE_ALERT; // Alert type
sinput   string               InpSubject     =  "";               // Subject
sinput   string               InpMessage     =  "";               // Message
//--- Global variables
string subj;
string mess;
//--- indicator buffers
double ExtVolumesBuffer[];
double ExtColorsBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- buffers
   SetIndexBuffer(0,ExtVolumesBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtColorsBuffer,INDICATOR_COLOR_INDEX);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Volumes with Alerts");
//--- indicator digits
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   subj=(InpSubject=="" ? MQLInfoString(MQL_PROGRAM_NAME) : InpSubject);
   mess=(InpMessage=="" ? "Volume >= "+(string)InpVolumeValue : InpMessage);
  }
//+------------------------------------------------------------------+
//|  Volumes                                                         |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total<2)
      return(0);
//--- starting work
   int pos=prev_calculated-1;
//--- correct position
   if(pos<1)
     {
      ExtVolumesBuffer[0]=0;
      pos=1;
     }
//--- main cycle
   if(InpVolumeType==VOLUME_TICK)
      CalculateVolume(pos,rates_total,tick_volume);
   else
      CalculateVolume(pos,rates_total,volume);
   
   //Comment("ExtVolumesBuffer[0]=",ExtVolumesBuffer[0],"\nExtVolumesBuffer[",rates_total-1,"]=",ExtVolumesBuffer[rates_total-1]);
   static bool done=true;
//--- New bar
   if(rates_total-prev_calculated>0)
      done=false;
   if(ExtVolumesBuffer[rates_total-1]>=InpVolumeValue)
     {
      if(!done)
        {
         SendMessage(InpAlertTipe,subj,mess+(InpMessage=="" ? " ("+(string)(long)ExtVolumesBuffer[rates_total-1]+")" : ""));
         done=true;
        }
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateVolume(const int pos,const int rates_total,const long& volume[])
  {
   ExtVolumesBuffer[0]=(double)volume[0];
   ExtColorsBuffer[0]=0.0;
//---
   for(int i=pos; i<rates_total && !IsStopped(); i++)
     {
      double curr_volume=(double)volume[i];
      double prev_volume=(double)volume[i-1];
      //--- calculate indicator
      ExtVolumesBuffer[i]=curr_volume;
      if(curr_volume>prev_volume)
         ExtColorsBuffer[i]=0.0;
      else
         ExtColorsBuffer[i]=1.0;
     }
//---
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool SendMessage(const ENUM_ALERT_TYPE alert_type,const string subject,const string message)
  {
   switch(alert_type)
     {
      case ALERT_TYPE_MAIL          :  return(SendToMail(message,subject));
      case ALERT_TYPE_NOTIFICATION  :  return(SendPush(message));
      //---ALERT_TYPE_ALERT
      default                       :  
         Alert(StringFormat("%s: %s",subject,message));
         return true;
     }
  }
//+------------------------------------------------------------------+
//| Отправляет сообщение на почту                                    |
//+------------------------------------------------------------------+
bool SendToMail(const string message,const string subject=NULL)
  {
   //--- Если в терминале не разрешена отправка сообщений на почту
   if(!::TerminalInfoInteger(TERMINAL_EMAIL_ENABLED))
     {
      //--- выведем об этом сообщение в журнал и вернём false
      Print(__FUNCTION__,": В терминале нет разрешения на отправку писем");
      return false;
     }
   //--- Если не удалось отправить сообщение
   if(!::SendMail(subject==NULL ? ::MQLInfoString(MQL_PROGRAM_NAME) : subject,message))
     {
      //--- выведем об этом сообщение в журнал и вернём false
      ::Print(__FUNCTION__,": Не удалось отправить сообщение на почту. Ошибка",(string)GetLastError());
      return false;
     }
   //--- Успешно - возвращаем true
   return true;
  }
//+------------------------------------------------------------------+
//| Отправляет Push-уведомления на мобильное устройство              |
//+------------------------------------------------------------------+
bool SendPush(const string message)
  {
   //--- Если в терминале не разрешена отправка Push-уведомлений
   if(!::TerminalInfoInteger(TERMINAL_NOTIFICATIONS_ENABLED))
     {
      //--- выведем об этом сообщение в журнал и вернём false
      Print(__FUNCTION__,": В терминале нет разрешения на отправку Push-уведомлений");
      return false;
     }
   //--- Если не удалось отправить сообщение
   if(!::SendNotification(message))
     {
      //--- выведем об этом сообщение в журнал и вернём false
      ::Print(__FUNCTION__,": Не удалось отправить Push-уведомление. Ошибка",(string)GetLastError());
      return false;
     }
   //--- Успешно - возвращаем true
   return true;
  }
//+------------------------------------------------------------------+
Файлы:
 
Artyom Trishkin #:

Добрый день, Артём!

Спасибо огромное, то что надо, уведомления приходят, только индикатор не правильную цифру объёма в уведомлении отправляет.  Отображает на графике правильно, соответственно считает правильно, а в уведомлении отправляет постоянно одно и тоже число как будто привязанное к таймфрейму. Например для М10 максимальное число которое отправляет 132. Если ставить в параметрах число меньше или равно 132, то уведомления приходят с цифрой 132. Если в параметрах задать больше, то всё, уведомлений нет. Видимо какойто счётчик заполняется и всё. 

Фактически идея рабочая, а индикатор нет(

Может это как-то можно поправить?

Спасибо

 
KEI80 #:

Добрый день, Артём!

Спасибо огромное, то что надо, уведомления приходят, только индикатор не правильную цифру объёма в уведомлении отправляет.  Отображает на графике правильно, соответственно считает правильно, а в уведомлении отправляет постоянно одно и тоже число как будто привязанное к таймфрейму. Например для М10 максимальное число которое отправляет 132. Если ставить в параметрах число меньше или равно 132, то уведомления приходят с цифрой 132. Если в параметрах задать больше, то всё, уведомлений нет. Видимо какойто счётчик заполняется и всё. 

Фактически идея рабочая, а индикатор нет(

Может это как-то можно поправить?

Спасибо

Да, ошибся с индексацией массивов. Нужно брать данные с индекса rates_totral-1

 
Исправил в первом посте код и перезалил вложение.
 
Artyom Trishkin #:
Исправил в первом посте код и перезалил вложение.

Огромное спасибо!

Всё работает как надо