English Русский 日本語
preview
Einführung in MQL5 (Teil 27): Beherrschung der API- und WebRequest-Funktion in MQL5

Einführung in MQL5 (Teil 27): Beherrschung der API- und WebRequest-Funktion in MQL5

MetaTrader 5Handel |
12 0
Israel Pelumi Abioye
Israel Pelumi Abioye

Einführung

Willkommen zurück zu Teil 27 der Serie Einführung in MQL5! Haben Sie sich jemals gefragt, wie MetaTrader 5 mit anderen Plattformen interagieren kann? Wenn ja, dann sollten Sie diesen Artikel lesen.

Dieser Artikel konzentriert sich auf das Verständnis der Funktionsweise von APIs und darauf, wie MetaTrade 5 mit externen Servern über die Funktion WebRequest() kommunizieren kann. Um den Lernprozess anwendbarer zu machen, werden wir an einem kleinen Projekt arbeiten, bei dem MetaTrader 5 mit Telegram integriert wird. In diesem Projekt erfahren Sie, wie Sie die Telegram-API nutzen können, um Nachrichten von MetaTrader 5 aus zu senden, zu bearbeiten und zu löschen.

Der Zweck dieses Artikels ist es, Sie in die grundlegenden Ideen einzuführen, die der MQL5 WebRequest-Kommunikation und den APIs zugrunde liegen. In den nächsten Artikeln werden wir uns mit komplizierteren API-Nutzungsfällen und realen Anwendungen für die Funktion WebRequest() beschäftigen.

Abbildung 1. Telegramm-API


Anwendungsprogrammierschnittstelle (API)

Eine API ist eine Sammlung, die die Kommunikation zwischen zwei Softwareprogrammen ermöglicht. Sie kann mit einer Brücke verglichen werden, die ein System überspannt. In der Handelsbranche ermöglichen APIs Ihrer Handelsplattform (z. B. MetaTrader 5) die Kommunikation und den Empfang von Daten von Websites, E-Mail-Servern und anderen externen Diensten wie Telegram.

Die Telegram API wird von MetaTrader 5 verwendet, um sich mit den Servern von Telegram zu verbinden. Nachdem Ihre Anfrage von MetaTrader 5 verarbeitet wurde, wird sie von der API an die entsprechende Gruppe weitergeleitet. Auf diese Weise können sich zwei Systeme gegenseitig verstehen, sodass dieser Prozess schnell und mühelos abläuft.

HTTP, das gleiche Protokoll, das auch von Webbrowsern verwendet wird, ist eines der wichtigsten Kommunikationsprotokolle, das von APIs genutzt wird. WebRequest() ist eine MQL5-Funktion, die als Vermittler zwischen Ihrer Handelsplattform und dem externen Server fungiert und diese Verbindung bearbeitet. Wir werden API besser verstehen, wenn wir den Begriff in seinen drei Komponenten untersuchen: Anwendung, Programmierung und Schnittstelle.

Anmeldung

Jedes Softwareprogramm, das bestimmte Funktionen ausführt, wird als Anwendung bezeichnet. Das kann eine Website, eine mobile App wie Telegram oder sogar MetaTrader 5 sein. Jedes Programm verwaltet seine eigenen internen Daten und Funktionen.

Programmierung

Bei der Programmierung wird Code geschrieben, damit Systeme miteinander kommunizieren können, und APIs ermöglichen es den Entwicklern, die Fähigkeiten einer Anwendung zu nutzen, ohne vollständig zu wissen, wie sie intern funktioniert.

Schnittstelle

Eine Schnittstelle ist der Ort, an dem zwei Systeme miteinander kommunizieren. Darin ist festgelegt, welche Informationen ausgetauscht werden können und auf welche Weise sie kommunizieren können. So können Sie zum Beispiel Filme auf Ihrem Computer suchen und abspielen, auch wenn sie nicht gespeichert sind. Wenn Sie auf „Abspielen“ klicken, kontaktiert YouTube seinen Server und beginnt mit der Wiedergabe des Videos.  Wenn Sie auf „Abspielen“ klicken, sendet YouTube Ihre Anfrage an seinen Server und beginnt mit der Wiedergabe des Videos. Ebenso kann der MetaTrader 5 Nachrichten senden und empfangen, wenn er sich über eine API mit einer externen Plattform verbindet.

Ein System, das die Kommunikation zwischen Anwendungen mit Hilfe genau definierter Programmieranweisungen ermöglicht, wird als Anwendungsprogrammierschnittstelle bezeichnet. Es dient als Bindeglied zwischen Ihrer Handelsplattform und anderen Plattformen wie E-Mail oder Telegram und ermöglicht die Automatisierung.

Analogie:

