How to Send Telegram Messages from MQL5: A Comprehensive Guide

Introduction to Telegram Integration with MQL5

Why Integrate Telegram with MQL5?

Integrating Telegram with MQL5 allows traders to receive real-time notifications about trading activities directly on their mobile devices or desktops. This can include trade execution alerts, account updates, or custom signals generated by Expert Advisors (EAs) and indicators. Immediate access to this information enables faster decision-making and improved monitoring of trading strategies.

Overview of the Telegram Bot API

The Telegram Bot API is a simple HTTP-based interface that allows you to control Telegram bots programmatically. By sending HTTP requests to specific URLs, you can perform actions such as sending messages, photos, and other types of content. This guide focuses on using the WebRequest function in MQL5 to interact with the Telegram Bot API.

Prerequisites: Telegram Bot Creation and API Token

Before you begin, you need to create a Telegram bot and obtain its API token. Here’s how:

  1. Open Telegram and search for “BotFather.”
  2. Start a chat with BotFather and use the /newbot command.
  3. Follow the instructions to choose a name and username for your bot.
  4. BotFather will provide you with an API token. Keep this token safe, as it’s required to control your bot.

Setting Up Your MQL5 Environment

Installing MetaTrader 5 and MQL5 Editor

Ensure you have MetaTrader 5 installed on your system. The MQL5 Editor is included as part of the MetaTrader 5 installation.

Configuring MQL5 for External API Calls

To allow your MQL5 code to make external API calls, you need to enable WebRequest permissions. This is done by adding the Telegram API URL to the list of allowed URLs in the Expert Advisor properties:

  1. Open the MetaEditor and navigate to Tools > Options > Expert Advisors.
  2. Check the “Allow WebRequest for listed URL” box.
  3. Add https://api.telegram.org to the list of allowed URLs.

Understanding MQL5 Syntax for Web Requests

MQL5 provides the WebRequest function for making HTTP requests. This function allows you to send data to a server and receive a response. The basic syntax is:

int WebRequest(string method, string url, string headers, int timeout, const string &data, string &result, int &error_code, string &error_description);
  • method: HTTP method (e.g., “POST”, “GET”).
  • url: The URL to send the request to.
  • headers: HTTP headers (e.g., “Content-Type: application/json”).
  • timeout: Timeout in milliseconds.
  • data: The data to send in the request body.
  • result: Variable to store the response from the server.
  • error_code: Variable to store the error code, if any.
  • error_description: Variable to store the error description, if any.

Writing the MQL5 Code to Send Telegram Messages

Implementing the WebRequest Function

The WebRequest function is the core of sending messages to Telegram. It handles the actual HTTP request and response cycle.

Constructing the Telegram API Request URL

The Telegram API URL for sending messages is:

https://api.telegram.org/bot<your_bot_token>/sendMessage

Replace <your_bot_token> with the API token you received from BotFather.

Sending Text Messages to Telegram

Here’s an MQL5 code snippet to send a text message to a Telegram chat:

#property script

#property strict

input string TelegramBotToken = "YOUR_BOT_TOKEN"; // Replace with your bot token
input string TelegramChatID = "YOUR_CHAT_ID";    // Replace with your chat ID

void OnStart()
{
   string url = "https://api.telegram.org/bot" + TelegramBotToken + "/sendMessage";
   string data = "chat_id=" + TelegramChatID + "&text=Hello from MQL5!";
   string headers = "Content-Type: application/x-www-form-urlencoded";
   string result;
   int error_code;
   string error_description;

   int response = WebRequest("POST", url, headers, 10000, data, result, error_code, error_description);

   if (response == 200)
   {
      Print("Message sent successfully!");
      Print("Result: " + result);
   }
   else
   {
      Print("Error sending message: " + error_code);
      Print("Description: " + error_description);
   }
}

Replace YOUR_BOT_TOKEN and YOUR_CHAT_ID with your actual bot token and chat ID, respectively. To find out your chat ID, you can use a bot that returns it, or forward a message from yourself to the bot and inspect the message details via the getUpdates method in telegram.

Handling API Responses and Errors

The WebRequest function returns an HTTP status code. A status code of 200 indicates success. Other codes indicate errors. The error_code and error_description variables provide more details about the error.

Advanced Features and Customization

Sending Messages with Custom Formatting (Markdown, HTML)

Telegram supports Markdown and HTML formatting. To use these formats, add the parse_mode parameter to your request:

string data = "chat_id=" + TelegramChatID + "&text=*Hello* from _MQL5_!&parse_mode=Markdown";

Or for HTML:

string data = "chat_id=" + TelegramChatID + "&text=<b>Hello</b> from <i>MQL5</i>!&parse_mode=HTML";

Implementing Error Handling and Logging

Robust error handling is crucial. Check the error_code and error_description after each WebRequest call and log any errors. This will help you diagnose and fix issues quickly.

Creating Functions for Reusable Telegram Message Sending

Create a function to encapsulate the Telegram message sending logic. This makes your code more modular and reusable:

bool SendTelegramMessage(string message)
{
   string url = "https://api.telegram.org/bot" + TelegramBotToken + "/sendMessage";
   string data = "chat_id=" + TelegramChatID + "&text=" + message;
   string headers = "Content-Type: application/x-www-form-urlencoded";
   string result;
   int error_code;
   string error_description;

   int response = WebRequest("POST", url, headers, 10000, data, result, error_code, error_description);

   if (response == 200)
   {
      Print("Telegram message sent successfully!");
      return true;
   }
   else
   {
      Print("Error sending Telegram message: " + error_code + ", " + error_description);
      return false;
   }
}

Sending Alerts Based on Trading Events

Use the SendTelegramMessage function to send alerts when specific trading events occur, such as order open, close, or modify events.

Practical Examples and Use Cases

Sending Trade Notifications (Open, Close, Modify)

void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)
{
   if (trans.type == TRADE_TRANSACTION_ORDER_ADD)
   {
      string message = "Order opened: Symbol=" + trans.symbol + ", Volume=" + DoubleToString(trans.volume, 2) + ", Price=" + DoubleToString(trans.price, _Digits);
      SendTelegramMessage(message);
   }
   else if (trans.type == TRADE_TRANSACTION_ORDER_DELETE)
   {
      string message = "Order closed: Symbol=" + trans.symbol + ", Profit=" + DoubleToString(trans.profit, 2);
      SendTelegramMessage(message);
   }
}

Implementing Custom Alert Systems

You can create custom alerts based on technical indicators or price action. For example, send an alert when the price crosses a moving average:

double MA = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);

double CurrentPrice = SymbolInfoDouble(Symbol(), SYMBOL_BID);

if (CurrentPrice > MA)
{
   SendTelegramMessage("Price crossed above 20-day moving average!");
}

Creating a Telegram Bot for Account Monitoring

Build a bot that responds to commands and provides account information. For example, a /balance command could return the current account balance. This requires a more complex implementation that includes constantly polling the Telegram API for new messages and responding accordingly.


Leave a Reply