文章 "如何采用 MQL5 创建用于 Telegram 的 bots" - 页 51

 
Valeriy Yastremskiy #:

是的,我不明白,我也不知道,我也不能用名字发送给机器人,只能用 ID 发送。如何发送给自己?或者说,你怎么在购物车里找到自己的 ID?我只能发给机器人。

我可以通过 "获取我的 ID "机器人获取任何 ID

 
Andrey Kaunov #:

我通过 "获取我的身份证 "机器人获取任何身份证。

是的,我把我的 ID 和机器人搞混了。我们通过自己的机器人向自己发送私人信息))))。

摘自安德烈的文章

需要注意的是,在这些例子中,我们将聊天 ID 作为消息的收件人。在用户开始与机器人聊天之前,我们无法提前知道他/她的收信人。此外,我们也无法通过用户的手机号码或 @ 用户名联系到他/她。这样做显然是出于安全考虑,以免机器人发送垃圾邮件。但是机器人可以通过第二个发送消息选项,用用户名在频道上发布消息。

[删除]  

您好、

我想在搜索文件中添加一种新的语言,但我不明白这些十六进制参数的含义:

TLanguage languages[6]=
{
   {"English","\xF1EC\xF1E7","en"},
   {"Русский","\xF1F7\xF1FA","ru"},
   {"中文",    "\xF1E8\xF1F3","zh"},
   {"西班牙语","\xF1EA\xF1F8","es"},
   {"Deutsch","\xF1E9\xF1EA","de"},
   {"日本語",   "\xF1EF\xF1F5","ja"}
};

例如,英语中的 \xF1EC\xF1E7 是什么意思?

 

上周我遇到了一些故障--从 Telegram 读取消息队列的功能停止工作了。也就是说,发送出去的信息,包括文本和截图,都会像以前一样发送,但 GetUpdates() 函数却什么也不返回,聊天队列 总是空的。

有人遇到过这种故障吗?原因是什么?

 
您好!
非常感谢你的这种工作!!!!
请问如何更改字体、背景和文字颜色?
谢谢
 
lbgraf #:
您好!
非常感谢你的这种工作!!!!
请问如何更改字体、背景和文字颜色?
谢谢

Telegram API 文档中描述了所有标签。

 

你们好、

我已经完成了从电报向 mt5 发送信息的代码,但我遇到了一个小错误,在同时发送多个关闭命令时,只能发送一个订单,而不能发送多个订单。

谁能帮我看看我哪里出错了?