Stellen Sie sich Nikolai vor, einen Jungen. Er hat viele Fähigkeiten, aber trotz all seiner Talente kann er nicht alles allein machen. Er könnte zum Beispiel Hilfe beim Singen brauchen. Anstatt all diese Fähigkeiten zu erlangen, hat Nikolai einen unsichtbaren Begleiter namens API. „API, bitte sag meinem Freund Ivan, er soll dieses Lied für mich singen“ oder „API, sag Anastasia, sie soll mir beim Kochen helfen“ sind die Sätze, mit denen Nikolai mit seinem unsichtbaren Freund kommuniziert, wenn er Hilfe bei etwas braucht, das er nicht selbst erledigen kann. Iwan oder Anastasia wird schnell über die API verbunden, die dann die Anfrage sendet und das Ergebnis zurückgibt.

Nikolai muss nicht unbedingt wissen, wie Iwan singt. Alles, was er wissen muss, ist, was er fragen muss und wie er die API nutzen kann; genau so funktionieren APIs in der digitalen Welt.

Nikolai dient in dieser Geschichte als Metapher für Ihre Hauptanwendung, z. B. MetaTrader 5. Die Brücke, die den MetaTrader 5 mit anderen Plattformen wie E-Mail oder Telegram verbindet, wird der unsichtbare Freund (API) genannt. MetaTrader 5 muss nicht verstehen, wie das interne System von Telegram funktioniert, um eine Nachricht an die Messaging-App zu senden. Es stellt einfach eine Anfrage mit der WebRequest-Funktion, und Telegram empfängt sie.

 

Die Funktion WebRequest()

Schauen wir uns die Funktion WebRequest() an, eines der wichtigsten MQL5-Tools, das den Kontakt mit externen Plattformen ermöglicht, nachdem wir nun wissen, was eine API ist und wie sie MetaTrader 5 dabei hilft. Einfach ausgedrückt, dient WebRequest() als Verbindung zwischen einem externen Webserver und Ihrem MetaTrader 5 Terminal. Es ermöglicht die Übertragung und den Empfang von Daten zwischen Ihrem EA und dem Internet. Diese Funktion ist nützlich, wenn Sie mit einer nutzerdefinierten API kommunizieren und Daten von einem Webdienst abrufen möchten.

Stellen Sie sich ein Szenario vor: Der Server ist ein Büro auf der anderen Straßenseite, und Ihr MetaTrader 5 ist ein Händler, der in einem Büro sitzt. Die Nachrichten werden mit Hilfe der Funktion WebRequest() zwischen den beiden Büros ausgetauscht. Mit GET oder POST können Sie dem Kurier beispielsweise mitteilen, welche Nachricht er senden soll, wohin er sie liefern soll und wie er sie liefern soll.

Die Funktion WebRequest() dient zum Abrufen von Informationen aus dem Web durch Kommunikation mit einem externen Server und kann auf verschiedene Weise verwendet werden. Es gibt zwei Möglichkeiten, die Funktion WebRequest() zu verwenden.

Die erste Version sieht wie folgt aus:

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 
   );

Die zweite Version sieht wie folgt aus:

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 
   );

Die gängigste Version bietet eine größere Vielseitigkeit, insbesondere bei der Nutzung moderner APIs wie der von Telegram. Sie eignet sich perfekt für die Verwaltung von Anfragen, die mehr als nur eine „Schlüssel=Wert“-Kommunikation erfordern, da sie Ihnen die Möglichkeit gibt, nutzerdefinierte Header zu definieren, um den Anforderungen der API gerecht zu werden. Da sie die nötige Flexibilität bietet, um Nachrichten über die Telegram-API zu senden, zu bearbeiten und sogar zu löschen, wird diese zweite Version der Funktion WebRequest() das Hauptthema dieses Artikels sein. Wenn Sie verstehen, wie diese Version funktioniert, können Sie jeden Aspekt Ihrer Kommunikation mit anderen Servern verwalten, vom Senden Ihrer ersten Nachricht an Telegram bis zur Überwachung von Updates in Echtzeit.

Die Funktion WebRequest() ist besonders nutzerfreundlich, weil MQL5 die Dinge für Entwickler vereinfacht hat. Sie müssen sich keine Gedanken darüber machen, was bei der Online-Kommunikation im Hintergrund abläuft. Das Wichtigste ist, die Funktionsweise der Parameter der Funktion zu verstehen, da jeder einzelne entscheidend dafür ist, wie Ihre Anfrage übermittelt und die Antwort empfangen wird.

Methode

Die HTTP-Methode ist der erste Parameter von WebRequest() und hilft, die gewünschte Aktion an einen entfernten Server zu übermitteln. Die Verwendung von „GET“ oder „POST“ in MQL5 hilft dabei, die richtige Wahl zu treffen, da sie sich darauf auswirkt, wo Ihre Daten gespeichert werden und wie sie Ihre Anfrage bearbeitet.

GET:

Dies wird verwendet, um schreibgeschützte Daten anzufordern.

POST:

In MQL5 kann POST, je nachdem wie der Server konfiguriert ist, nicht nur zum Senden von Daten an den Server, sondern auch zum Erstellen, Entfernen oder Ändern von Daten verwendet werden.

URL

