
Построение модели для ограничения диапазона сигналов по тренду (Часть 5): Система уведомлений (Часть I)
Разделы
- Введение
- Уведомления в терминале
- Push-уведомления
- Уведомления по email
- Отладка Trend Constraint V1.04
- Интеграция мессенджеров и каналов из социальных сетей (например, из Telegram и WhatsApp)
- Интеграция с Telegram
- Интеграция с WhatsApp
- Использование VPS в системе уведомлений
- Заключение
Введение
MetaTrader 5 предоставляет различные варианты уведомлений, которые позволяют информировать пользователей о торговых событиях: уведомления через терминал, по электронной почте и push-уведомления. Для трансляции сигнала также можно использовать интеграции с социальными платформами, например Telegram и WhatsApp. Можно создать уведомления в MetaTrader 5 и быть всегда в курсе того, что происходит на счете, где бы вы ни находились. Вариантов уведомлений много, и вы можете выбрать тот, который лучше подходит для ваших требований. В этой статье дается руководство, которое поможет вам настроить и персонализировать уведомления MetaTrader 5, включая интеграцию с Telegram и другими платформами социальных сетей. Мы уделим основное внимание конфигурации и начальным шагам интеграции, чтобы подготовить почву для более глубокого изучения вопроса во второй части этой серии.
Уведомления в терминале
Уведомления в терминале — это внутренние оповещения платформы MetaTrader 5. Сюда относятся все события оповещений, инициированные в MetaTrader 5. Вы можете вручную настроить оповещения в MetaTrader 5, которые будут срабатывать при выполнении определенных условий. Настройки оповещений находятся на вкладке «Инструменты» в нижней части окна MetaTrader 5 по умолчанию.
- Символ — торговый инструмент, для которого вы настраиваете оповещение.
- Условие — условие, которое вызовет срабатывание оповещения (например, Bid >, Ask <, Time =, и т.д.).
- Значение — значение, с которым будет сравниваться условие (например, определенный уровень цены).
- Источник — тип оповещения (звук, файл, email и т.д.). Для уведомлений в терминале можно выбрать звук.
- Действие — выберите действие, которое будет выполнено при срабатывании оповещения (например, воспроизвести звук, отправить уведомление и т.д.).
- Звук — звуковой файл, который будет воспроизводиться при срабатывании оповещения.
- Таймаут — временной интервал, по истечении которого оповещение будет проверено снова.
- Максимум повторений — сколько раз должно срабатывать оповещение.
Ниже приведен пример настройки оповещения с использованием синтетических данных Step Index. В таблице показаны примеры значений, указывайте собственные значения, подходящие для работы с вашими уведомлениями. После настройки параметров нажмите «ОК», чтобы создать оповещение, и оно будет готово к активации. Весь процесс показан на gif-изображении под таблицей. Чтобы начать, кликните правой кнопкой мыши на вкладке оповещения в окне инструментов, выберите «Создать» в появившемся меню, и откроется диалоговое окно с настройками, описанными выше.
Настройка | Значение |
---|---|
Символ | Step Index |
Условие | Bid> |
Значение | 9666 |
Источник | Звук |
Действие | Выбран звуковой файл ( alert2.wav) |
Таймаут | Установлен на 60 секунд |
Максимум повторений | Установлено 5 |
Push-уведомления
Это функция MetaTrader 5, которая позволяет отправлять уведомления из платформы (как внутренние от самой платформы, так и созданные индикатором или советником), в мобильный терминал MetaTrader 5 через MetaQuotes ID мобильного устройства. Чтобы получать push-уведомления на мобильное устройство, необходимо установить MetaTrader 5 из Play Store для Android или App Store для iOS. Для получения оповещений на мобильный телефон, в десктопной версии необходимо включить push-уведомления MetaTrader 5. После установки мобильного терминала MetaTrader 5 в приложении создается уникальный идентификатор MetaQuotes ID.
НА изображении слева показано, как найти идентификатор MetaQuotes. Справа показано, как активировать push-уведомления в десктопной платформе MetaTrader 5, а также поле для ввода идентификатора MetaQuotes ID. Установите галочку и укажите ваш идентификатор MetaQuotes ID, и вы сможете мгновенно начать получать уведомления в разделе сообщений мобильного терминала MetaTrader 5. Вы можете добавить множество идентификаторов MetaQuotes с разных мобильных устройств
Уведомления по email
Электронная почта все еще остается универсальным и популярным инструментом общения благодаря удобству, эффективности и широкому спектру функций. Email — надежное и эффективное средство поддержания связи и обмена информацией, будь то личное использование, деловая переписка или профессиональное общение. Настройка уведомлений по электронной почте в MetaTrader 5 позволяет получать по электронной почте оповещения о различных торговых событиях, таких как движение цен, исполнение ордеров и пользовательские события.
Преимущество электронной почты заключается в ее практически мгновенной доставке, что позволяет быстро получать информацию и эффективно отправлять ее большому количеству получателей. Email-сервисы часто используют шифрование для безопасности пересылки, таким образом защищая конфиденциальную информацию. Прямая доставка получателям сводит к минимуму риск перехвата по сравнению с другими формами коммуникации.
Ниже дано пошаговое руководство по настройке уведомлений по электронной почте:
- Запустите платформу MetaTrader 5 на своем компьютере.
- Перейдите в меню Сервис > Настройки > Почта.
- Отметьте галочкой "Разрешить уведомления по email".
- Заполните детали SMTP-сервера:
Настройка Укажите данные SMTP сервер Адрес SMTP-сервера вашего провайдера электронной почты (например, smtp.gmail.com для Gmail). SMTP логин Адрес электронной почты (например, your-email@gmail.com). SMTP пароль Пароль вашей электронной почты или приложения, если вы используете Gmail. От Адрес электронной почты (например, your-email@gmail.com). Кому Адрес электронной почты, на который вы хотите получать уведомления (может совпадать с адресом «От» или отличаться).
Что такое SMTP-сервер.
Сервер Simple Mail Transfer Protocol (SMTP) — это почтовый сервер, который использует протокол (SMTP) для отправки, получения и ретрансляции исходящих писем. Он функционирует совместно с агентом пересылки почты (MTA) и перенаправляет электронные письма с почтового клиента отправителя на почтовый сервер получателя. Список почтовых провайдеров с SMTP-серверами:
- gmail
- yahoo mail
- hotmail
- zohomail
- icloud mail
Отладка Trend Constraint V1.04
Мы успешно интегрировали стиль Draw_Line в трендовые инструменты нашей системы. Однако я обнаружил, что из-за этой новой функции после каждого бара срабатывало множество оповещений. Например, когда график был настроен на минутный таймфрейм, оповещения генерировались при закрытии каждой минутной свечи, что довольно утомительно.
Мы же хотим получать оптимальные сигналы и только нужную информацию. Чтобы решить эту проблему, я решил удалить myalert() из пятого и шестого буферов. Крайне важно исправить этот код, чтобы потом без проблем интегрировать Telegram и WhatsApp, о чем мы будем говорить далее в этой статье. Ниже представлен исправленный вариант нашего кода:
Изменения в буфере 5:
// --- Buffer5 (Buy Trend) if(MA5[i] > MA6[i]) { Buffer5[i] = Low[i] - 15 * myPoint; // Disabled myAlert from Buffer 5 // myAlert("indicator", "BUY TREND | MA Fast: " + DoubleToString(MA5[i], 2) + " | MA Slow: " + DoubleToString(MA6[i], 2)); }
Изменения в буфере 6:
// --- Buffer6 (Sell Trend) if(MA5[i] < MA6[i]) { Buffer6[i] = High[i] + 15 * myPoint; // Disabled myAlert from Buffer 6 // myAlert("indicator", "SELL TREND | MA Fast: " + DoubleToString(MA5[i], 2) + " | MA Slow: " + DoubleToString(MA6[i], 2)); }
Изменения в Trend Constraint V1.04:
///Indicator Name: Trend Constraint #property copyright "Clemence Benjamin" #property link "https://mql5.com" #property version "1.04" #property description "A model that seek to produce sell signal when D1 candle is Bearish only and buy signal when it is Bullish" //--- indicator settings #property indicator_chart_window #property indicator_buffers 6 #property indicator_plots 6 #property indicator_type1 DRAW_ARROW #property indicator_width1 5 #property indicator_color1 0xFF3C00 #property indicator_label1 "Buy" #property indicator_type2 DRAW_ARROW #property indicator_width2 5 #property indicator_color2 0x0000FF #property indicator_label2 "Sell" #property indicator_type3 DRAW_ARROW #property indicator_width3 2 #property indicator_color3 0xE8351A #property indicator_label3 "Buy Reversal" #property indicator_type4 DRAW_ARROW #property indicator_width4 2 #property indicator_color4 0x1A1AE8 #property indicator_label4 "Sell Reversal" #property indicator_type5 DRAW_LINE #property indicator_style5 STYLE_SOLID #property indicator_width5 2 #property indicator_color5 0xFFAA00 #property indicator_label5 "Buy Trend" #property indicator_type6 DRAW_LINE #property indicator_style6 STYLE_SOLID #property indicator_width6 2 #property indicator_color6 0x0000FF #property indicator_label6 "Sell Trend" #define PLOT_MAXIMUM_BARS_BACK 5000 #define OMIT_OLDEST_BARS 50 //--- indicator buffers double Buffer1[]; double Buffer2[]; double Buffer3[]; double Buffer4[]; double Buffer5[]; double Buffer6[]; input double Oversold = 30; input double Overbought = 70; input int Slow_MA_period = 200; input int Fast_MA_period = 100; datetime time_alert; //used when sending alert input bool Audible_Alerts = true; input bool Push_Notifications = true; double myPoint; //initialized in OnInit int RSI_handle; double RSI[]; double Open[]; double Close[]; int MA_handle; double MA[]; int MA_handle2; double MA2[]; int MA_handle3; double MA3[]; int MA_handle4; double MA4[]; double Low[]; double High[]; int MA_handle5; double MA5[]; int MA_handle6; double MA6[]; void myAlert(string type, string message) { if(type == "print") Print(message); else if(type == "error") { Print(type+" | Trend Constraint V1.04 @ "+Symbol()+","+IntegerToString(Period())+" | "+message); } else if(type == "order") { } else if(type == "modify") { } else if(type == "indicator") { if(Audible_Alerts) Alert(type+" | Trend Constraint V1.04 @ "+Symbol()+","+IntegerToString(Period())+" | "+message); if(Push_Notifications) SendNotification(type+" | Trend Constraint V1.04 @ "+Symbol()+","+IntegerToString(Period())+" | "+message); } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { SetIndexBuffer(0, Buffer1); PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1)); PlotIndexSetInteger(0, PLOT_ARROW, 241); SetIndexBuffer(1, Buffer2); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1)); PlotIndexSetInteger(1, PLOT_ARROW, 242); SetIndexBuffer(2, Buffer3); PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1)); PlotIndexSetInteger(2, PLOT_ARROW, 236); SetIndexBuffer(3, Buffer4); PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1)); PlotIndexSetInteger(3, PLOT_ARROW, 238); SetIndexBuffer(4, Buffer5); PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(4, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1)); SetIndexBuffer(5, Buffer6); PlotIndexSetDouble(5, PLOT_EMPTY_VALUE, EMPTY_VALUE); PlotIndexSetInteger(5, PLOT_DRAW_BEGIN, MathMax(Bars(Symbol(), PERIOD_CURRENT)-PLOT_MAXIMUM_BARS_BACK+1, OMIT_OLDEST_BARS+1)); //initialize myPoint myPoint = Point(); if(Digits() == 5 || Digits() == 3) { myPoint *= 10; } RSI_handle = iRSI(NULL, PERIOD_CURRENT, 14, PRICE_CLOSE); if(RSI_handle < 0) { Print("The creation of iRSI has failed: RSI_handle=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } MA_handle = iMA(NULL, PERIOD_CURRENT, 7, 0, MODE_SMMA, PRICE_CLOSE); if(MA_handle < 0) { Print("The creation of iMA has failed: MA_handle=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } MA_handle2 = iMA(NULL, PERIOD_CURRENT, 400, 0, MODE_SMA, PRICE_CLOSE); if(MA_handle2 < 0) { Print("The creation of iMA has failed: MA_handle2=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } MA_handle3 = iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_EMA, PRICE_CLOSE); if(MA_handle3 < 0) { Print("The creation of iMA has failed: MA_handle3=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } MA_handle4 = iMA(NULL, PERIOD_CURRENT, 200, 0, MODE_SMA, PRICE_CLOSE); if(MA_handle4 < 0) { Print("The creation of iMA has failed: MA_handle4=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } MA_handle5 = iMA(NULL, PERIOD_CURRENT, Fast_MA_period, 0, MODE_SMA, PRICE_CLOSE); if(MA_handle5 < 0) { Print("The creation of iMA has failed: MA_handle5=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } MA_handle6 = iMA(NULL, PERIOD_CURRENT, Slow_MA_period, 0, MODE_SMA, PRICE_CLOSE); if(MA_handle6 < 0) { Print("The creation of iMA has failed: MA_handle6=", INVALID_HANDLE); Print("Runtime error = ", GetLastError()); return(INIT_FAILED); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { int limit = rates_total - prev_calculated; //--- counting from 0 to rates_total ArraySetAsSeries(Buffer1, true); ArraySetAsSeries(Buffer2, true); ArraySetAsSeries(Buffer3, true); ArraySetAsSeries(Buffer4, true); ArraySetAsSeries(Buffer5, true); ArraySetAsSeries(Buffer6, true); //--- initial zero if(prev_calculated < 1) { ArrayInitialize(Buffer1, EMPTY_VALUE); ArrayInitialize(Buffer2, EMPTY_VALUE); ArrayInitialize(Buffer3, EMPTY_VALUE); ArrayInitialize(Buffer4, EMPTY_VALUE); ArrayInitialize(Buffer5, EMPTY_VALUE); ArrayInitialize(Buffer6, EMPTY_VALUE); } else limit++; datetime Time[]; int RSIBuffer; int MABuffer; int RSIPeriod = 14; ArrayResize(RSI, rates_total); ArrayResize(Open, rates_total); ArrayResize(Close, rates_total); CopyOpen(NULL, 0, 0, rates_total, Open); CopyClose(NULL, 0, 0, rates_total, Close); if(CopyBuffer(RSI_handle, 0, 0, rates_total, RSI) < 0) { Print("Getting RSI values failed, not enough bars!"); } ArrayResize(MA, rates_total); if(CopyBuffer(MA_handle, 0, 0, rates_total, MA) < 0) { Print("Getting MA values failed, not enough bars!"); } ArrayResize(MA2, rates_total); if(CopyBuffer(MA_handle2, 0, 0, rates_total, MA2) < 0) { Print("Getting MA values failed, not enough bars!"); } ArrayResize(MA3, rates_total); if(CopyBuffer(MA_handle3, 0, 0, rates_total, MA3) < 0) { Print("Getting MA values failed, not enough bars!"); } ArrayResize(MA4, rates_total); if(CopyBuffer(MA_handle4, 0, 0, rates_total, MA4) < 0) { Print("Getting MA values failed, not enough bars!"); } ArrayResize(Low, rates_total); if(CopyLow(NULL, 0, 0, rates_total, Low) < 0) { Print("Getting LOW values failed, not enough bars!"); } ArrayResize(High, rates_total); if(CopyHigh(NULL, 0, 0, rates_total, High) < 0) { Print("Getting HIGH values failed, not enough bars!"); } ArrayResize(MA5, rates_total); if(CopyBuffer(MA_handle5, 0, 0, rates_total, MA5) < 0) { Print("Getting MA values failed, not enough bars!"); } ArrayResize(MA6, rates_total); if(CopyBuffer(MA_handle6, 0, 0, rates_total, MA6) < 0) { Print("Getting MA values failed, not enough bars!"); } for(int i=limit-1; i>=0; i--) { if(i < rates_total-1 && time[i] != time[i+1]+PeriodSeconds()) { continue; } Buffer1[i] = EMPTY_VALUE; Buffer2[i] = EMPTY_VALUE; Buffer3[i] = EMPTY_VALUE; Buffer4[i] = EMPTY_VALUE; Buffer5[i] = EMPTY_VALUE; Buffer6[i] = EMPTY_VALUE; // --- Indicator calculations // --- Buffer1 (Buy) if((Close[i] > MA[i] && MA[i] > MA2[i] && RSI[i] < Oversold) || (RSI[i] < Oversold && Close[i] > MA3[i])) { Buffer1[i] = Low[i] - 5 * myPoint; myAlert("indicator", "BUY OPPORTUNITY | RSI: " + DoubleToString(RSI[i], 2) + " | MA: " + DoubleToString(MA[i], 2)); } // --- Buffer2 (Sell) if((Close[i] < MA[i] && MA[i] < MA2[i] && RSI[i] > Overbought) || (RSI[i] > Overbought && Close[i] < MA3[i])) { Buffer2[i] = High[i] + 5 * myPoint; myAlert("indicator", "SELL OPPORTUNITY | RSI: " + DoubleToString(RSI[i], 2) + " | MA: " + DoubleToString(MA[i], 2)); } // --- Buffer3 (Buy Reversal) if(RSI[i] < Oversold && Close[i] > MA[i]) { Buffer3[i] = Low[i] - 10 * myPoint; myAlert("indicator", "BUY REVERSAL | RSI: " + DoubleToString(RSI[i], 2) + " | MA: " + DoubleToString(MA[i], 2)); } // --- Buffer4 (Sell Reversal) if(RSI[i] > Overbought && Close[i] < MA[i]) { Buffer4[i] = High[i] + 10 * myPoint; myAlert("indicator", "SELL REVERSAL | RSI: " + DoubleToString(RSI[i], 2) + " | MA: " + DoubleToString(MA[i], 2)); } // --- Buffer5 (Buy Trend) if(MA5[i] > MA6[i]) { Buffer5[i] = Low[i] - 15 * myPoint; //Disabled myAlert from Buffer 5 // myAlert("indicator", "BUY TREND | MA Fast: " + DoubleToString(MA5[i], 2) + " | MA Slow: " + DoubleToString(MA6[i], 2)); } // --- Buffer6 (Sell Trend) if(MA5[i] < MA6[i]) { Buffer6[i] = High[i] + 15 * myPoint; // Disabled myAlert from Buffer 6 // myAlert("indicator", "SELL TREND | MA Fast: " + DoubleToString(MA5[i], 2) + " | MA Slow: " + DoubleToString(MA6[i], 2)); } } return(rates_total); }
Интеграция мессенджеров (например, Telegram и WhatsApp)
В этом разделе статьи будет показана интеграция Telegram и WhatsApp в MetaTrader 5 специально для нашего индикатора Trend Constraint. Такая интеграция значительно расширяет возможности MetaTrader 5, предлагая безопасные и удобные уведомления в режиме реального времени. Интеграции с мессенджерами повышают эффективность и оперативность торговли, это ценные инструменты для всех современных трейдеров. Учитывая обширную базу пользователей этих платформ, также их можно использовать для трансляции сигналов сообществам. Давайте рассмотрим, как мы можем передавать сигналы, генерируемые нашим индикатором, в такие мессенджеры. Я провел исследование и протестировал возможности, чтобы подтвердить функциональность.
Требования:
- Последняя версия досктопной платформы MetaTrader5.
- Верифицированные аккаунты в Whatsapp и Telegram (скачайте из Play Store для Android и App Store для iOS).
- Веб-браузер, например Google Chrome.
- Сервер для размещения промежуточных скриптов.
Интеграция с Telegram
Шаг 1. Создание Telegram-бота
Как создать бота:
- Откройте Telegram и найдите бота BotFather.
- Начните чат с BotFather, и используйте команду /newbot для создания нового бота.
- Следуйте инструкциям, чтобы задать название и имя пользователя для вашего бота.
- BotFather создаст токен, который вы будете использовать для взаимодействия с API Telegram.
Получение ID чата:
- Добавьте своего бота в Telegram-группу или начните с ним чат.
- Чтобы получать уведомления и узнать свой идентификатор чата, используйте этот URL-адрес в браузере:https://api.telegram.org/bot<YourBotToken> /getUpdates
- Отправьте сообщение в чате и проверьте URL-адрес еще раз, чтобы найти идентификатор чата.
Более подробное руководство по получению Chat ID есть в github по ссылке
Шаг 2. Создание промежуточного скрипта
Нужен скрипт для отправки сообщений через API Telegram.
Чтобы создать такой скрипт, мы будем использовать язык Python. Этот скрипт Python использует библиотеку запросов для отправки сообщения в Telegram-чат через бота. Ниже привожу описания каждой строки кода этого скрипта:
import requests
Импортирует библиотеку запросов, используемую для создания HTTP-запросов в Python. В этом скрипте он будет использоваться для отправки POST-запроса к API Telegram Bot.
def send_telegram_message(chat_id, message, bot_token):
Определяет функцию с именем send_telegram_message. Функция принимает три параметра:
- chat_id — уникальный идентификатор чата или имя пользователя канала-получателя.
- message — текст отправляемого сообщения.
- bot_token — токен Telegram-бота, который вы получили ранее от @BotFather при создании бота.
url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
Эта строка создает URL для метода sendMessage из Telegram Bot API на основе предоставленного токена bot_token.
payload = { 'chat_id': chat_id, 'text': message }
Создает основную часть сообщения для POST-запроса. Словарь содержит параметры, требуемые для метода sendMessage:
- chat_id — идентификатор чата, в который будет отправлено сообщение.
- text — текст сообщения.
response = requests.post(url, data=payload)
Эта строка отправляет HTTP POST-запрос на созданный URL-адрес с данными телом запроса полезной с помощью метода requests.post. Ответ от API сохраняется в переменной response.
return response.json()
Эта строка преобразует ответ в формат JSON и возвращает его. Этот ответ JSON обычно содержит информацию об отправленном сообщении, включая идентификатор сообщения, отправителя, сведения о чате и многое другое.
Объединив все части кода вместе, мы получаем:
import requests def send_telegram_message(chat_id, message, bot_token): url = f"https://api.telegram.org/bot{bot_token}/sendMessage" payload = { 'chat_id': chat_id, 'text': message } response = requests.post(url, data=payload) return response.json()
Шаг 3. Настройка платформы MetaTrader 5 для работы со скриптом
Создадим скрипт на MQL5 для отправки оповещений через HTTP-запросы в промежуточный скрипт.
Пройдемся по всем строкам кода:
void SendTelegramMessage(string chat_id, string message, string bot_token)
Определяет функцию под названием SendTelegramMessage.
Параметры внутри функции:
- chat_id — строковый параметр, идентификатор чата в Telegram chat ID, на который будут отправлены сообщения.
- message — строковый параметр, сообщение для отправки.
- bot_token — строковый параметр, токен бота для авторизации в Telegram API.
{ string url = "http://your-server-url/send_telegram_message";
Назначает URL-адрес конечной точки сервера переменной url. Этот URL-адрес представляет собой адрес сервера, который отвечает за пересылку сообщений в Telegram.
char postData[]; StringToCharArray("chat_id=" + chat_id + "&message=" + message + "&bot_token=" + bot_token, postData);
postData Array:
- Объявление — объявляет массив postData типа char для хранения данных POST-запроса.
- Преобразование из sting в массив символов — преобразует объединенную строку параметров chat_id, message и bot_token в массив символов и сохраняет ее в postData. Объединенная строка формирует тело POST-запроса в формате, требуемом сервером.
char result[];
Объявляет массив result типа char для хранения ответа от веб-запроса.
int res = WebRequest("POST", url, "", NULL, 0, postData, 0, result, NULL);
Веб-запрос:
- Метод HTTP — POST указывает тип запроса.
- URL — конечная точка для отправки запроса.
- Заголовки — пустая строка "" означает отсутствие дополнительных заголовков.
- Файлы cookie — NULL указывает на отсутствие файлов cookie.
- Таймаут — 0 указывает на отсутствие таймаута.
- postData — данные для отправки в POST-запросе.
- Result — куда сохранить ответ.
- Функция возвращает целое число res, которое является кодом HTTP статуса ответа.
if (res != 200)
Проверка код ответа — сравнивает код ответа res с 200 (HTTP OK). Если значение не равно 200, это указывает на ошибку.
Обработчик ошибок:
{ Print("Error sending message: ", GetLastError()); }
Вывод сообщения об ошибке — если код ответа не равен 200, этот блок выведет сообщение об ошибке вместе с последним кодом ошибки, используя GetLastError().
Обработчик успешного выполнения:
else { Print("Message sent successfully."); }
Вывод сообщения об успешной отправке — если код ответа равен 200, этот блок выводит сообщение об успешной отправке.
Строка заканчивается функцией SendTelegramMessage.
MQL5-код, отправляющий сообщения в Telegram:
void SendTelegramMessage(string chat_id, string message, string bot_token) { string url = "http://your-server-url/send_telegram_message"; char postData[]; StringToCharArray("chat_id=" + chat_id + "&message=" + message + "&bot_token=" + bot_token, postData); char result[]; int res = WebRequest("POST", url, "", NULL, 0, postData, 0, result, NULL); if (res != 200) { Print("Error sending message: ", GetLastError()); } else { Print("Message sent successfully."); } }
Этот скрипт на MQL5 предназначен для отправки сообщения в Telegram-чат через выполнение веб-запроса к конечной точке сервера. Пример показывает, как использовать функцию SendTelegramMessage в событии OnStart, которое запускается при запуске скрипта. В следующем разделе рассмотрим интеграцию с WhatsApp. При этом все, о чем мы говорили касательно интеграции с Telegram, можно применить и к любой другой социальной платформе/мессенджеру. Поэтому далее мы не будем вдаваться в такие подробности Не забывайте заменять соответствующие части кода данными вашего собственного аккаунта, чтобы всё работало.
Интеграция с WhatsApp
Шаг 1. Зарегистрируйтесь у поставщика API обмена сообщениями.
- Выберите провайдера. Twilio — популярный выбор для интеграции с WhatsApp.
- Создайте аккаунт — зарегистрируйтесь в Twilio и пройдите всю необходимую проверку.
- Получите данные для API от Twilio, включая SID учетной записи, токен аутентификации.
Шаг 2. Создание промежуточного скрипта
Python-скрипт для интеграции WhatsApp
import requests def send_whatsapp_message(to, message, account_sid, auth_token): url = f"https://api.twilio.com/2010-04-01/Accounts/{account_sid}/Messages.json" payload = { 'From': 'whatsapp:+14155238886', # Twilio sandbox number 'To': f'whatsapp:{to}', 'Body': message } headers = { 'Authorization': f'Basic {account_sid}:{auth_token}' } response = requests.post(url, data=payload, headers=headers) return response.json()
Шаг 3. Настройка платформы MetaTrader 5 для работы со скриптом
MQL5-код для отправки уведомления в WhatsApp:
void SendWhatsAppMessage(string to, string message, string account_sid, string auth_token) { string url = "http://your-server-url/send_whatsapp_message"; char postData[]; StringToCharArray("to=" + to + "&message=" + message + "&account_sid=" + account_sid + "&auth_token=" + auth_token, postData); char result[]; int res = WebRequest("POST", url, "", NULL, 0, postData, 0, result, NULL); if (res != 200) { Print("Error sending message: ", GetLastError()); } else { Print("Message sent successfully."); } }
Использование VPS в системе уведомлений
VPS-сервис работает непрерывно, гарантируя постоянную активность платформы MetaTrader 5 и систем уведомлений. Это крайне важно для получения уведомлений в режиме реального времени без перебоев. Провайдеры VPS предлагают надежные и стабильные интернет-соединения, снижая риск отключений, которые могут возникать в домашних или офисных сетях. Серверы VPS часто располагаются в дата-центрах с высокоскоростными соединениями близко к основным финансовым площадкам, что снижает задержку и повышает скорость получения и обработки торговых оповещений и уведомлений. В отличие от общего хостинга, VPS предоставляет выделенные ресурсы, память и хранилище, обеспечивая стабильную производительность для работы MetaTrader 5 и обработки уведомлений. К VPS можно получить удаленный доступ с любого устройства с подключением к Интернету, что позволяет вам управлять своей платформой MetaTrader 5 и получать уведомления из любой точки мира.
Заключение
В этой статье мы настроили систему уведомлений для нашего индикатора и познакомились с основой для интеграции с WhatsApp и Telegram. Такая работа позволит эффективно транслировать сигналы большому количеству подписчиков. Разработчики, например, могут транслировать сигналы трейдерам через популярные платформы и каналы в мессенджерах и социальных платформах.
Такой подход обеспечивает доступность сигнала в любое время и в любом месте при наличии доступа в Интернет. Для доступа к сигналам можно использовать предпочтительную платформу — Telegram или WhatsApp. В Части II мы рассмотрим интеграцию подробнее. В приложении вы найдете все необходимые файлы. Задавайте вопросы и оставляйте свои комментарии в разделе обсуждения статьи.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/14963





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования