Diskussion zum Artikel "Die Erstellung des Bots für Telegram in der Sprache MQL5" - Seite 52

 
Lorentzos Roussos #:

Es gab keinen Code, als ich antwortete, ich sehe, dass Sie die bot.SendMessage mit einer Funktion ersetzen können, die die Nachricht zu einer Burst-Liste hinzufügt. Man könnte auch die Nachricht weiter wachsen lassen und sie aus der Schleife heraus senden, aber man würde dort auf Zeichenbeschränkungen stoßen.

Ein kurzes Schema könnte wie folgt aussehen:

  1. Sie haben ein String-Array namens "Postausgang".
  2. Ein Zeitintervall, in dem Sie die Outbox verarbeiten, also "OnTimer()" (Sie verwenden es vielleicht schon, wenn Sie auch aus Telegramm lesen)
  3. Sie erzwingen dann selbst eine Millisekundengrenze zwischen den einzelnen Nachrichten, nicht mit der Funktion Sleep(), sondern indem Sie sich merken, wann die letzte Nachricht gesendet wurde
  4. Sie können GetTickCount() für die Abfrage von Millisekunden verwenden, und Sie würden die letzten ms, die die Nachricht verlassen hat, speichern und von den aktuellen ms abziehen, um den zeitlichen Abstand zu erhalten, wobei es sehr, sehr selten vorkommt, dass die Endzeit < der Startzeit ist, in diesem Fall machen Sie folgendes: (UINT_MAX-start_time+end_time)
  5. Wenn der Abstand in Millisekunden seit der letzten Nachricht größer ist als das Limit in Millisekunden, dann wird die nächste Nachricht aus der Outbox gesendet
  6. Anstatt bot.SendMessage in der Schleife aufzurufen, rufen Sie nun Outbox.add_message_for_sending oder ähnliches auf.
  7. Mit einer Änderung, die auch die Chat-IDs speichert, könnte man auch speichern, wohin die Nachricht geht, und das wäre die Lösung für mehrere Benutzer.

Vielen Dank für Ihre Antwort, ich werde Ihren Weg ausprobieren.

 
Hallo Kumpel. Toller Artikel. Es funktioniert gut für Kanäle und Gruppen und ich muss den Bot zu einem Admin machen. Aber was ist, wenn ich ihn an einen persönlichen Telegram-Chat senden möchte, wie kann ich den Bot zu einem persönlichen Chat hinzufügen? Ist das möglich oder muss ich die Nachrichten an einen Kanal senden?
Was meint ihr dazu?
 
lbgraf #:
Hallo!
Vielen Dank für diese Art von Arbeit!!!!
Könnten Sie mir bitte sagen, wie ich Schriftart, Hintergrund und Textfarbe ändern kann?
Danke

Zum Beispiel für fette Schrift müssen Sie das Senden von HTML in Telegram.mqh aktivieren.

const bool    _as_HTML=true

Und dann Text im <b>-Tag senden.

 
Herman Makmur #:

Macht nichts....

Ich habe die Antwort gefunden, indem ich das AsHTML-Flag auf true gesetzt habe...

bot.SendMessage(InpTelegramId,"<b>Balance: $10056.21</b>",true);

Sorry...


Hallo, können Sie den Code teilen, wie man das macht? Ich bin auch auf der Suche nach dem Code, um den Text fett und kursiv zu machen und an den Telegrammserver zu senden.

 
Hallo Andriy Voitenko, ich habeden Code der Funktion SendScreenShot() als Bot leicht geändert .SendPhoto(_chat_id,filename,screen_id,_symbol+"_"+StringSubstr(EnumToString(_period),7)) stimmt nicht mit den Eingabeparametern einer der SendPhoto() Funktionsmodelle in der <Telegram .mqh>, erhalte ich beim Senden einer .gif-Datei die Fehlermeldung 400, dass etwas in einer der SendPhoto()-Funktionen nicht genau funktioniert (ich verwende das zweite der drei Funktionsmodelle in der Datei <Telegram.mqh> , Zeile 655). Könnten Sie bitte den Code aktualisieren, damit er funktioniert?
.
Andriy Voitenko #:

Roman, wenn Sie den Bot nur zum Senden von Screenshots benötigen, können Sie es so machen:

1. Fragen Sie den @MyTelegramID_bot nach Ihrer Chat-Nummer.