Die URL ist die Webadresse, die MQL5 anweist, wohin die Anfrage zu senden ist.

Beispiele:
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";

Jede dieser URLs führt eine bestimmte Aufgabe auf dem Telegram-Server aus. Die Funktion WebRequest() sendet Ihre Daten an die angegebene URL, und die Telegram-API verarbeitet sie entsprechend dem gewählten Endpunkt. Sie können Telegram zum Beispiel anweisen, eine neue Nachricht in einem Chat zu erstellen, indem Sie den Endpunkt sendMessage verwenden. Wenn Sie editMessageText verwenden, weisen Sie das Programm an, eine vorhandene Nachricht zu ändern. Außerdem weisen Sie das Programm an, eine Nachricht zu löschen, wenn Sie deleteMessage verwenden.

telegram_api_url:

Dies ist der Bezeichner, der für die Variable verwendet wird, in der die API gespeichert ist:

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

Alle Telegram-Bot-Anfragen werden an diese Basis-URL weitergeleitet. Er kann als das „Hauptgebäude“ angesehen werden, in dem alle Telegram-Bots funktionieren. Diese Hauptadresse ist der Ausgangspunkt für alle Ihre Aktionen, einschließlich Senden, Bearbeiten und Löschen von Nachrichten.

/bot:

Telegram weiß dank dieses Abschnitts, dass Sie versuchen, einen Bot zu kontaktieren und nicht ein legitimes Nutzerkonto. Die folgenden Aktivitäten werden durch das Telegram-Bot-System abgewickelt, wie durch dieses Schlüsselwort angegeben. Vereinfacht ausgedrückt funktioniert /bot als Hinweis darauf, dass „diese Anfrage für die Bot-Abteilung“ im Telegram-Hauptgebäude bestimmt ist.

bot_token:

Das Bot-Token ist eine lange Zeichen- und Zahlenfolge, die als Zugriffsschlüssel des Bots verwendet wird; es ist einer der wichtigsten Bestandteile jeder API-Verbindung. Dieser Schlüssel ermöglicht den direkten Kontakt zwischen Ihrem MQL5-Programm und dem Server. Jedes Mal, wenn Ihr EA einen WebRequest sendet, teilt das Token Telegram mit, dass „diese Anfrage von meinem Bot stammt und ich die Erlaubnis habe, diese Aktion durchzuführen“. Es dient auch als Passwort für den Zugang zum Bot.

Ihr Bot-Token muss aufgrund seiner Bedeutung immer privat und sicher gehalten werden, da jeder, der Zugang zu Ihrem Bot hat, die Kontrolle darüber übernehmen und in Ihrem Namen Nachrichten versenden kann. Es ist daher eine kluge Angewohnheit, sie in einem sicheren Bereich aufzubewahren, beispielsweise in einer anderen Konfigurationsdatei oder als externe Eingabevariable in Ihrem EA. Um Ihr MetaTrader 5 Programm mit Telegram zu verbinden, zeige ich Ihnen später in diesem Artikel, wie Sie Ihr Bot-Token direkt von Telegram mit BotFather abrufen können.

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

„Hey, ich möchte eine Nachricht über den sendMessage-Endpunkt senden“, ist im Wesentlichen das, was Sie Telegram mitteilen. Dies ist mein Zeichen, um es zu demonstrieren.

Headers

Der nächste Parameter, den wir untersuchen, ist die Kopfteil. Dies ist eher eine Anweisung oder Berechtigung, die Sie dem Antrag hinzufügen.

Beispiel:

const string headers = "";

Timeout

Mit diesem Parameter wird angegeben, wie lange der EA nach dem Senden einer Anfrage auf eine Antwort des Servers warten soll.

Beispiel:

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

MetaTrader 5 wartet in diesem Fall fünf Sekunden auf eine Antwort. Nach dieser Zeitspanne versucht MetaTrader 5 nicht mehr, eine Verbindung herzustellen, und die Anfrage schlägt fehl. Eine Auszeit könnte man mit dem Warten auf einen Freund vergleichen, der das Telefon abnimmt. Sie können auflegen, wenn die Person nicht innerhalb von zehn Sekunden antwortet. „Wenn der Server nicht innerhalb der von mir festgelegten Zeit antwortet, höre ich auf zu warten“ ist eine weitere Aussage Ihrer MetaTrader 5 Software.

Data

Die eigentliche Nachricht, die Sie vom MetaTrader 5 an die externe Plattform senden möchten, wird in einer Char-Array-Variablen gespeichert, die von entscheidender Bedeutung ist. 

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

Da die Daten als Bytes und nicht nur als Text übertragen werden, wird die Nachricht von einer normalen Zeichenkette in ein Zeichenfeld umgewandelt. Um festzustellen, welche bestimmte Nachricht geändert werden muss, wird auch die Nachrichten-ID verwendet.

Beispiel:

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

Und wenn Sie eine bereits gesendete Nachricht löschen möchten, können Sie dies tun:

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

