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

 
Nicholas Martins:

感谢您分享此代码!

我有一个小问题,我的一个经纪商在一些符号上使用了小写字母,如 EURUSDm、GBPUSDm、XAUUSDm......。

你有没有试过只发送不带 m

或者用

#include <Telegram.mqh>
input sring InpChannel;
input string InpToken;
void OnStart()
    {
        bot.Token(InpToken);
        string msg = "This currency pair/symbol is called: "+Symbol();
        bot.sendmessage(InpChannel, msg);
    }
 
Roman Zhitnik:

最有可能的错误原因是 Telegram apiche被俄罗斯国家通讯社封锁了。我也遇到过同样的问题。试试 VPN 就可以了

谢谢你,罗曼!

 


//--- 输入参数
输入字符串 InpChannelName="";//通道名
输入字符串 InpToken="";//Token

//--- 全局变量
CCustomBot bot;
int macd_handle;
datetime time_signal=0;
bool checked;
//+------------------------------------------------------------------+
// 专家初始化函数
//+------------------------------------------------------------------+
int OnInit()
{
time_signal=0;

bot.Token(InpToken);

#ifdef __MQL5__
macd_handle=iMACD(NULL,0,12,26,9,PRICE_CLOSE);
if(macd_handle==INVALID_HANDLE)
{
Print("Invalid iMACD handle");
return(INIT_FAILED);
}
//--- 将指标添加到图表中
int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
ChartIndicatorAdd(0,total,macd_handle);
#endif

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
// 专家去初始化函数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(reason==REASON_PARAMETERS |||)
reason==REASON_RECOMPILE |||
reason==REASON_ACCOUNT)
{
checked=false;
}

//--- 删除指标
#ifdef __MQL5__
int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
for(int int subwin=total-1; subwin>=0; subwin--)
{
int amount=ChartIndicatorsTotal(0,subwin);
for(int i=amount-1; i>=0; i--)
{
string name=ChartIndicatorName(0,subwin,i);
if(StringFind(name, "MACD",0)==0)
ChartIndicatorDelete(0,subwin,name);
}
}
#endif
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
/*
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_KEYDOWN &&
lparam=='Q')
{
bot.SendMessage(InpChannelName,"/\x2611");
bot.SendMessage(InpChannelName,"\x2705\x2705\x2705");
}
}
*/
//+------------------------------------------------------------------+
//| 专家勾选功能
//+------------------------------------------------------------------+
void OnTick()
{

if(!checked)
{
if(StringLen(InpChannelName)==0)
{
Print("Error: Channel name is empty");
Sleep(10000);
返回;
}

int result=bot.GetMe();
if(result==0)
{
Print("Bot name: ",bot.Name());
checked=true;
}
否则
{
Print("Error: ",GetErrorDescription(result));
Sleep(10000);
返回;
}
}

//--- 获取时间
datetime time[1];
if(CopyTime(NULL,0,0,1,time)!=1)
返回;

//--- 检查每个条形图上的信号
if(time_signal!=time[0])
{
//--- 首次计算
if(time_signal==0)
{
time_signal=time[0];
返回;
}

double macd[2]={};
double signal[2]={};

#ifdef __MQL4__
for(int i=0;i<=1;i++)
{
macd[i] = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
signal[i]= iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
}
#endif

#ifdef __MQL5__
if(CopyBuffer(macd_handle,0,1,2,macd)!=2)
返回;
if(CopyBuffer(macd_handle,1,1,2,signal)!=2)
return; if(CopyBuffer(macd_handle,1,1,2,signal)!
#endif

time_signal=time[0];

//--- 发送信号 BUY
if(macd[1]>signal[1] &&
macd[0]<=signal[0] &&
macd[0]<0.0)
{
string msg=StringFormat("Name: MACD Signal\xF4E3\nSymbol: %s\nTimeframe: %s\nType: Buy\nPrice: %s\nTime: %s"、
_Symbol、
StringSubstr(EnumToString((ENUM_TIMEFRAMES)_Period),7)、
DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits)、
TimeToString(time[0]));
int res=bot.SendMessage(InpChannelName,msg);
if(res!=0)
Print("Error: ",GetErrorDescription(res));
}

//--- 发送卖出信号
if(macd[1]<signal[1] &&
macd[0]>=signal[0] &&
macd[0]>0.0)
{
string msg=StringFormat("Name: MACD Signal\xF4E3\nSymbol: %s\nTimeframe: %s\nType: Sell\nPrice: %s\nTime: %s"、
_Symbol、
StringSubstr(EnumToString((ENUM_TIMEFRAMES)_Period),7)、
DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits)、
TimeToString(time[0]));
int res=bot.SendMessage(InpChannelName,msg);
if(res!=0)
Print("Error: ",GetErrorDescription(res));
}
}
}
//+------------------------------------------------------------------+