2. Schreiben Sie einen einfachen Bot, der nach neuen Artikeln sucht und Bilder an den Chat mit der angegebenen ID sendet. Ein Beispiel ist:

#include <Telegram.mqh>
//+------------------------------------------------------------------+
//| Eingabeparameter|
//+------------------------------------------------------------------+
input ENUM_LANGUAGES    InpLanguage=LANGUAGE_EN;//Sprache
input string            InpToken="";//Token
input long              ChatId=0;   //Chat-ID
//---
CCustomBot bot;
int pos_count;
//+------------------------------------------------------------------+
int OnInit()
  {
   bot.Token(InpToken);
   int res=bot.GetMe();
   if(res!=0)
     {
      Print(GetErrorDescription(res));
     }
   pos_count=PositionCount(_Symbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   int pos_count_new=PositionCount(_Symbol);
   if(pos_count_new>pos_count)
     {
      pos_count=pos_count_new;
      int result=SendScreenShot(ChatId,_Symbol,0,NULL);
      if(result!=0)
         Print(GetErrorDescription(result,InpLanguage));
     }
  }
//+------------------------------------------------------------------+
int PositionCount(const string _symbol)
  {
   int count=0;
   int orders_total=OrdersTotal();
   for(int i=0; i<orders_total; i++)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         PrintError(ERR_ORDER_SELECT);
         return(-1);
        }
      //---
      if(_symbol==NULL || OrderSymbol()==_symbol)
         count++;
     }
//---
   return(count);
  }
//+------------------------------------------------------------------+
int SendScreenShot(const long _chat_id,
                   const string _symbol,
                   const ENUM_TIMEFRAMES _period,
                   const string _template=NULL)
  {
   int result=0;

   long chart_id=ChartOpen(_symbol,_period);
   if(chart_id==0)
      return(ERR_CHART_NOT_FOUND);

   ChartSetInteger(ChartID(),CHART_BRING_TO_TOP,true);

//--- Diagramm aktualisieren
   int wait=60;
   while(--wait>0)
     {
      if(SeriesInfoInteger(_symbol,_period,SERIES_SYNCHRONIZED))
         break;
      Sleep(500);
     }

   if(_template!=NULL)
      if(!ChartApplyTemplate(chart_id,_template))
         PrintError(_LastError,InpLanguage);

   ChartRedraw(chart_id);
   Sleep(500);

   ChartSetInteger(chart_id,CHART_SHOW_GRID,false);

   ChartSetInteger(chart_id,CHART_SHOW_PERIOD_SEP,false);

   string filename=StringFormat("%s%d.gif",_symbol,_period);

   if(FileIsExist(filename))
      FileDelete(filename);
   ChartRedraw(chart_id);

   Sleep(100);

// if(ChartScreenShot(chart_id,filename,800,600,ALIGN_RIGHT))
   if(ChartScreenShot(chart_id,filename,1024,768,ALIGN_RIGHT))
     {
      Sleep(100);

      bot.SendChatAction(_chat_id,ACTION_UPLOAD_PHOTO);

      //--- 30 Sekunden warten, um Bildschirmfoto zu speichern
      wait=60;
      while(!FileIsExist(filename) && --wait>0)
         Sleep(500);

      //---
      string screen_id;
      result=bot.SendPhoto(_chat_id,filename,screen_id,_symbol+"_"+StringSubstr(EnumToString(_period),7));
     }

   ChartClose(chart_id);
   return(result);
  }

//+------------------------------------------------------------------+
 

Hallo zusammen,

Ich versuche, eine Nachricht von MT5 zu Telegram mit einem Bot zu senden. Allerdings konnte ich die Nachricht nicht von MT5 an Telegram senden, weil der Fehler: Fehlercode 400 Beschreibung "Bad request: chat not found"

Ist jemand auf das gleiche Problem gestoßen? Können Sie einige Gründe nennen, warum dieser Fehler aufgetreten sein könnte?

Ich habe viel online recherchiert, aber ich konnte keine richtigen Antworten finden.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 zu Telegram Fehler: Fehlercode 400 Beschreibung "Fehlerhafte Anfrage: Chat nicht gefunden"

Cerilo Cabacoy, 2023.11.21 18:14

Sir, vielen Dank für Ihre Antwort. Unten ist der vollständige Quellcode. Es handelt sich nur um einen einfachen Expert Advisor, der Daten aus einer Textdatei extrahiert und dann versucht, die Daten an einen Telegram-Kanal zu senden. Es ist jedoch der erwähnte Fehler aufgetreten.