Die chat_id ist ein eindeutiger Bezeichner für Ihre Telegram-Gruppe oder Ihren Bot, ähnlich wie Ihr eindeutiger Nutzername. Sie teilt dem Server den genauen Ort mit, an den die Nachricht zu senden ist, und kann mit einer Privatadresse verglichen werden. Eine falsche chat_id verhindert, dass die Nachricht jemals die Gruppe von Chats erreicht, die die Nachricht erreichen soll. Jede Telegram-Gruppe hat ihre eigene eindeutige ID. Indem du diese in den Text deiner Nachricht einfügst, sagst du im Wesentlichen, dass die Nachricht an eine bestimmte Adresse gesendet werden soll.

Jede von Ihnen gesendete Nachricht hat eine message_id, eine eindeutige Identifizierungsnummer, die ihr zugeordnet ist. Diese eindeutige Nummer ist nützlich, wenn Sie die Nachricht in Ihrem Code löschen oder bearbeiten wollen.

Umgekehrt dient das bot_token als Passwort oder Zugangsschlüssel für Ihren Bot. Es ist ein spezieller Authentifizierungsschlüssel, der Ihren Telegram-Bot mit Ihrer MetaTrader 5-Anwendung verbindet. Sie kann mit dem Ausweis Ihres Bots verglichen werden. Ihre Nachricht wird nie gesendet, da Telegram ohne dieses Token nicht erkennen kann, welcher Bot sie anfordert.

Nun, um die Dinge klarer zu machen:

  • Die Chat-ID teilt dem Server mit, wohin er die Nachricht senden soll.
  • Anhand der Nachrichten-ID kann es erkennen, welche Nachricht geändert oder gelöscht werden soll.
  • Der bot_token teilt Telegram mit, wer die Anfrage stellt.

Später in diesem Artikel erkläre ich dir, wie du deine Chat-ID, Nachrichten-ID und dein Bot-Token zurückbekommst und wie du sie auf Telegram richtig verwendest.

Betrachten wir nun das data[]-Array im Detail. Die Delivery Box, die Ihre Nachricht vom MetaTrader 5 zum Telegram-Server transportiert, heißt Data[]. Als Erstes müssen Sie den Text, den Sie senden möchten, in eine String-Variable namens „body“ einfügen. Zum Beispiel: „Hallo MT5!“ Um sicherzustellen, dass diese Nachricht sicher über das Netz transportiert wird, müssen Sie sie vor dem Versand richtig bündeln. Dies wird erreicht, indem StringToCharArray() verwendet wird, um Ihre Nachricht (String) in ein Zeichen-Array umzuwandeln, das der WebRequest()-Kurier verstehen kann.

Result

Die Ergebnisvariable der Funktion WebRequest() enthält die Antwort des Servers, einschließlich zusätzlicher Informationen wie die Nachrichten-ID oder die Bestätigung, dass die Nachricht erfolgreich gesendet wurde.

Beispiel:
char res[];
WebRequest("POST", url, "", 5000, data, res, resHeaders);

Print(CharArrayToString(res));

Result:

{
  "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!"
  }
}

Die message_id ist in diesem Fall entscheidend. Mit dieser ID können Sie später die genaue Nachricht aktualisieren oder entfernen. Daher werden Sie diese message_id bei einem weiteren WebRequest-Aufruf verwenden, wenn Sie den Nachrichtentext ändern oder ganz entfernen möchten.

Betrachten Sie es einmal so: Telegram stellt Ihnen eine Zustellungsbestätigung (gespeichert in res[]) zur Verfügung, wenn Sie eine Nachricht über den MetaTrader 5 versenden. Diese bestätigt die Zustellung und weist eine Tracking-Nummer (die Nachrichten-ID) zu. Sie können die Nachricht zu einem späteren Zeitpunkt jederzeit unter dieser Nummer wiederfinden, ändern oder löschen.

Kopfteil von Result

Der Kopfteil, den der Server nach der Verarbeitung Ihrer Anfrage zurückgibt, werden in diesem letzten Parameter der Funktion WebRequest() gespeichert. Sie wird wie folgt deklariert:

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

Ausgabe:

Abbildung 2. Kopfteil von Result