//--- 现在处理平仓清单
   max_time = 0;
   double day_profit = 0;
   bool is_closed = false;
   int totalhis = hist_position.PositionsTotal();
   for(int i = 0; i < totalhis; i++) {
      //---
      pos_symbol = PositionGetSymbol(i); // 获取符号名称
      digits = (int)SymbolInfoInteger(pos_symbol, SYMBOL_DIGITS); // 获取价格的位数
      //--- 根据关闭位置在列表中的索引选择该位置
      if(hist_position.SelectByIndex(i)) {
         ulong    ticket            = hist_position.Ticket();
         datetime time_open         = hist_position.TimeOpen();
         ulong    time_open_msc     = hist_position.TimeOpenMsc();
         datetime time_close        = hist_position.TimeClose();
         ulong    time_close_msc    = hist_position.TimeCloseMsc();
         long     type              = hist_position.PositionType();
         string   type_desc         = hist_position.TypeDescription();
         long     magic             = hist_position.Magic();
         long     pos_id            = hist_position.Identifier();
         double   volume            = hist_position.Volume();
         double   price_open        = hist_position.PriceOpen();
         double   price_sl          = hist_position.StopLoss();
         double   price_tp          = hist_position.TakeProfit();
         double   price_close       = hist_position.PriceClose();
         double   commission        = hist_position.Commission();
         double   swap              = hist_position.Swap();
         double   profit            = hist_position.Profit();
         string   symbol            = hist_position.Symbol();
         string   open_comment      = hist_position.OpenComment();
         string   close_comment     = hist_position.CloseComment();
         string   open_reason_desc  = hist_position.OpenReasonDescription();
         string   close_reason_desc = hist_position.CloseReasonDescription();
         string   deal_tickets      = hist_position.DealTickets(",");
         //---
         int      deals_count       = HistoryDealsTotal();   // 所选位置的
         int      orders_count      = HistoryOrdersTotal();  // 所选位置的
         
         if(TimeToString(TimeCurrent(), TIME_DATE) == TimeToString(time_close, TIME_DATE)) {
            day_profit += profit + swap + commission;
         }
         if(time_close <= _closed_last_time) continue;
         //is_closed = true;
         string msg = StringFormat
                      (
                         "ACCOUNT: { #%s } \n" +
                         "------------ { CLOSE } -----------\n" +
                         "CLOSE ORDER - %s %s\n" +
                         "Time (GTM+0): %s\n" +
                         "------------ { CLOSE } -----------\n" +
                         "Volume: %s\n" +
                         "Open Price: %s\n" +
                         "Close Price: %s\n" +
                         "Gain/Loss: %s USD\n" +
                         "---TOTAL PROFIT TODAY---\n" +
                         "%s USD\n",
                         IntegerToString(login),
                         symbol,
                         PositionTypeToString(type),
                         TimeToString(time_close, TIME_DATE | TIME_SECONDS),
                         DoubleToString(volume, 2),
                         DoubleToString(price_open, digits),
                         DoubleToString(price_close, digits),
                         DoubleToString(profit, 2),
                         DoubleToString(day_profit, 2)
                      );
         
         int res = bot.SendMessage(InpChannelName, msg);
         if(res != 0)
            Print("Error: ", GetErrorDescription(res));
         max_time = MathMax(max_time, time_close);
      }
      _closed_last_time = MathMax(max_time, _closed_last_time);
   }
 
Bui Huy Dat #:

你们好

我已经完成了从电报向 mt5 发送信息的代码,但我遇到了一个小错误,当同时发送多个平仓命令时,只能发送一个订单,而不能发送多个订单。

谁能帮我看看我哪里出错了?

版主删除了格式 不当的代码@Bui Huy Dat 编辑 您的帖子,并在插入代码时使用CODE 按钮

如果您通过机器人为许多用户提供服务,我认为每秒有 30 次交互的限制。

 
Lorentzos Roussos #:

如果您通过机器人为许多用户提供服务,我想每秒的交互次数限制为 30 次。


,但同时打开或关闭命令时,它只能向电报发送一条信息。

 
Bui Huy Dat #:

我个人只用它来将每个 mt5 账户发送到电报。
,但同时打开或关闭命令时,它只能向电报发送一条信息。

我回复时还没有代码,我看到您可以用一个将消息添加到突发列表的函数来替换 bot.SendMessage 。您也可以不断增加信息并将其从循环中发送出去,但这样会遇到字符限制。

一个简单的示意图可以是这样的

  1. 您有一个名为 "发件箱 "的字符串数组
  2. 处理发件箱的时间间隔,所以要使用 "OnTimer()"(如果您也从电报中读取信息,可能已经在使用它了)
  3. 然后,您可以不使用 Sleep() 函数,而是通过记住上一条信息的发送时间,来自行限制每条信息之间的毫秒间隔。
  4. 您可以使用 GetTickCount() 函数来轮询毫秒数,并存储信息离开的最后毫秒数,然后从当前毫秒数中减去该毫秒数,得到时间距离。
  5. 如果距离上一条消息的毫秒数大于您设定的毫秒数限制,则从发件箱发送下一条消息。
  6. 你现在不再在循环中调用 bot.SendMessage 而是调用 Outbox.add_message_for_sending 或其他。
  7. 如果修改后还能存储聊天 ID,就能存储消息的去向,这样就能解决多个用户的问题。