記事"MQL5言語でのTelegram用ボットの作成"についてのディスカッション - ページ 52

 
Lorentzos Roussos #:

返信したときにはコードがなかったのですが、bot.SendMessageをバーストリストにメッセージを追加する関数に置き換えることができることがわかりました。また、メッセージを成長させ続けてループの外に送信することもできますが、そこでは文字数の制限にぶつかります。

簡単な回路図はこんな感じ:

  1. Outbox" という文字列配列がある。
  2. Outboxを処理する時間間隔、つまり "OnTimer()"(テレグラムから読み取る場合は、すでに使っているかもしれません)。
  3. そして、Sleep()関数を使うのではなく、最後にメッセージが送信された時刻を記憶することで、各メッセージの間隔をミリ秒に制限します。
  4. ミリ秒のポーリングにはGetTickCount()を使うことができ、メッセージが送信された最後のミリ秒を保存し、現在のミリ秒からそれを引くことで時間的な距離を得ることができる。
  5. 最後のメッセージからのミリ秒単位での距離が、あなたが強制したミリ秒単位での制限より大きい場合、送信トレイから次のメッセージを送信します。
  6. ループ内でbot.SendMessageを呼び出す代わりに、Outbox.add_message_for_sendingか何かを呼び出します。
  7. チャットIDも保存するように変更すれば、メッセージの送信先も保存でき、複数ユーザーのための解決策になります。

お返事ありがとうございます。

 
こんにちは。素晴らしい記事だ。ボットを管理者にする必要があります。しかし、個人的なテレグラムチャットにボットを送りたい場合、どのようにすれば個人的なチャットにボットを追加できますか?それともチャンネルにメッセージを送らなければならないのでしょうか?
どう思いますか?
 
lbgraf #:
こんにちは!
このような仕事を本当にありがとうございます!
フォント、背景、文字色の変更方法を教えてください。
ありがとうございます。

例えば、太字フォントを使用するには、Telegram.mqhでHTML送信を有効にする必要があります。

const bool    _as_HTML=true

そして<b>タグでテキストを送信します。

 
Herman Makmur #:



AsHTMLフラグをtrueに設定することで答えを見つけた。

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

すみません...


こんにちは、その方法をコードで教えてもらえますか?また、テキストを太字と斜体にし、電報サーバーに送信するコードも探しています。

 
こんにちは、 Andriy Voitenkoさん、 SendScreenShot() 関数の コードを botの ように少し修正 しました。 SendPhoto(_chat_id,filename,screen_id,_symbol+"_"+StringSubstr(EnumToString(_period),7))は 、<Telegram .mqh>のSendPhoto() 関数のどのモデルの入力パラメータとも一致しません 。.gifファイルを送信すると、SendPhoto()関数の 1つ<Telegram.mqh> ファイル655行に提示されている3つの関数モデルのうち、2番目の関数モデルを使用しています )で何かが正確に動作していないというエラー400が発生します。
それが動作するようにコードを更新してもらえますか?
Andriy Voitenko #:

Romanさん、スクリーンショットを送信するためだけにボットが必要な場合は、このようにすることができます:

1.MyTelegramID_botにチャット番号を尋ねてください。

2.新しいアイテムをチェックし、指定されたIDのチャットに写真を送信する簡単なボットを書いてください。例としては

#include <Telegram.mqh>
//+------------------------------------------------------------------+
//| 入力パラメータ|
//+------------------------------------------------------------------+
input ENUM_LANGUAGES    InpLanguage=LANGUAGE_EN;//言語
input string            InpToken="";//トークン
input long              ChatId=0;   //チャット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);

//--- チャートの更新
   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秒待つ
      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にメッセージを送信しようとしています。しかし、エラーコード 400 説明 "Bad request: chat not found" のため、MT5からTelegramにメッセージを送信できませんでした。

同じ問題に遭遇した方はいらっしゃいますか?このエラーが発生した理由を教えてください。

私はオンラインで多くの研究をしましたが、私は正しい答えを得ることができませんでした。

取引、自動取引システム、取引戦略のテストに関するフォーラム

MT5からTelegramへのエラー:エラーコード 400 説明 "不正なリクエスト:チャットが見つかりません"

セリロ・カバコイ, 2023.11.21 18:14

ご返信ありがとうございます。以下はソースコードです。テキストファイルからデータを抽出し、そのデータをテレグラムチャンネルに送信しようとする単純なエキスパートアドバイザーです。しかし、前述のエラーが発生しました。

#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.
削除済み  

取引、自動取引システム、取引戦略のテストに関するフォーラム

テレグラム・メッセージに絵文字を追加

Frédéric LEBRE, 2023.12.04 13:56

こんにちは、

助けてください。

絵文字を使ってテレグラムにメッセージを送ろうとしています。

絵文字のunicodeが例えばU+2702の場合、文字列の値として" ˶x2702" を使うとうまくいきます。

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

しかし、unicodeがこのように :U+1F648では何も動作しません。

トピックで読んだように<Telegram.mqh>をインクルードしましたが、それ以上の方法がわかりません。

ご回答ありがとうございました。

 
クールなライブラリをありがとう!しかし、疑問があります。ユーザーにメッセージを 送る方法が見つかりません。Expert Advisorがシグナルを発見したときに、私に直接通知されるようにしようとしています。グループを作りたくありません。
 
Roboboy18 メッセージを 送る方法が見つかりません。私はExpert Advisorがシグナルを見つけたときに、私に直接通知するようにしようとしています。グループを作りたくありません。

私はそれを行う方法を見つけた、誰かが興味を持っている場合は、私に聞いてください)。

 
Roboboy18 #:

やり方がわかったので、興味のある人は聞いてね )

書き留めておけばいい。そうすれば、他の人があなたを探して尋ねる必要がなくなる。