English Deutsch 日本語
preview
Знакомство с языком MQL5 (Часть 27): Освоение API и функции WebRequest в языке MQL5

Знакомство с языком MQL5 (Часть 27): Освоение API и функции WebRequest в языке MQL5

MetaTrader 5Трейдинг |
395 0
Israel Pelumi Abioye
Israel Pelumi Abioye

Введение

И снова приветствуем вас в Части 27 серии "Знакомство с языком MQL5"! Вы когда-нибудь задумывались, как MetaTrader 5 взаимодействует с другими платформами? Если да, вам стоит прочитать эту статью.

В этой статье мы сосредоточимся на понимании работы API и том, как MetaTrader 5 может взаимодействовать с внешними серверами с помощью функции WebRequest(). Чтобы сделать процесс обучения более прикладным, мы поработаем над небольшим проектом, в котором MetaTrader 5 интегрируется с Telegram. В этом проекте вы узнаете, как использовать API Telegram для отправки, редактирования и удаления сообщений прямо из MetaTrader 5.

Цель этой статьи – познакомить вас с основными идеями, лежащими в основе коммуникации WebRequest и API в языке MQL5. В следующих статьях мы углубимся в тему, рассматривая более сложные сценарии использования API и реальные приложения с функцией WebRequest().

Figure 1. Telegram API


Интерфейс программирования приложений (API)

Интерфейс программирования приложений (API) – это коллекция, которая обеспечивает коммуникацию между двумя программами. Его можно сравнить с мостом, который охватывает систему. В сфере трейдинга API позволяют вашей торговой платформе (например, MetaTrader 5) взаимодействовать с веб-сайтами, почтовыми серверами и другими внешними сервисами, такими как Telegram, а также получать от них данные.

Для подключения к серверам Telegram MetaTrader 5 использует API Telegram. После обработки вашего запроса, отправленного из MetaTrader 5, следующим шагом для API является его передача в соответствующую группу. Это позволяет двум системам понимать друг друга, что приводит к быстрому и легкому протеканию этого процесса.

Протокол HTTP (тот же протокол, который используют веб-браузеры) является одним из основных протоколов связи, используемых API. WebRequest() – это функция на языке MQL5, которая выступает в роли посредника между вашей торговой платформой и внешним сервером, управляя этим соединением. Мы лучше поймем API, исследуя этот термин в его трех компонентах: приложение, программирование и интерфейс.

Приложение

Любая программа, которая выполняет определенные функции, называется приложением. Это может быть веб-сайт, мобильное приложение, такое как Telegram, или даже MetaTrader 5. Каждая программа управляет своими собственными внутренними данными и функциями.

Программирование

На этапе программирования пишется код, чтобы системы могли общаться, а API позволяют разработчикам использовать возможности приложения, не имея полной информации о том, как оно работает внутри.

Интерфейс

Интерфейс – это место, где две системы взаимодействуют друг с другом. В нем обозначена информация, которой можно делиться, и способ, которым системы могут общаться. Например, вы можете искать и воспроизводить фильмы с помощью вашего компьютера, даже если они не сохранены. Когда вы нажимаете кнопку воспроизведения, YouTube связывается со своим сервером и начинает воспроизводить видео.  После нажатия кнопки воспроизведения YouTube отправляет ваш запрос на свой сервер и начинает воспроизводить видео. Аналогичным образом, MetaTrader 5 может отправлять и получать сообщения, когда он подключается к внешней платформе через API.

Система, которая позволяет взаимодействовать между приложениями посредством четко определенных программных инструкций, называется интерфейсом программирования приложений. Она служит связующим звеном между вашей торговой платформой и другими платформами, такими как электронная почта или Telegram, позволяя автоматизировать процессы.

Аналогия:

Представь: мальчик по имени Коля. У него много навыков, но, несмотря на все свои таланты, он не может сделать все сам. Ему может понадобиться помощь, например, с пением. Вместо того, чтобы развивать все эти способности, Коля просит о помощи невидимого друга по имени API. "API, пожалуйста, попроси моего друга Ваню спеть эту песню для меня" или "API, попроси Настю помочь мне приготовить ужин" – это фразы, которые Коля использует, чтобы общаться со своим невидимым другом, когда ему нужна помощь с чем-то, что он не может сделать сам. Ваня или Настя быстро подключаются через API, который затем отправляет запрос и возвращает результат.

Коле не обязательно знать, как поет Ваня. Единственное, что ему нужно знать, это что спросить и как использовать API. Именно так и работают API в цифровом мире.