#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Telegram.mqh>
CCustomBot tgbot;

input string TelegramBotToken = "6770842913:AAGcnR666ddL7hCB8HeTNs6HdNe28y3F-ik";
input string TelegramChatID = "-1002063516288";
input string TelegramAPIurl = "https://api.telegram.org";
input string namefile = "WagScores.txt";

datetime h1time = 0;
string channelname = "";
//+------------------------------------------------------------------+
int OnInit() {

   tgbot.Token(TelegramBotToken);
   int res = tgbot.GetMe();      Print("GetMe() results: "+(string)res);
   channelname = tgbot.Name();   Print("bot name: "+channelname);
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {

   
}
//+------------------------------------------------------------------+
void OnTick() {

   ChartRedraw();
   if(NewH1Bar()) {
      string data[];
      string output = "";
      GetTxtDataToArray(namefile,data); 
      string message = StringFormat("Time: %s\n",TimeToStr(TimeCurrent()));  
      StringAdd(output,message);   
      for(int i = 0; i < ArraySize(data); i++) {
         string strmsg = StringFormat("%s\n",data[i]);
         StringAdd(output,strmsg);     
      }     
      int res = tgbot.SendMessage(TelegramChatID,output);      Print((string)__LINE__+" "+(string)res);
      SendNotification(output);
   }
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool NewH1Bar() { 
     
   datetime newtime = iTime(Symbol(),PERIOD_H1,0);
   if(newtime==h1time) return false;
   h1time = newtime;                                
   return true;
}
//+------------------------------------------------------------------+ 
void GetTxtDataToArray(string filename,string &array[]) { 
             
   if(!FileIsExist(filename)) return;
   int handle = FileOpen(filename,FILE_TXT|FILE_READ|FILE_ANSI);
   if(handle==INVALID_HANDLE) { Print(""+__FUNCTION__+" "+(string)__LINE__+" opening file error"); return; }
   FileSeek(handle,0,SEEK_SET);
   while(!FileIsEnding(handle)) {
      string line = FileReadString(handle); 
      ArrayResize(array,ArraySize(array)+1);         
      array[ArraySize(array)-1] = line;
   }
   FileClose(handle);    
}

OOP in MQL5 by Example: Processing Warning and Error Codes
OOP in MQL5 by Example: Processing Warning and Error Codes
  • www.mql5.com
The article describes an example of creating a class for working with the trade server return codes and all the errors that occur during the MQL-program run. Read the article, and you will learn how to work with classes and objects in MQL5. At the same time, this is a convenient tool for handling errors; and you can further change this tool according to your specific needs.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Hinzufügen von Emoji in Telegram-Nachrichten.

Frédéric LEBRE, 2023.12.04 13:56

Hallo,

Könnten Sie mir bitte helfen.

Ich versuche, eine Nachricht an Telegram mit Emoji zu senden.

Wenn emoji unicode ist zum Beispiel: U+2702 ich als String-Wert " \x2702 " und wenn funktioniert.

SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId, "\x2702");

Aber wenn der Unicode wie folgt lautet : U+1F648 funktioniert nichts.

Ich habe <Telegram.mqh> eingefügt, wie ich in den Themen gelesen habe, aber ich weiß nicht, wie ich mehr tun kann.

Vielen Dank für Ihre Antworten.

 
Vielen Dank für die tolle Bibliothek! Allerdings gibt es eine Frage. Ich habe nicht gefunden, eine Methode, um eine Nachricht an den Benutzer zu senden. Ich versuche, es so zu machen, dass wenn der Expert Advisor ein Signal gefunden hat, mich direkt benachrichtigt. Ich will nicht eine Gruppe machen
 
Roboboy18 eine Nachricht an den Benutzer zu senden. Ich versuche, es so zu machen, dass wenn der Expert Advisor ein Signal gefunden hat, mich direkt benachrichtigt. Ich will nicht eine Gruppe machen

Ich fand, wie es zu tun, wenn jemand interessiert ist, bitte fragen Sie mich).

 
Roboboy18 #:

Ich habe herausgefunden, wie man das macht, wer Interesse hat, kann fragen)

Ihr könntet es einfach aufschreiben. So dass andere nicht nach Ihnen suchen und fragen müssen.