Die Kopfteil (header) und der Hauptteil(oder Inhalt (body) sind die beiden Hauptkomponenten, die der Webserver normalerweise als Antwort auf eine von Ihrer MQL5-Software gesendete Anfrage bereitstellt. Dieser Kopfteil aus der Antwort des Servers wird durch den Parameter result_headers erfasst.

Dieser Kopfteil enthält häufig wichtige technische Informationen wie

  • den Inhaltstyp, der Ihnen das Format der Antwort angibt,
  • Name und Version des Servers,
  • das Datum und die Uhrzeit der Antwort und
  • den Verbindungstyp, der angibt, ob die Verbindung offen bleibt oder nicht.

Diese Daten geben Ihnen Sicherheits- und Verbindungsinformationen, verifizieren, dass Ihre Anfrage ordnungsgemäß vom Telegram-Server empfangen wurde, und zeigen die Art des Inhalts an, der zurückgegeben wurde. Es ist wichtig zu wissen, dass die Funktion WebRequest() headers und result_headers für verschiedene Zwecke verwendet. Die Daten, die Sie mit Ihrer Anfrage an den Server übermitteln, werden durch das dritte Argument, headers, dargestellt. headers gibt an, welche Art von Daten Sie übermitteln, und enthalten gegebenenfalls Authentifizierungsinformationen.

Im Gegensatz dazu werden die Daten, die der Server an Sie zurückgibt, im letzten Parameter (result_headers) gespeichert. Neben anderen hilfreichen technischen Informationen wird erläutert, wie die Anfrage bearbeitet wurde und welche Art von Material zurückgegeben wurde. Dieser Vorgang lässt sich vereinfacht mit dem Austausch von Post zwischen zwei Büros vergleichen. Ähnlich wie ein Etikett, das Sie vor dem Versand auf einen Brief kleben, beschreibt der Parameter headers den Inhalt und die Art und Weise, wie er behandelt werden soll. Die Option result_headers gibt die Herkunft, das Versanddatum und die Zustellungsart des Umschlags an, ähnlich wie die Briefmarken und Markierungen auf einem Umschlag, den Sie zurückerhalten. Obwohl sie unterschiedliche Funktionen bei der Kommunikation zwischen MetaTrader 5 und einem externen Server haben, sind beide von entscheidender Bedeutung.


Senden einer Nachricht von MetaTrader 5 an Telegram Bot

Jetzt, da Sie die Funktionsweise der MQL5-APIs und der Funktion WebRequest() genau verstanden haben, ist es an der Zeit, das Gelernte anzuwenden. In diesem Teil werden wir lernen, wie man eine Nachricht vom MetaTrader 5 an einen Telegram-Bot sendet und die Theorie in die Praxis umsetzt. Dies ist der Punkt, an dem alles, was wir besprochen haben, einen Sinn ergibt. Damit Ihre MetaTrader 5 Software Nachrichten an einen Telegram-Bot oder eine Telegram-Gruppe senden, aktualisieren oder löschen kann.

Um das Optionsfenster Ihrer MetaTrader 5 Software zu öffnen, drücken Sie Strg + O. Wählen Sie dann die Registerkarte für Expert Advisors. Unterhalb dieses Abschnitts befindet sich das Kontrollkästchen „WebRequest für aufgelistete URL zulassen“. Um das Feld zu aktivieren, klicken Sie es an. 

Geben Sie dann in das Feld darunter die folgende URL ein:

https://api.telegram.org

Abbildung 3. Fenster Optionen

Suche nach BotFather.

Abbildung 4. Suche BotFather

Wählen Sie /newbot, um einen neuen Bot zu erstellen.

Abbildung 5. Neuer Bot

Wählen Sie einen Anzeigenamen für Ihren Bot.

Abbildung 6. Name anzeigen

Wählen Sie einen Nutzernamen, der mit „bot“ oder „_bot“ enden muss.

Abbildung 7. Nutzername

Sie erhalten sofort eine Nachricht, die zwei wichtige Informationen enthält:

  • Ihr Bot-Token - Dies ist ein eindeutiger Schlüssel, mit dem Sie Ihren Bot mit externen Plattformen wie MetaTrader 5 verbinden können. Sie werden es innerhalb Ihres MQL5-Codes verwenden, wenn Sie Nachrichten über die Telegram-API senden.
  • Ihr Bot-Link: Dies ist der Link zu Ihrem Bot. Klicken Sie darauf, um Ihren Bot direkt zu öffnen und einen Chat zu starten.

Abbildung 8. Bot erstellt

Geben Sie diese URL in die Adresszeile Ihres Browsers ein.

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

Setzen Sie den echten Token, den Sie von BotFather erhalten haben, in Token von <YourBotToken> ein.

Ihre URL sollte zum Beispiel so aussehen, wenn Ihr Token 123456789:ABCdefGhIJklMNopQRstuVWxyz lautet:

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

Abbildung 9.Pretty Print

Es öffnet sich eine Seite, die einen Text anzeigt. Auf dieser Seite erscheint ein Kästchen vor „Pretty-print“. Klicken Sie auf den Link. 

Gehen Sie zurück zu Ihrem Telegram-Bot und klicken Sie auf die Schaltfläche Start.

Abbildung 10. Start

Gehen Sie zurück zu Ihrem Browser und aktualisieren Sie die Seite.

Abbildung 11. Seite aktualisieren

Auf der Seite wird eine neue Aktualisierung angezeigt. Ihr Bot wurde erfolgreich aktiviert, wie dieses Update zeigt. Darüber hinaus bietet es hilfreiche Daten wie Ihre Chat-ID, die Sie benötigen, um Ihrem Telegram-Bot vom MetaTrader 5 aus Nachrichten zu senden. Der nächste Schritt besteht darin, eine neue EA-Datei in MetaEditor 5 zu erstellen, nachdem alle zuvor genannten Schritte abgeschlossen sind.

Mit Ihrer Chat-ID und Ihrem Bot-Token greifen Sie in diesem EA auf die API von Telegram zu. Von dort aus können Sie direkt von MetaTrader 5 aus personalisierte Nachrichten versenden. Dies ist der erste Schritt im praktischen Teil, in dem Sie alles anwenden, was Sie über WebRequest() und API-Kommunikation gelernt haben.

Beispiel:
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);
  }

Ausgabe:

Abbildung 12. Gesendete Nachricht

Erläuterung:

Die Chat-ID, die Header, die Zeitüberschreitung, die HTTP-Methode, die Telegram-API-URL und das Bot-Token wurden alle als Konstanten angegeben. MetaTrader 5 wird darüber informiert, dass die Daten mit der POST-Methode an den Server geliefert werden. Es sind keine weiteren Header erforderlich; die Chat-ID identifiziert die jeweilige Telegram-Gruppe oder den Chat, und MetaTrader 5 wartet fünf Sekunden auf eine Antwort, bevor er die Zeit verlässt.

Innerhalb der Funktion OnInit() werden drei Variablen deklariert: data, res und resHeaders. Das Daten-Array enthält das Zeichenformat der zu übertragenden Nachricht, da WebRequest() binäre Daten benötigt. Die Antwort des Servers wird in res gespeichert, und resHeaders enthalten weitere Daten des Servers, wie das Datum und die Art des Inhalts.

Die Funktion OnInit() deklariert drei Variablen: data, res und resHeaders. Da WebRequest() binäre Daten benötigt, liefert das Datenarray das Zeichenformat der Nachricht. Die Antwort des Servers wird in res gespeichert, und resHeaders enthält zusätzliche Informationen des Servers, wie das Datum und die Art des Inhalts. Der nächste Schritt besteht darin, die vollständige Telegram-API-URL zu erstellen, die die Nachrichtenanforderung verarbeiten wird. Dies geschieht mit der Zeile:

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

Hier werden alle Teile kombiniert, um einen vollständigen Link wie diesen zu erstellen:

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

Diese URL teilt dem Server mit, dass wir eine Nachricht über den Bot senden wollen, dessen Token angegeben ist.

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

Die POST-Methode und die angegebene URL werden verwendet, um die Daten aus dem Char-Array an die Telegram-API zu senden. Obwohl sie hier leer sind, können Kopfzeilen zusätzliche Informationen enthalten. Wie lange MetaTrader 5 auf eine Antwort wartet, wird durch time_out bestimmt. Während resHeaders zusätzliche Antwortinformationen sammelt, einschließlich Servertyp, Inhaltslänge, Datum und Verbindungsdaten, wird die Antwort des Servers im Array res gespeichert.

Zusammenfassend lässt sich sagen, dass dieses Programm MetaTrader 5 mit Ihrem Telegram-Bot verbindet und Ihrem Telegram-Chat einen kleinen Gruß hinzufügt, der lautet: „Hallo MetaTrade 5!“


Senden einer Nachricht von MetaTrader 5 an eine Telegram-Gruppe

Der nächste Schritt besteht darin, zu lernen, wie man Nachrichten an eine Telegram-Gruppe statt an einen Telegram-Bot sendet, und der Prozess ist ähnlich, aber ein wenig anders für Gruppen als für Bots. 

Klicken Sie auf das Profilsymbol der Gruppe, nachdem Sie eine Telegram-Gruppe erstellt haben.

Abbildung 13. Gruppe verwalten

Navigieren Sie in den angezeigten Optionen zu „Manage Group“ und klicken Sie auf „Administrators“.

Abbildung 14. Administrator

Klicken Sie auf „Add Administrator“ und suchen Sie in der Suchleiste nach dem Telegram-Bot, den Sie zuvor mit seinem Nutzernamen erstellt haben (z. B. @MQL5APTtest_bot).

Abbildung 15. Administrator hinzufügen

Nachdem Sie Ihren Bot ausgewählt haben, erteilen Sie ihm die erforderlichen Berechtigungen für den Betrieb in der Gruppe.

Abbildung 16. Berechtigungen

Gehen Sie zurück zu Ihrer Telegram-Gruppe und senden Sie eine Nachricht.

Abbildung 16. Nachricht senden

Gehen Sie zurück zu Ihrem Browser und öffnen Sie den Telegram API-Link erneut:

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

Eine JSON-Antwort mit Informationen über die Nachricht, die Sie soeben an die Gruppe gesendet haben, wird nach dem erneuten Laden der Website angezeigt. Die chat_id Ihrer Telegram-Gruppe finden Sie im Chat-Bereich dieser Antwort. Um Nachrichten direkt an diese Gruppe zu senden, müssen Sie diese chat_id in Ihrem MetaTrader 5 Code verwenden.

Abbildung 18. Gruppen-ID

