WebRequest в MQL5, что позволяет получать на смартфон критические PUSH-уведомления о событиях в торговом терминале.В мире высокочастотного трейдинга и автоматизированных торговых систем, мгновенное получение информации о критических событиях является залогом успешного управления рисками и оперативного реагирования. Стандартные уведомления MT5 могут быть недостаточными для действительно важных оповещений, особенно если вы не находитесь постоянно за компьютером. Сервис Pushover предлагает надежный и гибкий способ доставки PUSH-уведомлений на ваш смартфон с различными уровнями приоритета, звуками и даже возможностью подтверждения.
Эта статья-инструкция покажет, как интегрировать ваш торговый терминал MT5 с Pushover, используя встроенную функцию WebRequest MQL5. Мы создадим переиспользуемый класс для отправки уведомлений, который можно легко внедрить в любой ваш экспертный советник, скрипт или индикатор.
Почему Pushover?
Pushover выделяется среди других сервисов уведомлений по нескольким причинам:
- Надежность: Высокая доставляемость уведомлений.
- Приоритеты: Возможность устанавливать различные приоритеты (от низкого до экстренного), что позволяет получать уведомления даже в режиме ‘Не беспокоить’.
- Настраиваемые звуки: Выбор из множества предустановленных звуков или загрузка своих.
- Подтверждение: Для экстренных уведомлений можно требовать подтверждения, чтобы убедиться, что сообщение было прочитано.
- Простота API: Легкий в использовании HTTP API.
- Кроссплатформенность: Приложения для iOS, Android и Desktop.
Настройка Pushover
Прежде чем мы перейдем к коду, вам необходимо настроить аккаунт Pushover:
-
Создайте аккаунт Pushover: Перейдите на pushover.net и зарегистрируйтесь. Приложение Pushover для смартфона платное (единоразовая покупка), но это того стоит за предоставляемую функциональность.
-
Получите User Key: После входа в аккаунт, ваш персональный User Key будет отображен на главной странице. Он выглядит как 30-символьная строка (например,
uajk34j5k6l7m8n9o0p1q2r3s4t5u6). Сохраните его. -
Создайте 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 в вашем экспертном советнике или скрипте, выполните следующие шаги:
-
Сохраните файл: Сохраните приведенный выше код в файл с именем
PushoverNotifier.mqhв папкеMQL5/Include/вашего терминала MT5. -
Разрешите WebRequest: В терминале MT5 перейдите в
Сервис -> Настройки -> Советники. Установите флажокРазрешить WebRequest для URLи добавьтеhttps://api.pushover.netв список разрешенных URL-адресов. Это критически важный шаг, без которогоWebRequestне будет работать. -
Используйте в вашем коде: Включите
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 } -
Компилируйте и запустите: Скомпилируйте ваш экспертный советник и прикрепите его к графику. Убедитесь, что вы ввели свои
User KeyиAPI Tokenв параметрах советника.
Важные замечания
- Безопасность ключей: Никогда не публикуйте свои
User KeyиAPI Tokenв открытом доступе. Используйте их как входные параметры в экспертных советниках или храните в защищенном месте. - Частота уведомлений: Будьте осторожны с частотой отправки уведомлений. Слишком частые PUSH-уведомления могут быть раздражающими и привести к игнорированию действительно важных сообщений. Pushover также имеет лимиты на количество сообщений в месяц (обычно 7500 бесплатных сообщений).
- Обработка ошибок: В примере кода есть базовая обработка ошибок
WebRequestи проверка ответа от Pushover. Для продакшн-систем рекомендуется более детальный парсинг JSON-ответа от Pushover для точного определения причины неудачи. - URL-кодирование: Функция
UrlEncodeнеобходима для корректной передачи данных в HTTP-запросе, особенно если сообщение или заголовок содержат специальные символы.
Интеграция MT5 с Pushover через WebRequest предоставляет мощный инструмент для мониторинга вашей торговой активности и получения критически важных уведомлений в реальном времени. Это значительно повышает надежность и безопасность ваших автоматизированных торговых систем, позволяя вам оставаться в курсе событий, где бы вы ни находились.




