MT5 и Pushover: Критические PUSH-уведомления через WebRequest

MT5 и Pushover: Критические PUSH-уведомления через WebRequest MQL4 / MQL5 (MetaTrader)
Подробное руководство по интеграции MT5 с сервисом Pushover через WebRequest для отправки мгновенных критических PUSH-уведомлений на смартфон. Включает MQL5 код и пошаговую настройку.
Суть: Интеграция MT5 с Pushover осуществляется путем отправки HTTP POST запросов через функцию WebRequest в MQL5, что позволяет получать на смартфон критические PUSH-уведомления о событиях в торговом терминале.

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

Эта статья-инструкция покажет, как интегрировать ваш торговый терминал MT5 с Pushover, используя встроенную функцию WebRequest MQL5. Мы создадим переиспользуемый класс для отправки уведомлений, который можно легко внедрить в любой ваш экспертный советник, скрипт или индикатор.

Почему Pushover?

Pushover выделяется среди других сервисов уведомлений по нескольким причинам:

  • Надежность: Высокая доставляемость уведомлений.
  • Приоритеты: Возможность устанавливать различные приоритеты (от низкого до экстренного), что позволяет получать уведомления даже в режиме ‘Не беспокоить’.
  • Настраиваемые звуки: Выбор из множества предустановленных звуков или загрузка своих.
  • Подтверждение: Для экстренных уведомлений можно требовать подтверждения, чтобы убедиться, что сообщение было прочитано.
  • Простота API: Легкий в использовании HTTP API.
  • Кроссплатформенность: Приложения для iOS, Android и Desktop.

Настройка Pushover

Прежде чем мы перейдем к коду, вам необходимо настроить аккаунт Pushover:

  1. Создайте аккаунт Pushover: Перейдите на pushover.net и зарегистрируйтесь. Приложение Pushover для смартфона платное (единоразовая покупка), но это того стоит за предоставляемую функциональность.

  2. Получите User Key: После входа в аккаунт, ваш персональный User Key будет отображен на главной странице. Он выглядит как 30-символьная строка (например, uajk34j5k6l7m8n9o0p1q2r3s4t5u6). Сохраните его.

  3. Создайте Application: Для отправки уведомлений вам понадобится API Token приложения. Перейдите в раздел Your Applications и нажмите Create an Application/API Token. Дайте приложению имя (например, ‘MT5 Notifier’), выберите тип ‘Application’ и создайте его. Вы получите API Token (например, a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5). Сохраните его.

Теперь у вас есть User Key и API Token, необходимые для отправки уведомлений.

Исходный код

Мы создадим класс CPushoverNotifier, который инкапсулирует всю логику взаимодействия с API Pushover. Этот класс будет помещен в отдельный заголовочный файл PushoverNotifier.mqh, чтобы его можно было легко включать в любые ваши MQL5 программы.


//+------------------------------------------------------------------+
//|                                                PushoverNotifier.mqh |
//|                                                  FinFluct.com |
//|                                                                 |
//+------------------------------------------------------------------+
#property copyright "FinFluct.com"
#property link      "https://finfluct.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| Class for sending Pushover notifications                         |
//+------------------------------------------------------------------+
class CPushoverNotifier
  {
private:
   string            m_user_key;
   string            m_api_token;
   string            m_pushover_url;

public:
                     CPushoverNotifier(string user_key, string api_token);
                    ~CPushoverNotifier();

   bool              SendNotification(string message, string title = "", int priority = 0, string sound = "pushover", string url = "", string url_title = "");
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CPushoverNotifier::CPushoverNotifier(string user_key, string api_token)
  {
   m_user_key = user_key;
   m_api_token = api_token;
   m_pushover_url = "https://api.pushover.net/1/messages.json";
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CPushoverNotifier::~CPushoverNotifier()
  {
  }
//+------------------------------------------------------------------+
//| Send a Pushover notification                                     |
//+------------------------------------------------------------------+
bool CPushoverNotifier::SendNotification(string message, string title = "", int priority = 0, string sound = "pushover", string url = "", string url_title = "")
  {
   if (m_user_key == "" || m_api_token == "")
     {
      Print("PushoverNotifier: User Key or API Token is not set.");
      return false;
     }

   string post_data = "token=" + m_api_token +
                      "&user=" + m_user_key +
                      "&message=" + UrlEncode(message);

   if (title != "")
     {
      post_data += "&title=" + UrlEncode(title);
     }
   if (priority != 0) // 0: normal, 1: high, 2: emergency, -1: low, -2: lowest
     {
      post_data += "&priority=" + IntegerToString(priority);
     }
   if (sound != "")
     {
      post_data += "&sound=" + UrlEncode(sound);
     }
   if (url != "")
     {
      post_data += "&url=" + UrlEncode(url);
   }
   if (url_title != "")
     {
      post_data += "&url_title=" + UrlEncode(url_title);
   }

   char post_data_bytes[];
   StringToCharArray(post_data, post_data_bytes);

   string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
   char result_headers[];
   char result_data[];
   int timeout = 5000; // 5 seconds timeout

   int res = WebRequest("POST", m_pushover_url, headers, timeout, post_data_bytes, result_headers, result_data);

   if (res == -1)
     {
      Print("PushoverNotifier: WebRequest failed. Error: ", GetLastError());
      return false;
     }

   string response_str = CharArrayToString(result_data);
   // Optional: Parse JSON response for success/error
   // Example: {"status":1,"request":"a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4"}
   // For simplicity, we'll just check if response is not empty and contains "status":1
   if (StringFind(response_str, "\"status\":1") != -1)
     {
      Print("PushoverNotifier: Notification sent successfully. Response: ", response_str);
      return true;
     }
   else
     {
      Print("PushoverNotifier: Failed to send notification. Response: ", response_str);
      return false;
     }
  }

//+------------------------------------------------------------------+
//| Helper function to URL-encode strings                            |
//+------------------------------------------------------------------+
string UrlEncode(string text)
  {
   string encoded_text = "";
   for (int i = 0; i < StringLen(text); i++)
     {
      ushort char_code = StringGetCharacter(text, i);
      if ((char_code >= '0' && char_code <= '9') ||
          (char_code >= 'a' && char_code <= 'z') ||
          (char_code >= 'A' && char_code <= 'Z') ||
          char_code == '-' || char_code == '_' || char_code == '.' || char_code == '~')
        {
         encoded_text += CharToString(char_code);
        }
      else
        {
         encoded_text += "%" + IntegerToHexString(char_code, 2);
        }
     }
   return encoded_text;
  }

Разбор параметров

Класс CPushoverNotifier и его метод SendNotification имеют следующие параметры:

  • user_key: Ваш персональный User Key из Pushover. Обязательный параметр для конструктора.
  • api_token: API Token вашего приложения Pushover. Обязательный параметр для конструктора.
  • message: Текст уведомления, который будет отправлен на ваш смартфон. Обязательный параметр для SendNotification.
  • title: Заголовок уведомления. Если не указан, используется имя приложения Pushover.
  • priority: Приоритет уведомления. Может быть одним из следующих значений:
    • -2: Lowest Priority (самый низкий)
    • -1: Low Priority (низкий)
    • 0: Normal Priority (нормальный, по умолчанию)
    • 1: High Priority (высокий, может обходить режим 'Не беспокоить')
    • 2: Emergency Priority (экстренный, требует подтверждения, повторяется до прочтения)
  • sound: Имя звука уведомления. Список доступных звуков можно найти на сайте Pushover. По умолчанию используется pushover.
  • url: URL-адрес, который будет прикреплен к уведомлению и открыт при нажатии.
  • url_title: Заголовок для прикрепленного URL.

Как запустить

Чтобы использовать класс CPushoverNotifier в вашем экспертном советнике или скрипте, выполните следующие шаги:

  1. Сохраните файл: Сохраните приведенный выше код в файл с именем PushoverNotifier.mqh в папке MQL5/Include/ вашего терминала MT5.

  2. Разрешите WebRequest: В терминале MT5 перейдите в Сервис -> Настройки -> Советники. Установите флажок Разрешить WebRequest для URL и добавьте https://api.pushover.net в список разрешенных URL-адресов. Это критически важный шаг, без которого WebRequest не будет работать.

  3. Используйте в вашем коде: Включите PushoverNotifier.mqh в ваш экспертный советник (.mq5) или скрипт и создайте экземпляр класса.

    
    //+------------------------------------------------------------------+
    //|                                              MyPushoverEA.mq5 |
    //|                                                  FinFluct.com |
    //|                                                                 |
    //+------------------------------------------------------------------+
    #property copyright "FinFluct.com"
    #property link      "https://finfluct.com"
    #property version   "1.00"
    #property description "Пример использования PushoverNotifier в EA"
    
    #include 
    
    //--- Входные параметры
    input string InpPushoverUserKey  = "ВАШ_USER_KEY";    // Ваш Pushover User Key
    input string InpPushoverApiToken = "ВАШ_API_TOKEN";   // Ваш Pushover API Token
    
    //--- Экземпляр класса PushoverNotifier
    CPushoverNotifier *pushover = NULL;
    
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int OnInit()
      {
    //--- Создаем экземпляр класса
       pushover = new CPushoverNotifier(InpPushoverUserKey, InpPushoverApiToken);
       if (pushover == NULL)
         {
          Print("Ошибка: Не удалось создать экземпляр CPushoverNotifier");
          return INIT_FAILED;
         }
    
       //--- Отправляем тестовое уведомление при старте EA
       if (pushover.SendNotification("EA MyPushoverEA успешно запущен на " + Symbol() + ".", "MT5 Alert", 1, "cashregister"))
         {
          Print("Тестовое уведомление Pushover отправлено.");
         }
       else
         {
          Print("Ошибка при отправке тестового уведомления Pushover.");
         }
    
    //---
       return(INIT_SUCCEEDED);
      }
    
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {
    //--- Удаляем экземпляр класса
       delete pushover;
       pushover = NULL;
      }
    
    //+------------------------------------------------------------------+
    //| Expert tick function                                             |
    //+------------------------------------------------------------------+
    void OnTick()
      {
    //--- Пример использования: отправка уведомления при определенном условии
       static datetime last_notification_time = 0;
       if (TimeCurrent() - last_notification_time > 600) // Отправлять не чаще, чем раз в 10 минут
         {
          double bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
          double ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
    
          // Пример: если спред слишком большой
          if (ask - bid > 5 * _Point)
            {
             if (pushover.SendNotification("Внимание! Спред на " + Symbol() + " слишком большой: " + DoubleToString(ask - bid, _Digits) + ".", "Критический спред", 1, "siren"))
               {
                Print("Уведомление о большом спреде отправлено.");
                last_notification_time = TimeCurrent();
               }
            }
          // Пример: если баланс упал ниже определенного уровня (для демонстрации)
          if (AccountInfoDouble(ACCOUNT_BALANCE) < 10000 && AccountInfoDouble(ACCOUNT_BALANCE) > 0) // Избегаем повторных уведомлений при нулевом балансе
            {
             if (pushover.SendNotification("Баланс счета " + AccountInfoString(ACCOUNT_LOGIN) + " упал до " + DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE), 2) + ".", "Низкий баланс!", 2, "bugle", "https://finfluct.com/mql/mt5-kastomnyy-indikator-equity-curve-dlya-multivalyutnogo-portfelya/", "Проверить Equity Curve"))
               {
                Print("Уведомление о низком балансе отправлено.");
                last_notification_time = TimeCurrent();
               }
            }
         }
    
       //--- Вы можете интегрировать уведомления в вашу логику управления ордерами, например, при ошибках открытия/закрытия ордеров.
       //--- Для более сложных систем управления ордерами, таких как сетки с мартингейлом, уведомления о маржинальных требованиях или ошибках исполнения
       //--- могут быть критически важны. Подробнее о таких системах можно узнать здесь: 
       //--- MQL5: Реализация сетки ордеров (Grid) с мартингейлом и проверкой маржи
    
       //--- Также, уведомления могут быть полезны при анализе рынка с помощью кастомных индикаторов, например, при формировании
       //--- определенных паттернов на основе профиля рынка. Подробнее об этом: 
       //--- Индикатор профиля рынка (Market Profile) на MQL5: гистограмма TPO
      }
    
  4. Компилируйте и запустите: Скомпилируйте ваш экспертный советник и прикрепите его к графику. Убедитесь, что вы ввели свои User Key и API Token в параметрах советника.

Важные замечания

  • Безопасность ключей: Никогда не публикуйте свои User Key и API Token в открытом доступе. Используйте их как входные параметры в экспертных советниках или храните в защищенном месте.
  • Частота уведомлений: Будьте осторожны с частотой отправки уведомлений. Слишком частые PUSH-уведомления могут быть раздражающими и привести к игнорированию действительно важных сообщений. Pushover также имеет лимиты на количество сообщений в месяц (обычно 7500 бесплатных сообщений).
  • Обработка ошибок: В примере кода есть базовая обработка ошибок WebRequest и проверка ответа от Pushover. Для продакшн-систем рекомендуется более детальный парсинг JSON-ответа от Pushover для точного определения причины неудачи.
  • URL-кодирование: Функция UrlEncode необходима для корректной передачи данных в HTTP-запросе, особенно если сообщение или заголовок содержат специальные символы.

Интеграция MT5 с Pushover через WebRequest предоставляет мощный инструмент для мониторинга вашей торговой активности и получения критически важных уведомлений в реальном времени. Это значительно повышает надежность и безопасность ваших автоматизированных торговых систем, позволяя вам оставаться в курсе событий, где бы вы ни находились.

Оцените статью
FinFluct