Sie können jetzt die Chat-ID Ihrer Telegram-Gruppe in Ihrem MQL5-Code verwenden, da Sie sie abrufen konnten. Jede Nachricht oder Benachrichtigung, die Sie von MetaTrader 5 aus senden, wird nun direkt an diese bestimmte Telegram-Gruppe weitergeleitet, da Ihr Programm dank dieser Konversations-ID den genauen Standort der Nachrichten bestimmen kann.

Beispiel:
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);
  }

Ausgabe:

Abbildung 19. MT5 zu Telegram

Erläuterung:

Wir haben eine String-Variable deklariert, um die Gruppenchat-ID zu speichern. Verwenden Sie jedoch group_chatID, wenn Sie möchten, dass die Nachricht an Ihre Telegram-Gruppe zugestellt wird.

Außerdem haben wir die Zeile Print(CharArrayToString(res)); verwendet, um die Antwort des Servers zu erhalten. In dieser Antwort sind wichtige Informationen enthalten, insbesondere die message_id der übermittelten Nachricht. Im folgenden Abschnitt erfahren Sie, wie Sie die Meldung direkt im MetaTrader 5 ändern oder entfernen können; daher wird diese Meldungskennung sehr hilfreich sein.

Löschen einer Nachricht mit der Funktion WebRequest()

Eine Löschanfrage kann mit der Funktion WebRequest() direkt an den Telegram-Server gesendet werden. Bots können Nachrichten aus Gruppen entfernen, solange Sie die Nachrichten-ID der Nachricht kennen, die Sie entfernen möchten. Der Bot kann sowohl Nachrichten in der Gruppe als auch die von ihm gesendeten Nachrichten entfernen, da er ein Administrator ist (abhängig von den Rechten, die Sie ihm zuvor gegeben haben).

Aus diesem Grund war es wichtig, dass wir die Ergebnisse früher gedruckt haben. Wir erinnern uns, dass die Antwort des Servers an uns folgendermaßen aussah:  

{
  "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!"
  }
}

Aus dieser Antwort können Sie ersehen, dass Telegram hilfreiche Daten, wie die message_id, zurückgibt. Dank dieser ID können Sie die Funktion WebRequest verwenden, um die betreffende Nachricht später zu ändern oder zu entfernen.

Sie erhalten die Nachrichten-ID nur dann, wenn die Nachricht vom EA gesendet wurde. Wenn die Nachricht manuell von Ihnen an die Gruppe gesendet wurde, müssen Sie unter „https://api.telegram.org/bot<IhrBotToken>/getUpdates“ nach der Nachricht suchen und ihre ID kopieren. 

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

Beispiel:

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);
  }

Erläuterung:

Die Option POST ist ausgewählt. Die API von Telegram erfordert POST zum Löschen von Nachrichten, obwohl es so aussehen könnte, als sollte DELETE verwendet werden. Mit POST weisen Sie MQL5 an, Daten im Request Body an den Server zu übertragen. Betrachten Sie POST als das Senden eines Briefes mit Anweisungen an den Telegram-Server. Sie müssen die Nachricht immer noch in einem Brief verfassen und abschicken, auch wenn der Befehl lautet, sie zu löschen.

Die Nachricht, die Sie entfernen möchten, wird durch ihre MessageID identifiziert. Telegram weist jeder Nachricht, die von einem Menschen oder einem Bot in einem Chat gesendet wird, eine eindeutige Nachrichten-ID zu. Mit dieser ID können Sie den Telegram-Server anweisen, welche Nachricht er entfernen soll. Diese Nachrichten-ID wird häufig aus der Antwort des Servers auf eine gesendete Nachricht gewonnen.

Um den vollständigen Endpunkt für das Entfernen von Nachrichten zu erstellen, besteht die URL aus mehreren Komponenten. Die API-Adresse von Telegram ist die Basis-URL. Die Anfrage kommt von einem Bot, was durch die Bot-Komponente angezeigt wird. Der spezielle Authentifizierungsschlüssel für Ihren Bot wird als Bot-Token bezeichnet. Wenn Sie schließlich deleteMessage einfügen, weiß der Server, dass Sie etwas löschen möchten. In Kombination geben diese URLs den genauen Ort an, an den Sie Ihren Löschungsantrag senden müssen.

Die Chat- und Nachrichten-IDs sind im Text der Anfrage enthalten. Telegram wird durch die Nachrichten-ID darüber informiert, welche bestimmte Nachricht entfernt werden soll und durch die Chat-ID, zu welchem Chat oder welcher Gruppe die Nachricht gehört. Der Befehl, den Sie dem Server geben, ist grundsätzlich in diesem Body enthalten.

Bearbeiten der Nachricht mit der Funktion WebRequest()

Die Verwendung der Funktion WebRequest() zur Änderung einer Nachricht ist das letzte Thema unserer Diskussion. Sie sollten sich darüber im Klaren sein, dass Sie beim Bearbeiten nur Nachrichten ändern können, die von Ihrem Bot gesendet wurden. Der Bot kann keine Nachrichten ändern, die von anderen Nutzern direkt an die Gruppe gesendet wurden.

Das Versenden oder Entfernen einer Nachricht funktioniert ähnlich wie das Bearbeiten. Außerdem verwenden wir sowohl das Bot-Token als auch die Nachrichten-ID.

Die POST-Methode, der entsprechende URL-Endpunkt für die Nachrichtenbearbeitung und ein Textkörper mit der Chat-ID, der Nachrichten-ID und dem aktualisierten Text, den Sie senden möchten, sind erforderlich, wenn Sie die Funktion WebRequest() verwenden. Dadurch bleibt die Nachrichten-ID konstant, während Ihre MetaTrader 5 Software die Nachricht dynamisch aktualisieren kann.

Beispiel:

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);
  }

Erläuterung:

Der neue Nachrichtentext, den Sie senden möchten, wird zuerst definiert. Die ursprüngliche Nachricht in der Telegram-Gruppe oder im Chat wird durch dieses Material ersetzt. Die URL wird dann durch Verschmelzen des Endpunkts /editMessageText, Ihres Bot-Tokens und der Basis-URL der Telegram-API erstellt. Telegram wird von diesem Endpunkt insbesondere darüber informiert, dass die Anfrage beabsichtigt, eine bestehende Nachricht zu ändern. Als Nächstes folgt die Erstellung des Textes der Anfrage. Die Nachrichten-ID gibt an, welche bestimmte Nachricht geändert werden soll, die Chat-ID gibt an, zu welcher Unterhaltung oder Gruppe die Nachricht gehört, und der zusätzliche Text, den Sie in der Nachricht haben möchten, ist darin enthalten. Letztendlich wird aus der Hauptzeichenkette ein Zeichenfeld erstellt. Dies ist erforderlich, weil die WebRequest-Methode den Nachrichtentext in einem Zeichenarray-Format benötigt, um ihn über das Internet zu übermitteln.

 

Schlussfolgerung

In diesem Artikel haben Sie die Grundlagen der Verwendung der Funktion WebRequest() und der APIs von MQL5 kennen gelernt. In einem praktischen Projekt haben wir untersucht, wie MetaTrader 5 mit einer externen Plattform wie Telegram interagieren kann. Sie haben gelernt, wie man Nachrichten direkt vom MetaTrader 5 aus sendet, bearbeitet oder entfernt, Chat- und Gruppen-IDs abruft und einen Telegram-Bot erstellt. Um Ihnen ein besseres Verständnis für die praktische API-Integration zu vermitteln, werden wir in den kommenden Artikeln einen Schritt weiter gehen und lernen, wie man Daten von externen APIs akzeptiert und verarbeitet.

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/17774

Die Komponenten View und Controller für Tabellen im MQL5 MVC-Paradigma: Veränderbare Elemente Die Komponenten View und Controller für Tabellen im MQL5 MVC-Paradigma: Veränderbare Elemente
In diesem Artikel werden wir die Funktionalität der Größenänderung von Steuerelementen durch Ziehen der Kanten und Ecken des Elements mit der Maus hinzufügen.
Die View- und Controller-Komponenten für Tabellen im MQL5 MVC-Paradigma: Einfache Steuerung Die View- und Controller-Komponenten für Tabellen im MQL5 MVC-Paradigma: Einfache Steuerung
Der Artikel behandelt einfache Steuerelemente als Komponenten von komplexeren grafischen Elementen der View-Komponente im Rahmen der Tabellenimplementierung im MVC-Paradigma (Model-View-Controller). Die Grundfunktionalität des Controllers ist für die Interaktion der Elemente mit dem Nutzer und untereinander implementiert. Dies ist der zweite Artikel über die Komponente View und der vierte in einer Reihe von Artikeln über die Erstellung von Tabellen für das MetaTrader 5 Client Terminal.
Entwicklung von Trendhandelsstrategien mit maschinellem Lernen Entwicklung von Trendhandelsstrategien mit maschinellem Lernen
In dieser Studie wird eine neuartige Methodik für die Entwicklung von Trendfolgestrategien vorgestellt. In diesem Abschnitt wird der Prozess der Annotation von Trainingsdaten und deren Verwendung zum Training von Klassifikatoren beschrieben. Dieser Prozess führt zu voll funktionsfähigen Handelssystemen, die für den MetaTrader 5 entwickelt wurden.
Entwicklung eines Expertenberaters für mehrere Währungen (Teil 24): Hinzufügen einer neuen Strategie (II) Entwicklung eines Expertenberaters für mehrere Währungen (Teil 24): Hinzufügen einer neuen Strategie (II)
In diesem Artikel werden wir die neue Strategie mit dem erstellten automatischen Optimierungssystem verbinden. Schauen wir uns an, welche Änderungen am EA für die Erstellung des Optimierungsprojekts sowie an den EAs der zweiten und dritten Stufe vorgenommen werden müssen.