В этой метафоре Коля олицетворяет ваше основное приложения, например, MetaTrader 5. Мост, который соединяет MetaTrader 5 с другими платформами, такими как электронная почта или Telegram, называется невидимым другом (API). Приложению MetaTrader 5 не нужно понимать, как работает внутренняя система Telegram, чтобы отправить сообщение в мессенджер. Оно просто отправляет запрос с помощью функции WebRequest, а Telegram его получает.

 

Функция WebRequest()

Теперь, когда мы знаем, что такое API, и как он помогает MetaTrader 5 взаимодействовать с внешними платформами, давайте рассмотрим функцию WebRequest(), один из важнейших инструментов языка MQL5, который обеспечивает такое взаимодействие. Если говорить просто, WebRequest() служит каналом между внешним веб-сервером и вашим терминалом MetaTrader 5. Она позволяет осуществлять передачу данных между вашим советником и интернетом. Эта функция полезна, если вы хотите взаимодействовать с пользовательским API и получать данные от веб-сервиса.

Представьте себе ситуацию: сервер – это офис через дорогу, а ваш MetaTrader 5 – это трейдер, сидящий в офисе. Сообщения перемещаются между двумя офисами с помощью функции WebRequest(). Например, с помощью запросов GET или POST вы можете указать курьеру, какое сообщение отправить, куда его доставить, и как его доставить.

Функция WebRequest() используется для получения информации из интернета путем взаимодействия с внешним сервером и может использоваться различными способами. Существует два способа использования функции WebRequest().

Первый вариант выглядит так:

int  WebRequest( 
   const string      method,           // HTTP method  
   const string      url,              // URL 
   const string      cookie,           // cookie 
   const string      referer,          // referer 
   int               timeout,          // timeout 
   const char        &data[],          // the array of the HTTP message body 
   int               data_size,        // data[] array size in bytes 
   char              &result[],        // an array containing server response data 
   string            &result_headers   // headers of server response 
   );

Вторая версия выглядит так:

int  WebRequest( 
   const string      method,           // HTTP method 
   const string      url,              // URL 
   const string      headers,          // headers  
   int               timeout,          // timeout 
   const char        &data[],          // the array of the HTTP message body 
   char              &result[],        // an array containing server response data 
   string            &result_headers   // headers of server response 
   );

Наиболее распространенная версия предлагает большую универсальность, особенно при использовании современных API, таких как API Telegram. Она идеально подходит для управления запросами, которые требуют больше, чем просто сообщение "ключ=значение", поскольку позволяет вам определять пользовательские заголовки, соответствующие требованиям API. В этой статье мы уделим основное внимание второй версии функции WebRequest(), поскольку она обеспечивает необходимую гибкость для отправки, редактирования и даже удаления сообщений с помощью API Telegram. Изучив принцип работы этой версии, вы сможете управлять каждым аспектом вашей коммуникации с другими серверами: от отправки вашего первого сообщения в Telegram до мониторинга обновлений в реальном времени.

Функция WebRequest() особенно удобна в использовании, поскольку язык MQL5 стал удобнее для разработчиков. Вам не нужно беспокоиться о том, что происходит в фоновом режиме во время онлайн-коммуникации. Самое важное – сначала понять, как работают параметры функции, так как каждый из них имеет решающее значение в части того, как будет отправляться ваш запрос, и как будет получен ответ.

Метод

Первым параметром WebRequest() является HTTP-метод. Он помогает сообщить удаленному серверу о действии, которое вы хотите совершить. Использование "GET" или "POST" в языке MQL5 помогает сделать правильный выбор, поскольку это влияет на то, где хранятся ваши данные, и как обрабатывается ваш запрос.

GET:

Этот метод используется для запроса данных, доступных только для чтения.

POST:

В MQL5, в зависимости от того, как настроен сервер, метод POST может использоваться для создания, удаления или изменения данных в дополнение к отправке данных на сервер.

URL

URL – это веб-адрес, который указывает языку MQL5, куда отправить ваш запрос.

Примеры:
const  string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";
const  string url = telegram_api_url + "/bot" + bot_token + "/editMessageText";
const  string url = telegram_api_url + "/bot" + bot_token + "/deleteMessage";

Каждый из этих URL выполняет определенную задачу на сервере Telegram. Функция WebRequest() отправляет ваши данные на указанный URL, а API Telegram обрабатывает их в соответствии с выбранным эндпоинтом. Например, вы можете дать Telegram указание сгенерировать новое сообщение в чате с помощью эндпоинта sendMessage. При использовании editMessageText вы даете Telegram указание изменить существующее сообщение. Также, когда вы используете deleteMessage, вы велите Telegram стереть сообщение.