指标名称(MACD 彩色柱状图),问题是如何用该指标生成信号。

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д...
 
Andrey Voytenko:

感谢您的积极反馈。但WebRequest() 函数无法在策略测试器中执行。


亲爱的安德烈

感谢您的精彩文章!

既然WebRequest() 函数 无法在策略测试器中使用,那么是否有办法在执行策略测试器时通过机器人接收通知?

谢谢

 
Jefferson Metha:

您是否尝试过只发送不带 m

或者用

//+------------------------------------------------------------------+
string CTelebot::TradeSymbol(string txt)
  {
   string symbol;
   if(SymbolFind(txt))
     {
      symbol = txt;
      return symbol;
     }
   if(SymbolFind(txt + suffix))
     {
      symbol = txt + suffix;
      return symbol;
     }
   if(SymbolFind(GetSymbolDescription(txt)))
      return GetSymbolDescription(txt);
   else
      // symbol = SymbolGet(txt);
      symbol = "EMPTY";
   return symbol;
  }
//--------------------------------------------------+



我有个小问题 伙计们 如何使用 chat.m_id 获取频道/群组名称?

 
Andrey Voytenko:

请修改第 117 行:

亲爱的安德烈

您的工作令人印象深刻!工作也做得很好


对于 Telegram_Bot_EA,我有 1 个问题和 1 个疑问

1.我在 mt4 上收到这条信息,原因是什么?您能提供解决方案吗?

0 08:25:24.546 Telegram_Bot_EA mt4 GBPUSD,H1:Screenshot file 'NZDUSD60.gif' not created.

2.我必须在哪里更改 Telegram 按钮的字体大小?- 我想让文字小一点。


提前感谢您的帮助!

 

@Deyan Ivanov

我也有这个问题,这是我为 MT4 修正的代码。编辑文件 "Telegram_Bot_EA.mq4",替换方法 "int SendScreenShot(...)"

//+------------------------------------------------------------------+
   int               SendScreenShot(const long _chat_id,
                                    const string _symbol,
                                    const ENUM_TIMEFRAMES _period,
                                    const string _template=NULL)
     {

	......................

      Sleep(50);

      bool resultShot = ChartScreenShot(chart_id,filename,2560,1200,ALIGN_RIGHT);
      ChartClose(chart_id);
      if(resultShot)
        {
         Sleep(500);

         bot.SendChatAction(_chat_id,ACTION_UPLOAD_PHOTO);

         //---
         if(FileIsExist(filename))
           {
            string screen_id;
            result=bot.SendPhoto(photo_id,_chat_id,filename,_symbol+"_"+StringSubstr(EnumToString(_period),7));
           }
         else
           {
            string mask=m_lang==LANGUAGE_EN?"Screenshot file '%s' not created.":"Файл скриншота '%s' не создан.";
            PrintFormat(mask,filename);
           }

        }


      
....................
     }
 
你好,安德烈。您能帮我一下吗--有办法发送关于完成交易的信息吗?
 
volohovnp:
你好,安德烈。能否请您帮帮我--有什么方法可以发送关于在有/无利润的情况下结束交易的消息?
我在每笔交易中都会发送评论,然后发送信息,说明交易品种、订单类型、评论以及我希望执行的操作。

例如
关闭
买入欧元兑美元
交易 #23


平仓 0.21 手或平仓 50
<其他参数,我将根据订单 更改>
 
你好,我们的请求功能 需要很多时间,最好使用套接字,我试过了,但无法转换,有人能帮忙将 webreq 更改为套接字吗?