文章 "如何采用 MQL5 创建用于 Telegram 的 bots" - 页 6 12345678910111213...55 新评论 Marco vd Heijden 2017.07.26 01:29 #51 这些错误非常清楚,与它们的说明完全一致。编译器会警告你无法找到包含文件。包含文件中包含了丢失的函数,这就是产生额外错误的原因。你必须确保文件文件夹中存在 telegram.mqh 文件。 从这里开始,因为还有更多错误似乎与其他代码问题有关。 Franky Frentiono Nangoy 2017.08.16 05:53 #52 是否可以用自定义指标 代替专家顾问? Andriy Voitenko 2017.08.16 06:54 #53 Franky Frentiono Nangoy:是否可以从自定义指标 而不是专家顾问中调用?如果您尝试从指标调用函数WebRequest,GetLastError() 将返回错误 4014 - "函数不允许调用"。为此,您需要重新制作项目,以便 从指标调用 Wininet.dll。 Documentation on MQL5: Common Functions / WebRequest www.mql5.com Common Functions / WebRequest - Reference on algorithmic/automated trading language for MetaTrader 5 Franky Frentiono Nangoy 2017.08.16 07:33 #54 Andrey Voytenko:如果尝试从指标调用函数WebRequest,GetLastError() 将返回错误 4014 - "函数不允许调用"。为此,您需要重新制作项目,以便 从指标调用Wininet.dll。谢谢,我们会看看的 Marco vd Heijden 2017.09.29 21:18 #55 看 <Telegram.mqh>{ "ok":true, "result":[ { "update_id":349778698, "message":{ "message_id":2, "from":{ "id":198289825, "first_name":"Andriy", "last_name":"Voitenko", "username":"avaticks" }, "chat":{ "id":198289825, "first_name":"Andriy", "last_name":"Voitenko", "username":"avaticks", "type":"private" }, "date":1459775817, "text":"\/start" } } ] } Andriy Voitenko 2017.09.29 21:36 #56 Aimak:如果您能帮我找出错误,我将不胜感激。不胜感激。将您的频道切换到公开模式。或者使用 chatID(而不是频道名称)与您的私人频道进行交流。 Andriy Voitenko 2017.09.30 07:19 #57 Aimak: 该频道是公共频道,我使用频道名称或 ID 得到了相同的结果。请看截图您使用的是 Telegram.mqh 和 Jason.mqh 的最新版本吗? MarcoLombardo 2017.11.03 18:51 #58 亲爱的安德烈非常感谢你的工作。我安装了您的文件,并配置了一个专家,其功能如下:1)专家每隔 x 分钟向机器人发送信息(仅用于测试)、2)我在 telegram 上阅读消息,然后点击 telegram 客户端键盘上的 "open trade(打开交易)"、3)metatrader 打开交易(如果可能)。一切都很正常,但过了一会儿,机器人就再也联系不上了;为了让它重新工作,我必须按键盘菜单上的某些命令(例如图表或/start或账户信息....)来唤醒它。metatrader 会说 "bad request:chat not found(请求错误:找不到聊天)",但如果我再次唤醒机器人,它就会正常工作一个多小时,然后就停止了。我按照您的建议(使用 botFather)创建了机器人。我该如何解决这个问题?再次感谢 附加的文件: error.gif 26 kb Andrey Emelyanov 2017.11.22 07:05 #59 感谢您提供有趣的文章。代码中有一个错误(从截图中可以看到):需要修复 CCustomBot 类的 SendPhoto 方法。我建议使用此选项: int SendPhoto(const string _channel_name, const string _local_path, string &_photo_id, const string _caption=NULL, const bool _common_flag=false, const int _timeout=10000) { //--- // 常长 _chat_id //--- if(m_token==NULL) return(ERR_TOKEN_ISEMPTY); string name=StringTrim(_channel_name); if(StringGetCharacter(name,0)!='@') name="@"+name; ResetLastError(); //--- 将文件复制到内存缓冲区 if(!FileIsExist(_local_path,_common_flag)) return(ERR_FILE_NOT_EXIST); //--- int flags=FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ; if(_common_flag) flags|=FILE_COMMON; //--- int file=FileOpen(_local_path,flags); if(file<0) return(_LastError); //--- int file_size=(int)FileSize(file); uchar photo[]; ArrayResize(photo,file_size); FileReadArray(file,photo,0,file_size); FileClose(file); //--- 创建边界:(数据 -> base64 -> 1024 字节 -> md5) uchar base64[]; uchar key[]; CryptEncode(CRYPT_BASE64,photo,key,base64); //--- uchar temp[1024]={0}; ArrayCopy(temp,base64,0,0,1024); //--- uchar md5[]; CryptEncode(CRYPT_HASH_MD5,temp,key,md5); //--- string hash=NULL; int total=ArraySize(md5); for(int i=0;i<total;i++) hash+=StringFormat("%02X",md5[i]); hash=StringSubstr(hash,0,16); //--- //--- WebRequest uchar result[]; string result_headers; string url=StringFormat("%s/bot%s/sendPhoto",TELEGRAM_BASE_URL,m_token); string part1="Content-Type: multipart/form-data; boundary="+hash+"\r\n"; part1+="\r\n"; //--- 添加 chart_id part1+="--"+hash+"\r\n"; part1+="Content-Disposition: form-data; name=\"chat_id\"\r\n"; part1+="\r\n"; part1+=name; //IntegerToString(_chat_id); part1+="\r\n"; //--- 添加标题 if(_caption!=NULL) { part1+="--"+hash+"\r\n"; part1+="Content-Disposition: form-data; name=\"caption\"\r\n"; //part1+="Content-Type: text/plain\r\n"; //part1+="Content-Transfer-Encoding: quoted-printable\r\n"; part1+="\r\n"; //part1+=UrlEncode(_caption); part1+=_caption; part1+="\r\n"; } //--- 添加图像 part1+="--"+hash+"\r\n"; part1+="Content-Disposition: form-data; name=\"photo\"; filename=\"lampash.gif\"\r\n"; part1+="\r\n"; //--- 1 uchar array1[]; int size1=StringLen(part1); StringToCharArray(part1,array1,0,size1); //--- 2 //photo int size2=ArraySize(photo); //--- string part3="\r\n--"+hash+"--\r\n"; int size3=StringLen(part3); uchar array3[]; StringToCharArray(part3,array3,0,size3); //--- uchar data[]; ArrayResize(data,size1+size2+size3); ArrayCopy(data,array1,0); ArrayCopy(data,photo,size1); ArrayCopy(data,array3,size1+size2); //--- string headers="Content-Type: multipart/form-data; boundary="+hash+"\r\n"; int res=WebRequest("POST",url,headers,_timeout,data,result,result_headers); if(res==200)//确定 { //--- 删除 BOM int start_index=0; int size=ArraySize(result); for(int i=0; i<fmin(size,8); i++) { if(result[i]==0xef || result[i]==0xbb || result[i]==0xbf) start_index=i+1; else break; } //--- string out=CharArrayToString(result,start_index,WHOLE_ARRAY,CP_UTF8); //--- 解析结果 CJAVal js(NULL,jtUNDEF); bool done=js.Deserialize(out); if(!done) return(ERR_JSON_PARSING); //--- 获取错误描述 bool ok=js["ok"].ToBool(); if(!ok) return(ERR_JSON_NOT_OK); total=ArraySize(js["result"]["photo"].m_e); for(int i=0; i<total; i++) { CJAVal image=js["result"]["photo"].m_e[i]; long image_size=image["file_size"].ToInt(); if(image_size<=file_size) _photo_id=image["file_id"].ToStr(); } return(0); } else { if(res==-1) { string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8); //Print(out); return(_LastError); } else { if(res>=100 && res<=511) { string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8); //Print(out); return(ERR_HTTP_ERROR_FIRST+res); } return(res); } } //--- return(0); } Andriy Voitenko 2017.11.23 00:22 #60 Andrey Emelyanov:感谢您提供有趣的文章。代码中有一个错误(从截图中可以看到):需要修复 CCustomBot 类的 SendPhoto 方法。我建议使用此选项:感谢您的留言。不过,您更正后的变体仅适用于拉丁字符。从逻辑上讲,您应该将字符串 转换为 UTF-8 编码数组,并将其替换为请求正文中的标题。我的变体在附件中。 附加的文件: Telegram.mqh 64 kb 12345678910111213...55 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这些错误非常清楚,与它们的说明完全一致。
编译器会警告你无法找到包含文件。
包含文件中包含了丢失的函数,这就是产生额外错误的原因。
你必须确保文件文件夹中存在 telegram.mqh 文件。
从这里开始,因为还有更多错误似乎与其他代码问题有关。是否可以用自定义指标 代替专家顾问?
是否可以从自定义指标 而不是专家顾问中调用?
如果您尝试从指标调用函数WebRequest,GetLastError() 将返回错误 4014 - "函数不允许调用"。
为此,您需要重新制作项目,以便 从指标调用 Wininet.dll。
如果尝试从指标调用函数WebRequest,GetLastError() 将返回错误 4014 - "函数不允许调用"。
为此,您需要重新制作项目,以便 从指标调用Wininet.dll。
谢谢,我们会看看的
看
Aimak:
如果您能帮我找出错误,我将不胜感激。不胜感激。
将您的频道切换到公开模式。或者使用 chatID(而不是频道名称)与您的私人频道进行交流。
该频道是公共频道,我使用频道名称或 ID 得到了相同的结果。请看截图
您使用的是 Telegram.mqh 和 Jason.mqh 的最新版本吗?
亲爱的安德烈
非常感谢你的工作。我安装了您的文件,并配置了一个专家,其功能如下:
1)专家每隔 x 分钟向机器人发送信息(仅用于测试)、
2)我在 telegram 上阅读消息,然后点击 telegram 客户端键盘上的 "open trade(打开交易)"、
3)metatrader 打开交易(如果可能)。
一切都很正常,但过了一会儿,机器人就再也联系不上了;为了让它重新工作,我必须按键盘菜单上的某些命令(例如图表或/start或账户信息....)来唤醒它。metatrader 会说 "bad request:chat not found(请求错误:找不到聊天)",但如果我再次唤醒机器人,它就会正常工作一个多小时,然后就停止了。
我按照您的建议(使用 botFather)创建了机器人。我该如何解决这个问题?
再次感谢
感谢您提供有趣的文章。代码中有一个错误(从截图中可以看到):
需要修复 CCustomBot 类的 SendPhoto 方法。我建议使用此选项:
感谢您提供有趣的文章。代码中有一个错误(从截图中可以看到):
需要修复 CCustomBot 类的 SendPhoto 方法。我建议使用此选项:
感谢您的留言。不过,您更正后的变体仅适用于拉丁字符。
从逻辑上讲,您应该将字符串 转换为 UTF-8 编码数组,并将其替换为请求正文中的标题。
我的变体在附件中。