telegram_api_url:

Это идентификатор , который используется для переменной, хранящей API:

const string telegram_api_url = "https://api.telegram.org";

Все запросы к Telegram-боту перенаправляются на этот базовый URL. Это можно рассматривать как "главное здание", в котором функционируют все боты Telegram. Этот "главный адрес", откуда начинаются все ваши действия, включая отправку, редактирование и удаление сообщений.

/bot:

Благодаря этому разделу Telegram будет знать, что вы пытаетесь связаться с ботом, а не с действительным пользовательским аккаунтом. Последующие действия будут обрабатываться системой Telegram-ботов, в соответствии с указаниями этого ключевого слова. Проще говоря, /bot функционирует как уведомление, указывающее, что "этот запрос предназначен для отдела ботов" внутри главного здания Telegram.

bot_token:

Токен бота – это длинная строка из символов и чисел, которая используется в качестве ключа доступа к боту; это один из важнейших элементов любого API-соединения. Этот ключ обеспечивает прямой контакт между вашей программой на языке MQL5 и сервером. Каждый раз, когда ваш советник отправляет WebRequest, токен уведомляет Telegram, что "этот запрос от моего бота, и у меня есть разрешение на выполнение этого действия". Он также служит паролем для доступа к боту.

Ваш токен бота всегда должен оставаться конфиденциальным и защищенным из-за его важности, так как любой, кто имеет доступ к вашему боту, может взять его под контроль и отправлять сообщения от вашего имени. Разумной привычкой будет хранить этот токен в безопасном месте, например, в другом конфигурационном файле или в качестве внешней входной переменной в вашем советнике. Позже в этой статье я покажу вам, как получить токен вашего бота напрямую из Telegram с помощью BotFather, чтобы связать вашу программу MetaTrader 5 с Telegram.

string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";

По сути, вы говорите Telegram: "Привет, я хочу отправить сообщение через эндпоинт sendMessage. Вот мой токен для его демонстрации."

Заголовки

Следующим параметром, который мы исследуем, является заголовок. Это больше похоже на указание или разрешение, которое вы добавляете к запросу.

Пример:

const string headers = "";

Таймаут

Этот параметр используется для указания того, как долго советник должен ждать ответа от сервера после отправки запроса.

Пример:

int timeout = 5000; // 5000 milliseconds = 5 seconds

В этом случае MetaTrader 5 будет ждать ответа пять секунд. По истечении этого времени MetaTrader 5 прекратит попытки подключиться, и запрос завершиться неуспешно. Таймаут можно сравнить с ожиданием, когда друг ответит на звонок. Вы можете решить повесить трубку, если он не ответит в течение десяти секунд. "Если сервер не ответит в течение установленного мной времени, я перестану ждать" – это еще одно заявление, которое делает ваша программа MetaTrader 5.

Данные

Фактическое сообщение, которое вы хотите отправить из MetaTrader 5 на внешнюю платформу, хранится в переменной массива символов, что имеет решающее значение. 

string body = "chat_id=" + chatID + "&text=Hello from MT5!";
StringToCharArray(body, data, 0);

Поскольку данные передаются в виде байтов, а не просто текста, сообщение преобразуется из обычной строки в массив символов. Для определения того, какое конкретно сообщение необходимо изменить, также используется идентификатор сообщения.

Пример:

string body = "chat_id=" + chatID + "&message_id=" + MessageID + "&text=Hello from MT5!";
StringToCharArray(body, data, 0);

И если вы хотите удалить сообщение, которое уже было отправлено, вы можете сделать следующее:

string body = "chat_id=" + chatID + "&message_id=" + MessageID;
StringToCharArray(body, data, 0);

Сhat_id – это отличительный идентификатор вашей группы или бота в Telegram, похожий по формату на ваше уникальное имя пользователя. Он предоставляет серверу точный адрес, куда нужно отправить ваше сообщение, и это можно сравнить с домашним адресом. В случае предоставления неправильного chat_id сообщение никогда не достигнет группы чатов, в которую оно должно было попасть. Каждая группа в Telegram имеет свой собственный отличительный идентификатор, поэтому, добавляя эту секцию в текст вашего сообщения, вы по сути говорите, что сообщение должно быть отправлено точно по этому адресу.

Каждое сообщение, которое вы отправляете, имеет закрепленный за ним уникальный идентификационный номер – message_id. Этот уникальный номер полезен, когда вы хотите удалить или отредактировать сообщение через ваш код.

В свою очередь, bot_token служит паролем или ключом доступа для вашего бота. Это специальный ключ аутентификации, который связывает вашего конкретного бота Telegram с вашим приложением MetaTrader 5. Это можно сравнить с удостоверением личности вашего бота. Без этого токена ваше сообщение никогда не будет отправлено, так как Telegram не сможет определить, какой бот его запрашивает.

Теперь, чтобы прояснить ситуацию:

  • Идентификатор чата указывает серверу, куда отправить сообщение.
  • Далее, идентификатор сообщения позволяет узнать, какое конкретно сообщение нужно изменить или удалить.
  • Токен bot_token сообщает Telegram, кто делает запрос.

Позже в этой статье я объясню, как получить ваш идентификатор чата, идентификатор сообщения и токен бота, и как использовать их в Telegram правильно.

Давайте теперь более подробно рассмотрим массив data[]. Доставочная коробка, в которой ваше сообщение передается из MetaTrader 5 на сервер Telegram, называется Data[]. Первым делом, нужно вставить текст, который вы хотите отправить, в строковую переменную с именем "body". Например, "Hello from MetaTrader 5!" Чтобы гарантировать, что это сообщение безопасно пройдет по сети, вы должны корректно упаковать его перед отправкой. Это достигается с помощью функции StringToCharArray(), которая преобразует ваше сообщение (строку) в массив символов, который может понять "курьер" WebRequest().

Результат

Переменная результата функции WebRequest() хранит ответ сервера, включая дополнительную информацию, такую как идентификатор сообщения или подтверждение того, что сообщение было успешно отправлено.

Пример:
char res[];
WebRequest("POST", url, "", 5000, data, res, resHeaders);

Print(CharArrayToString(res));

Результат:

{
  "ok": true,
  "result": {
    "message_id": 24,
    "from": {
      "id": 9467412345,
      "is_bot": true,
      "first_name": "MQL5 API BOT",
      "username": "MQL5APItest_bot"
    },
    "chat": {
      "id": -400395312345,
      "title": "Bot Testing Group",
      "type": "supergroup"
    },
    "date": 1761412345,
    "text": "Hello from MT5!"
  }
}

В данном случае решающее значение имеет message_id. Вы можете обновить или удалить конкретное сообщение позже, используя этот идентификатор. Поэтому если решите изменить текст этого сообщения или удалить его полностью, вы будете использовать этот message_id при выполнении другого вызова WebRequest.

Можно посмотреть на это так: После отправки сообщения через MetaTrader 5 Telegram предоставляет вам "уведомление о вручении" (хранящееся внутри res[]), тем самым подтверждая доставку и выделяя трек-номер (идентификатор сообщения). Используя этот номер, вы всегда сможете найти, изменить или удалить сообщение позже.

Заголовки результатов

Заголовки, которые сервер возвращает после обработки вашего запроса, сохраняются в этом конечном параметре функции WebRequest(). Он объявляется так:

string resHeaders = "";
WebRequest("POST", url, "", 5000, data, res, resHeaders);
Print(resHeaders);

Вывод:

Figure 2. Result Headers

Заголовки и тело (или содержимое) являются двумя основными компонентами, которые веб-сервер обычно предоставляет в ответ на запрос, отправленный вашей программой на MQL5. Эти данные заголовка из ответа сервера сохраняются в параметре result_headers.

Эти заголовки часто содержат важную техническую информацию, такую как:

  • Тип содержимого, который указывает на формат ответа.
  • Имя и версия сервера.
  • Дата и время ответа.
  • Тип соединения, который указывает, остается ли соединение открытым или нет.

Эти данные предоставляют вам информацию о безопасности и соединении, подтверждают, что ваш запрос был корректно получен сервером Telegram, и указывают на тип содержимого, которое было возвращено. Крайне важно понимать, что функция WebRequest() использует переменные headers и result_headers для различных целей. Данные, которые вы передаете на сервер с вашим запросом, представлены третьим аргументом – headers. Эти заголовки указывают на тип данных, которые вы передаете, и, если необходимо, содержат данные для аутентификации.

Данные, которые сервер возвращает вам, напротив, хранятся в последнем параметре (result_headers). Вместе с другой полезной технической информацией, этот параметр поясняет, как был обработан запрос, и что было возвращено. Этот процесс можно объяснить проще, сравнив его с обменом почтой между двумя офисами. Параметр заголовка, аналогичный пометке, которую вы ставите на письме перед отправкой, описывает, что содержится внутри, и как следует это обрабатывать. Опция result_headers указывает на происхождение конверта, дату отправки и способ доставки, подобно штампам и маркам на конверте, который вы получаете обратно. Хотя они выполняют разные функции в коммуникации между MetaTrader 5 и внешним сервером, оба параметра крайне важны.


Отправка сообщения из MetaTrader 5 в Telegram-бот

Теперь, когда у вас есть полное понимание того, как работают API MQL5 и функция WebRequest(), пришло время воспользоваться всем тем, что вы уже узнали. В этой части вы узнаете, как отправить сообщение из MetaTrader 5 в Telegram-бот, применив теоретические знания на практике. Теперь становится понятно, зачем нужно все, что мы обсуждали ранее: чтобы ваша программа в MetaTrader 5 могла отправлять, обновлять или удалять сообщения в боте или группе Telegram.

Чтобы получить доступ к окну настроек в вашей программе MetaTrader 5, нажмите Ctrl + O. Затем выберите вкладку "Советники". Внизу этого раздела есть флажок "Разрешить WebRequest для следующих URL". Чтобы активировать флажок, кликните по нему. 

Затем введите следующий URL в поле ниже:

https://api.telegram.org

Figure 3. Options Window

Найдите BotFather.

Figure 4. Search BotFather

Выберите /newbot, чтобы создать нового бота.

Figure 5. New Bot

Выберите отображаемое имя для вашего бота.

Figure 6. Display Name

Выберите имя пользователя, и оно должно заканчиваться на "bot" или "_bot."

Figure 7. Username

Вам будет немедленно отправлено сообщение, содержащее две важных вещи:

  • Ваш токен бота – уникальный ключ, который позволяет вам подключать этого бота к внешним платформам, таким как MetaTrader 5. Вы будете использовать его в своем коде MQL5 для отправки сообщений через Telegram API.
  • Ссылка на вашего бота – нажмите на нее, чтобы открыть вашего бота напрямую и начать чат.

Figure 8. Bot Created

Введите этот URL в адресной строке вашего браузера.

https://api.telegram.org/bot<YourBotToken>/getUpdates

Вставьте реальный токен, который вы получили от BotFather, вместо плейсхолдера <YourBotToken>.

Например, если ваш токен 123456789:ABCdefGhIJklMNopQRstuVWxyz, ваш URL должен выглядеть так:

https://api.telegram.org/bot123456789:ABCdefGhIJklMNopQRstuVWxyz/getUpdates

Figure 9. Pretty Print

Откроется страница с текстом. На этой странице рядом с "Pretty print" появится чекбокс. Кликните по ссылке. 

Вернитесь к своему Telegram-боту и нажмите кнопку "Начать".

Figure 10. Start

Вернитесь в ваш браузер и обновите страницу.

Figure 11. Refresh Page

На странице отобразится недавнее обновление. Оно сообщает, что ваш бот был успешно активирован. Кроме того, на странице появятся полезные данные, такие как идентификатор чата, который понадобится для отправки сообщений вашему Telegram-боту из MetaTrader 5. Следующим шагом после завершения всех вышеупомянутых этапов будет создание нового файла советника в MetaEditor 5.

Используя ваш идентификатор чата и токен бота, вы получите доступ к API Telegram в этом советнике. Оттуда вы сможете отправлять персонализированные сообщения прямо из MetaTrader 5. Это первая часть практического раздела, в котором вы применяете все, что узнали о WebRequest() и коммуникации с API.

Пример:
const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string headers = "";
const int time_out = 5000;

const string bot_token  = "8345012345:AAHdAPtMQR6VHEQeHk1y_H9IuL3zc5abcde";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   string body = "chat_id=" + bot_chatID + "&text=Hello from MT5!";
   StringToCharArray(body, data, 0);

   string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";

   WebRequest(method,url,headers,time_out,data,res,resHeaders);

//---
   return(INIT_SUCCEEDED);
  }

Вывод:

Figure 12. Message Sent

Пояснение:

Идентификатор чата, заголовки, тайм-аут, HTTP-метод, URL-адрес API Telegram и токен бота указаны как константы. MetaTrader 5 получил информацию о том, что данные будут переданы на сервер с помощью метода POST. Никаких других заголовков не требуется; идентификатор чата указывает на конкретную группу или чат в Telegram, и MetaTrader 5 будет ждать ответа в течение пяти секунд, прежде чем завершить ожидание.

Три переменные объявлены внутри функции OnInit(): data, res и resHeaders. Массив данных содержит сообщение в символьном формате, которое должно быть передано, так как WebRequest() требует бинарные данные. Ответ от сервера сохраняется в res, а в resHeaders сохранятся дополнительные данные от сервера, такие как дата и тип содержимого.

Функция OnInit() объявляет три переменные: data, res и resHeaders. Поскольку WebRequest() требует бинарные данные, массив данных предоставляет сообщение в символьном формате (сhar). Ответ от сервера сохраняется в res, а в resHeaders сохранятся дополнительные данные от сервера, такие как дата и тип содержимого. Следующий шаг – создание полноценного URL для API Telegram, который будет обрабатывать запросы сообщений. Реализован строкой:

string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";

Здесь все части объединяются для создания полной ссылки, такой как эта:

https://api.telegram.org/bot8345012345:AAHdAPtMQR6VHEQeHk1y_H9IuL3zc5abcde/sendMessage.

Этот URL сообщает серверу, что мы хотим отправить сообщение с помощью бота, токен которого был предоставлен.

WebRequest(method, url, headers, time_out, data, res, resHeaders);

Метод POST и указанный URL используются для отправки данных из char-массива в API Telegram. Хотя в данном случае заголовки пустые, они могут содержать дополнительную информацию. Время ожидания ответа в MetaTrader 5 определяется параметром time_out. В то время как resHeaders собирает дополнительную информацию об ответе, включая тип сервера, длину содержимого, дату и данные соединения, ответ сервера хранится в массиве res.

Подводя итог, эта программа связывает MetaTrader 5 с вашим Telegram-ботом и добавляет небольшое приветствие в ваш Telegram-чат, которое гласит: "Hello from MetaTrader 5!".


Отправка сообщения из MetaTrader 5 в группу Telegram

Следующий шаг – научиться отправлять сообщения в группу Telegram вместо бота Telegram, и процесс для групп немного отличается по сравнению с ботами. 

После создания группы в Telegram нажмите на иконку профиля группы.

Figure 13. Manage Group

Перейдите в раздел "Управление группой" из появившихся опций, затем нажмите на "Администраторы".

Figure 14. Administrator

Нажмите на "Добавить администратора" и используйте строку поиска, чтобы найти созданного ранее бота Telegram по его имени пользователя (например, @MQL5APTtest_bot).

Figure 15. Add Administrator

После выбора вашего бота дайте ему необходимые разрешения для работы в группе.

Figure 16. Permissions

Вернитесь в свою группу в Telegram и отправьте сообщение.

Figure 16. Send Message

Вернитесь в ваш браузер и снова откройте ссылку на API Telegram:

https://api.telegram.org/bot<YourBotToken>/getUpdates

После перезагрузки веб-сайта появится JSON-ответ с информацией о сообщении, которое вы только что отправили в группу. Chat_id вашей группы в Telegram можно найти в разделе chat этого ответа. Вы будете использовать этот chat_id в вашем коде MetaTrader 5, чтобы отправлять сообщения напрямую в эту группу.

Figure 18. Group ID

Теперь, поскольку вы смогли получить идентификатор вашей группы Telegram, вы сможете использовать его в вашем коде MQL5. Любое сообщение или уведомление, которое вы отправите из MetaTrader 5, теперь будет отправляться прямо в эту конкретную группу в Telegram, так как с помощью этого сhat_id ваша программа сможет точно указывать адресата сообщений.

Пример:
const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string headers = "";
const int time_out = 5000;

const string group_chatID = "-1003271234567";

const string bot_token  = "8345012345:AAHdAPtMQR6VHEQeHk1y_H9IuL3zc5abcde";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   string body = "chat_id=" + group_chatID + "&text=Hello from MT5!";
   StringToCharArray(body, data, 0);

   string url = telegram_api_url + "/bot" + bot_token + "/sendMessage";

   WebRequest(method,url,headers,time_out,data,res,resHeaders);

//---
   return(INIT_SUCCEEDED);
  }

Вывод:

Figure 19. MT5 to Telegram

Пояснение:

Мы объявили строковую переменную для хранения идентификатора группового чата. Используйте group_chatID, если хотите, чтобы сообщение было доставлено в вашу группу Telegram.

Кроме того, мы использовали строку Print(CharArrayToString(res)); для получения ответа сервера. В этом ответе содержится важная информация, в частности, message_id переданного сообщения. В следующем разделе мы узнаем, как изменить или удалить сообщение прямо из MetaTrader 5; таким образом, этот идентификатор сообщения будет весьма полезен.

Удаление сообщения с помощью функции WebRequest()

Запрос на удаление можно отправить напрямую на сервер Telegram, используя функцию WebRequest(). Боты могут удалять сообщения из групп, если вы знаете идентификатор сообщения, которое хотите удалить. Бот может удалять сообщения в группе, а также сообщения, которые он отправляет, потому что он является администратором (в зависимости от прав, которые вы предоставили ему ранее).

По этой причине было крайне важно, чтобы мы распечатали полученные ранее результаты. Напоминаем, что ответ сервера на наш запрос выглядел так:  

{
  "ok": true,
  "result": {
    "message_id": 34,
    "from": {
      "id": 1234500523,
      "is_bot": true,
      "first_name": "MQL5 API Bot",
      "username": "MQL5APItest_bot"
    },
    "chat": {
      "id": -1234577012345,
      "title": "Bot Testing Group",
      "type": "supergroup"
    },
    "date": 1761498168,
    "text": "Hello from MT5 to Telegram Group!"
  }
}

Из этого ответа видно, что Telegram возвращает полезные данные, такие как message_id. Благодаря этому идентификатору вы можете использовать функцию WebRequest, чтобы изменить или удалить это конкретное сообщение позже.

Вы можете получите идентификатор сообщения, только в момент, когда оно было отправлено советником. Если сообщение было отправлено вами вручную в группу, вам нужно будет перейти по адресу "https://api.telegram.org/bot<YourBotToken>/getUpdates", найти сообщение и скопировать его идентификатор. 

https://api.telegram.org/bot<YourBotToken>/getUpdates

Пример:

const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string group_chatID = "-1003277012345";
const string headers = "";
const int time_out = 5000;

const string bot_token  = "8345012345:AAHdAPtMWR6VHEQeHk1y_H9IuL3zc5abcde";
const string MessageID = "34";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   const string url = telegram_api_url + "/bot" + bot_token + "/deleteMessage";

   string body = "chat_id=" + group_chatID +"&message_id=" + MessageID;
   StringToCharArray(body, data, 0);

   WebRequest(method,url,headers,time_out,data,res,resHeaders);
   
//  Print(CharArrayToString(res));

//---
   return(INIT_SUCCEEDED);
  }

Пояснение:

Выбрана опция POST. API Telegram требует POST-запрос для удаления сообщений, хотя можно было бы предположить, что нужно использовать DELETE. Вы даете инструкцию на языке MQL5 о передаче данных на сервер в теле запроса с помощью POST. Рассматривайте POST как отправку "письма с указаниями" серверу Telegram. Вам все равно нужно написать в письме сообщение и отправить это письмо, даже если указание состоит в том, чтобы удалить письмо.

Сообщение, которое вы хотите удалить, идентифицируется по его MessageID. Telegram присваивает отличительный идентификатор каждому сообщению, отправленному в чат человеком или ботом. Используя этот идентификатор, вы можете указать серверу Telegram, какое сообщение удалить. Этот идентификатор сообщения зачастую получают из ответа сервера после отправки сообщения.

Чтобы создать полноценный эндпоинт для удаления сообщений, необходимо составить URL из нескольких компонентов. Адрес API Telegram – это базовый URL. Запрос поступает от некоторого бота, указанного в компоненте c описанием бота. Специальный ключ аутентификации для вашего бота называется токеном бота. Наконец, если вы включите deleteMessage, сервер будет знать, что вы хотите что-то удалить. В совокупности эти URL-адреса указывают точное место, куда нужно отправить ваш запрос на удаление.

Идентификаторы чата и сообщения содержатся в теле запроса. Telegram по идентификатору сообщения получает информацию, какое конкретно сообщение необходимо удалить, а по ID чата – к какому чату или группе принадлежит сообщение. Команда, которую вы даете серверу, по сути, изложена в теле запроса.

Редактирование сообщения с помощью функции WebRequest()

Последней темой нашего обсуждения будет использование функции WebRequest() для изменения сообщения. Вам следует знать, что изменять вы можете только те сообщения, которые отправил ваш бот. Бот не может изменять сообщения, отправленные другими пользователями напрямую в группу.

Отправка или удаление сообщения функционирует аналогично редактированию. Мы также используем как токен бота, так и идентификатор сообщения.

При вызове функции WebRequest() необходимо указать метод POST, соответствующий URL-адрес для редактирования сообщения и тело запроса, включающее идентификатор чата, идентификатор сообщения и обновленный текст, который вы хотите отправить. Это сохраняет идентификатор сообщения постоянным, позволяя вашей программе MetaTrader 5 динамически обновлять сообщение.

Пример:

const string method = "POST";
const string telegram_api_url = "https://api.telegram.org";
const string bot_chatID = "6972412345";
const string group_chatID = "-10032771234567";
const string headers = "";
const int time_out = 5000;

const string bot_token  = "345012345:AAHdAPtMWR6VHEQeHk1y_H9IuL3zc5abcde";
const string MessageID = "35";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   char data[];
   char res[];
   string resHeaders = "";

   string new_message = "Updated message text from MT5!";
   string url = telegram_api_url + "/bot" + bot_token +
                "/editMessageText";

   string body = "chat_id=" + group_chatID +"&message_id=" + MessageID + "&text=" + new_message;
   StringToCharArray(body, data, 0);

   WebRequest(method,url,headers,time_out,data,res,resHeaders);

   Print(CharArrayToString(res));

//---
   return(INIT_SUCCEEDED);
  }

Пояснение:

Сначала определяется текст нового сообщения, которое вы хотите отправить. Исходное сообщение в группе или чате Telegram будет заменено этим новым содержимым. Затем создается URL путем объединения эндпоинта /editMessageText, токена вашего бота и базового URL API Telegram. Telegram, в частности, получает информацию от этого эндпоинта о том, что запрос требует изменения существующего сообщения. Далее следует создание тела запроса. В нем содержатся идентификатор сообщения (указывает, какое конкретное сообщение нужно изменить), идентификатор чата (указывает, к какому разговору или группе принадлежит сообщение), а также новый текст, который вы хотите добавить в сообщение. В конечном итоге из строки body создается массив символов. Это необходимо, поскольку метод WebRequest требует предоставления тела сообщения в формате массива символов для его передачи по сети.

 

Заключение

В этой статье вы научились основам использования функции WebRequest() и API в языке MQL5. Мы исследовали, как MetaTrader 5 может взаимодействовать с внешней платформой, такой как Telegram, через практико-ориентированный проект. Вы научились отправлять, редактировать или удалять сообщения прямо из MetaTrader 5, получать идентификаторы чатов и групп, а также создавать Telegram-ботов. Чтобы вы могли лучше понять интеграцию API на практике, в предстоящих статьях мы сделаем следующий шаг: изучим, как принимать и обрабатывать данные от внешних API.

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/17774

Прикрепленные файлы |
Создание самооптимизирующихся советников на MQL5 (Часть 6): Самоадаптирующиеся торговые правила (II) Создание самооптимизирующихся советников на MQL5 (Часть 6): Самоадаптирующиеся торговые правила (II)
В статье рассматривается оптимизация уровней и периодов RSI для получения более эффективных торговых сигналов. Будут представлены методы оценки оптимальных значений RSI и автоматизации выбора периода с использованием поиска по сетке и статистических моделей. Наконец, мы реализуем решение на языке MQL5, используя Python для анализа. Наш подход прагматичен, прост и направлен на то, чтобы с легкостью решать потенциально сложные проблемы.
От новичка до эксперта: Алгоритмическая дисциплина трейдера — советник Risk Enforcer вместо эмоций От новичка до эксперта: Алгоритмическая дисциплина трейдера — советник Risk Enforcer вместо эмоций
Для многих трейдеров разрыв между знанием правил управления рисками и последовательным их соблюдением приводит к гибели счетов. Эмоциональное подавление, торговля с целью отыграться и простая оплошность могут разрушить даже самую лучшую стратегию. Сегодня мы превратим платформу MetaTrader 5 в надежного исполнителя ваших торговых правил, разработав советник по управлению рисками под названием Risk Enforcement Expert Advisor. Присоединяйтесь к этой дискуссии, чтобы узнать больше.
Нейросети в трейдинге: Возмущённые модели пространства состояний для анализа рыночной динамики (модуль E-TROF) Нейросети в трейдинге: Возмущённые модели пространства состояний для анализа рыночной динамики (модуль E-TROF)
В статье показан механизм превращения потока тиков или баров в устойчивое контекстное представление рынка, пригодное для онлайн-торговли без лишних вычислений. Инкрементальная обработка, стековое накопление состояния и расширенное пространство признаков позволяют выявлять направленные движения и локальные корреляции там, где классические методы видят лишь шум.
Реализация механизма безубыточности в MQL5 (Часть 2): Безубыток на основе ATR и RRR Реализация механизма безубыточности в MQL5 (Часть 2): Безубыток на основе ATR и RRR
В данной статье завершается реализация механизмов безубыточности на основе ATR и RRR в MQL5, а также с нуля разрабатывается класс, позволяющий легко изменять режим безубытка без необходимости повторного ввода параметров. Для оценки эффективности каждого типа безубытка выполняется несколько бэктестов, в рамках которых анализируются их преимущества и недостатки в контексте алгоритмического трейдинга.