Обсуждение статьи "Создание бота для Telegram на языке MQL5" - страница 52

 
Lorentzos Roussos #:

Когда я отвечал, кода не было, но я вижу, что вы можете заменить bot.SendMessage функцией, которая добавляет сообщение в список burst. Вы также можете продолжать увеличивать сообщение и отправлять его из цикла, но в этом случае вы столкнетесь с ограничениями по количеству символов.

Краткая схема может быть такой:

  1. У вас есть массив строк под названием "Outbox".
  2. Временной интервал, в течение которого вы обрабатываете Outbox, так что "OnTimer()" (вы можете уже использовать его, если вы читаете из telegram).
  3. Затем вы сами устанавливаете миллисекунды между каждым сообщением не с помощью функции Sleep(), а запоминая, когда было отправлено последнее сообщение.
  4. Вы можете использовать GetTickCount() для опроса миллисекунд, и вы будете хранить последние мс, которые оставило сообщение, и вычитать их из текущих мс, чтобы получить расстояние во времени. Есть очень очень очень редкий случай, когда время окончания < времени начала, в этом случае вы делаете так: (UINT_MAX-start_time+end_time)
  5. Если расстояние в миллисекундах с момента последнего сообщения больше, чем установленный вами лимит в миллисекундах, то вы отправляете следующее сообщение из папки "Исходящие".
  6. Вместо вызова bot.SendMessage в цикле вы теперь вызываете Outbox.add_message_for_sending или что-то в этом роде.
  7. С модификацией, которая также хранит идентификаторы чатов, вы также могли бы хранить, куда отправляется сообщение, и это было бы решением для нескольких пользователей.

Спасибо за ответ. Я попробую ваш способ.

 
Привет, приятель. Отличная статья. Это хорошо работает для каналов и групп, и мне нужно сделать бота администратором. Но что, если я хочу отправить его в личный чат Telegram, как я могу добавить бота в личный чат? Возможно ли это или нужно отправлять сообщения в канал?
Что вы думаете?
 
lbgraf #:
Здравствуйте!
Спасибо огромное за такую работу!!!!
подскажи пожалуйста, а как можно менять шрифт, фон, цвет текста?
Спасибо

Например для жирного шрифта надо включить HTML отправку в Telegram.mqh

const bool    _as_HTML=true

И потом отправить текст в теге <b>

 
Herman Makmur #:

Неважно....

Я нашел ответ, установив флаг AsHTML в true...

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

Извините...


Здравствуйте, не могли бы вы поделиться кодом, как это сделать? Я также ищу код, чтобы сделать текст полужирным и курсивом и отправить на сервер telegram.

 
Здравствуйте Andriy Voitenko, немножко переделал  код  функции  SendScreenShot()  так как  bot.SendPhoto(_chat_id,filename,screen_id,_symbol+"_"+StringSubstr(EnumToString(_period),7)) не соответствует входным параметрам ни одной из моделей функции  SendPhoto()  в файле  <Telegram.mqh>, при отправке файла .gif получаю ошибку 400 что то не срабатывает именно в одной из функций  SendPhoto() (использую вторую модель функции из трех представленных в файле  <Telegram.mqh>  655 строчка) не могли бы Вы по возможности обновить код чтоб оно заработало?    
Andriy Voitenko #:

Роман, если вам бот нужен только для отправки скриншотов, то можно сделать так:

1. Узнайте у бота @MyTelegramID_bot‌ номер вашего чата.

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

#include <Telegram.mqh>
//+------------------------------------------------------------------+
//|   Input parameters                                               |
//+------------------------------------------------------------------+
input ENUM_LANGUAGES    InpLanguage=LANGUAGE_EN;//Language
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);

//--- updates chart
   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);

      //--- waitng 30 sec for save screenshot
      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);
  }

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

Привет всем,

Я пытаюсь отправить сообщение из MT5 в Telegram с помощью бота. Однако я не смог отправить сообщение из MT5 в Telegram из-за ошибки: Код ошибки 400 Описание "Плохой запрос: чат не найден".

Кто-нибудь сталкивался с такой же проблемой? Можете ли вы назвать причины, по которым могла возникнуть эта ошибка?

Я провел много исследований в интернете, но не смог получить правильных ответов.

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

MT5 to Telegram Error: Код ошибки 400 Описание "Плохой запрос: чат не найден"

Cerilo Cabacoy, 2023.11.21 18:14

Сэр, спасибо за ваш ответ. Ниже приведен полный исходный код. Это простой советник, который извлекает данные из текстового файла, а затем пытается отправить их в Telegram-канал. Однако он столкнулся с указанной ошибкой.

#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.
 

Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий

Добавление эмодзи в сообщения telegram.

Frédéric LEBRE, 2023.12.04 13:56

Здравствуйте,

Пожалуйста, не могли бы вы мне помочь.

Я пытаюсь отправить сообщение в telegram с помощью emoji.

Когда emoji unicode, например, U+2702, я использую в качестве строкового значения " \x2702 " и если работает.

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

Но когда юникод такой : U+1F648 ничего не работает.

Я включил <Telegram.mqh>, как я читал в темах, но я не знаю, как сделать больше.

Спасибо за ответы.

 
Благодарю за крутую библиотеку! Однако есть вопрос. Не нашел метод отправки сообщения именно пользователю. Пытаюсь сделать так чтобы когда советник нашел сигнал, оповестил меня напрямую. Не хочется делать группу
 
Roboboy18 #:
Благодарю за крутую библиотеку! Однако есть вопрос. Не нашел метод отправки сообщения именно пользователю. Пытаюсь сделать так чтобы когда советник нашел сигнал, оповестил меня напрямую. Не хочется делать группу

Нашел как делать, кому интересно спрашивайте )

 
Roboboy18 #:

Нашел как делать, кому интересно спрашивайте )

Можно просто взять, и написать. Чтобы другим не было надобности искать Вас и спрашивать.