Discussão do artigo "Como criar bots para Telegram em MQL5" - página 52

 
Lorentzos Roussos #:

Não havia nenhum código quando respondi, mas vejo que você pode substituir o bot.SendMessage por uma função que adiciona a mensagem a uma lista de explosões. Você também poderia continuar a aumentar a mensagem e enviá-la para fora do loop, mas isso limitaria o número de caracteres.

Um breve esquema poderia ser o seguinte:

  1. Você tem uma matriz de strings chamada "Caixa de saída"
  2. Um intervalo de tempo dentro do qual você processa a Caixa de saída, portanto, "OnTimer()" (você já deve estar usando isso se também estiver lendo o telegrama)
  3. Em seguida, você impõe a si mesmo um limite de milissegundos entre cada mensagem, não com a função Sleep(), mas lembrando-se de quando a última mensagem foi enviada
  4. Você pode usar GetTickCount() para pesquisar milissegundos e armazenar o último ms que a mensagem deixou e subtraí-lo do ms atual para obter a distância em tempo. Há uma ocasião muito, muito, muito rara em que a hora de término é menor do que a hora de início e, nesse caso, você faz o seguinte: (UINT_MAX-start_time+end_time)
  5. Se a distância em milissegundos desde a última mensagem for maior do que o limite em milissegundos que você impôs, você enviará a próxima mensagem da Caixa de saída
  6. Em vez de chamar bot.SendMessage no loop, você agora chama Outbox.add_message_for_sending ou algo assim.
  7. Com uma modificação que também armazena os IDs de bate-papo, você também poderia armazenar para onde a mensagem está indo, e essa seria a solução para vários usuários.

Obrigado por sua resposta, vou tentar sua solução

 
Olá, amigo. Ótimo artigo. Ele funciona bem para canais e grupos e eu tenho que tornar o bot um administrador. Mas e se eu quiser enviá-lo para um bate-papo pessoal do Telegram, como posso adicionar o bot a um bate-papo pessoal? Isso é possível ou devo enviar as mensagens para um canal?
O que você acha?
 
lbgraf #:
Olá!
Muito obrigado por esse tipo de trabalho!!!!
Você poderia me dizer como alterar a fonte, o plano de fundo e a cor do texto?
Muito obrigado

Por exemplo, para a fonte em negrito, você precisa ativar o envio de HTML no Telegram.mqh.

const bool    _as_HTML=true

E, em seguida, enviar o texto na tag <b>.

 
Herman Makmur #:

Não importa....

Encontrei a resposta definindo o sinalizador AsHTML como true...

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

Desculpe...


Olá, você pode compartilhar o código de como fazer isso? Também estou procurando o código para tornar o texto em negrito e em estilo itálico e enviá-lo ao servidor do telegrama.

 
Olá Andriy Voitenko, modifiqueiligeiramente o código da função SendScreenShot() como bot.SendPhoto(_chat_id,filename,screen_id,_symbol+"_"+StringSubstr(EnumToString(_period),7)) não corresponde aos parâmetros de entrada de nenhum dos modelos da função SendPhoto() no <Telegram .mqh>, ao enviar um arquivo .gif, recebo o erro 400 informando que algo não funciona exatamente em uma das funções SendPhoto() (uso o segundo modelo de função dos três apresentados no arquivo <Telegram.mqh> , linha 655). Você poderia atualizar o código para fazê-lo funcionar?
.
Andriy Voitenko #:

Roman, se você precisar do bot apenas para enviar capturas de tela, pode fazer isso dessa forma:

1. Peça ao @MyTelegramID_bot seu número de bate-papo.

2. Escreva um bot simples que verifique se há novos itens e envie fotos para o bate-papo com o ID especificado. Um exemplo é:

#include <Telegram.mqh>
//+------------------------------------------------------------------+
//| Parâmetros de entrada|
//+------------------------------------------------------------------+
input ENUM_LANGUAGES    InpLanguage=LANGUAGE_EN;//Língua
input string            InpToken="";//Token
input long              ChatId=0;   / ID do bate-papo
//---
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);

//--- atualizar gráfico
   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);

      //--- aguardando 30 segundos para salvar a captura de tela
      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);
  }

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

Olá a todos,

Estou tentando enviar uma mensagem do MT5 para o Telegram usando um bot. No entanto, não consegui enviar a mensagem do MT5 para o Telegram devido ao erro: Código de erro 400 Descrição "Solicitação incorreta: chat não encontrado"

Alguém encontrou o mesmo problema? Você pode dar alguns motivos pelos quais esse erro pode ter ocorrido?

Fiz muitas pesquisas on-line, mas não consegui obter as respostas certas.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Erro do MT5 para o Telegram: Código de erro 400 Descrição "Solicitação incorreta: chat não encontrado"

Cerilo Cabacoy, 2023.11.21 18:14

Senhor, obrigado por sua resposta. Abaixo está o código-fonte completo. É apenas um consultor especialista simples que extrai dados de um arquivo de texto e, em seguida, tenta enviar os dados para um canal do Telegram. No entanto, ele encontrou o erro mencionado.

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

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Adicionando emoji em mensagens de telegrama.

Frédéric LEBRE, 2023.12.04 13:56

Olá,

Por favor, poderia me ajudar?

Estou tentando enviar uma mensagem para o telegrama usando emoji.

Quando o unicode do emoji é, por exemplo, U+2702, uso como valor de string " \x2702 " e funciona.

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

Mas quando o unicode é assim : U+1F648 nada funciona.

Incluí o <Telegram.mqh> como li nos tópicos, mas não sei como fazer mais.

Obrigado por suas respostas.

 
Obrigado pela biblioteca bacana! No entanto, há uma dúvida. Não encontrei um método para enviar uma mensagem ao usuário. Estou tentando fazer com que, quando o Expert Advisor encontrar um sinal, ele me notifique diretamente. Não quero criar um grupo
 
Roboboy18 enviar uma mensagem ao usuário. Estou tentando fazer com que, quando o Expert Advisor encontrar um sinal, ele me notifique diretamente. Não quero criar um grupo

Descobri como fazer isso; se alguém estiver interessado, pergunte-me).

 
Roboboy18 #:

Descobri como fazer isso, quem estiver interessado pode perguntar)

Você poderia simplesmente escrever. Assim, os outros não precisarão procurá-lo e perguntar.