Connexus入门(第一部分):如何使用WebRequest函数?·综合运用
🔌

Connexus入门(第一部分):如何使用WebRequest函数?·综合运用

(3/3)·从鉴权到大数据响应,手把手把前三篇的坑全填平,EA直连外网不再卡壳

新手友好 第 3/3 篇
很多新手以为 WebRequest 写完就能跑,结果卡在 header 和 JSON 格式化上整晚调不通。其实把鉴权和异常先抽象出来,后面接任何 API 都只是填参数。本篇把前面挖的坑一次性填平。

「用 WebRequest 往外部接口推 JSON _body」

在 MT5 里用 WebRequest 做 POST,最容易被卡住的地方不是函数本身,而是 body 的 char 数组构造。上面这段 OnInit 里的写法,先把 JSON 字符串用 StringToCharArray 转成 UTF8 的 char 数组,再 ArrayRemove 掉末尾的 null 终止符,否则服务端可能把那个 0x00 也当数据收进去。 注意一个实测细节:字符串 "{\"key1\":\"value1\",\"key2\":\"value2\"}" 的 StringLen 返回 33,但 httpbin 回显的 Content-Length 头是 34——差值来自转数组时若没删终止符就会多带一个字节,所以 ArrayRemove(data, ArraySize(data)-1) 这步不能省。 超时参数设 5000 毫秒,意味着网络抖动超过 5 秒 WebRequest 会直接返回错误码,外汇或贵金属行情接口在高波动时段延迟可能突增,这类外部调用务必加失败分支处理。把代码挂到 WINV24 的 M1 图表,终端日志会打出 Status code 和 Response,能立刻看到 httpbin 回显的 headers 里包含 User-Agent 为 MetaTrader 5 Terminal/5.4476 及你的出口 IP。

MQL5 / C++
class="type">int OnInit()
  {
class=class="str">"cmt">//--- Defining variables
   class="type">class="kw">string method = "POST";                      class=class="str">"cmt">// HTTP verb in class="type">class="kw">string (GET, POST, etc...)
   class="type">class="kw">string url = "https:class=class="str">"cmt">//httpbin.org/post";     // Destination URL
   class="type">class="kw">string headers = "Content-Type: application/json";class=class="str">"cmt">// Request header
   class="type">int timeout = class="num">5000;                          class=class="str">"cmt">// Maximum waiting time class="num">5 seconds
   class="type">char data[];                                 class=class="str">"cmt">// Data we will send(body) array of type class="type">char
   class="type">char result[];                               class=class="str">"cmt">// Data received as an array of type class="type">char
   class="type">class="kw">string result_headers;                       class=class="str">"cmt">// String with response headers
class=class="str">"cmt">//--- Tratando body
   class="type">class="kw">string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
   StringToCharArray(body,data,class="num">0,WHOLE_ARRAY,CP_UTF8);
   ArrayRemove(data,ArraySize(data)-class="num">1);
   Print("Body: ",body);
   Print("Body Size: ",StringLen(body));
   ArrayPrint(data);
   Print("Array Size: ",ArraySize(data));
class=class="str">"cmt">//--- Calling the function and getting the status_code
   class="type">int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers);

class=class="str">"cmt">//--- Print the data
   Print("Status code: ",status_code);
   Print("Response: ",CharArrayToString(result)); class=class="str">"cmt">// We use CharArrayToString to display the response in class="type">class="kw">string form.

class=class="str">"cmt">//---
   class="kw">return(INIT_SUCCEEDED);
  }

POST 报文的字节级回显

在 MT5 终端里用 WebRequest 向 httpbin.org/post 发 JSON,控制台第一行打印的是原始字节流:123 34 107 101 121 49 34 58 34 118 97 108 117 101 49 34 44 34 107 101 121 50 34 58 34 118 97 108 117 101 50 34 125,这串十进制正是 {"key1":"value1","key2":"value2"} 的 ASCII 编码,数组长度 33 字节与 Content-Length 头完全对得上。 返回状态 200 时,服务端把请求原样塞进 json 字段,确认 MT5 的 application/json 投递没有被终端篡改。注意 User-Agent 暴露了具体构建号 5.4476 与 Windows 11 内核版本 22631,若你的 EA 要过风控网关,这部分头信息可能触发白名单校验。 外汇与贵金属行情接口调用属高风险操作,任何外部请求失败都可能让策略漏单,建议在正式品种上跑之前先用 httpbin 这类回显服务验证字节一致性。

MQL5 / C++
WebRequest(WINV24,M1)  class="num">123 class="num">34 class="num">107 class="num">101 class="num">121 class="num">49 class="num">34 class="num">58 class="num">34 class="num">118 class="num">97 class="num">108 class="num">117 class="num">101 class="num">49 class="num">34 class="num">44 class="num">34 class="num">107 class="num">101 class="num">121 class="num">50 class="num">34 class="num">58 class="num">34 class="num">118 class="num">97 class="num">108 class="num">117 class="num">101 class="num">50 class="num">34 class="num">125
WebRequest(WINV24,M1)  Array Size: class="num">33
WebRequest(WINV24,M1)  Status code: class="num">200
WebRequest(WINV24,M1)  Resposta: {
WebRequest(WINV24,M1)    "args": {},
WebRequest(WINV24,M1)    "data": "{\"key1\":\"value1\",\"key2\":\"value2\"}",
WebRequest(WINV24,M1)    "files": {},
WebRequest(WINV24,M1)    "form": {},
WebRequest(WINV24,M1)    "headers": {
WebRequest(WINV24,M1)      "Accept": "*/*",
WebRequest(WINV24,M1)      "Accept-Encoding": "gzip, deflate",
WebRequest(WINV24,M1)      "Accept-Language": "pt,en;q=class="num">0.5",
WebRequest(WINV24,M1)      "Content-Length": "class="num">33",
WebRequest(WINV24,M1)      "Content-Type": "application/json",
WebRequest(WINV24,M1)      "Host": "httpbin.org",
WebRequest(WINV24,M1)      "User-Agent": "MetaTrader class="num">5 Terminal/class="num">5.4476 (Windows NT class="num">11.0.class="num">22631; x64)",
WebRequest(WINV24,M1)      "X-Amzn-Trace-Id": "Root=class="num">1-66d9c017-5985f48331dba63439d8192d"
WebRequest(WINV24,M1)    },
WebRequest(WINV24,M1)    "json": {
WebRequest(WINV24,M1)      "key1": "value1",
WebRequest(WINV24,M1)      "key2": "value2"
WebRequest(WINV24,M1)    },
WebRequest(WINV24,M1)    "origin": "class="num">200.103.class="num">20.126",
WebRequest(WINV24,M1)    "url": "https:class=class="str">"cmt">//httpbin.org/post"
WebRequest(WINV24,M1)  }
WebRequest(WINV24,M1)  

◍ 别急着下结论

把 WebRequest 跑通只是和外部世界握手的第一步。用 httpbin.org 做 GET、POST 联调时,请求能抵达服务端不代表载荷一定到位——有用户在实盘测 POST 发现参数没进服务器,作者回帖点明要把数据塞进请求正文并用新版库才稳。 MT5 里想接外部报价别硬捆 EA:评论区有人用 CustomRatesUpdate 配服务后台刷历史,实时走 websocket,绕开经纪商也能自取数据源。WebRequest 更适合低频历史补数或发指令,高频行情它并不是最优解。 附带的 "{\"key1\":\"value1\",\"key2\":\"value2\"}" 就是 POST 正文里最朴素的 JSON 样例,复制进你的发送缓冲区就能复现文里的回显。外汇与贵金属接入外部系统存在断连、延迟与解析错乱的高风险,先在策略测试器里用演示 URL 验证再上实盘。

MQL5 / C++
"{"key1":"value1","key2":"value2"}" 
让小布替你跑这套联调
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到请求耗时与失败码,把重复劳动交给小布,你专注决策逻辑。

常见问题

原生函数要求每次手动拼 header 和签名,Connexus 在库内统一托管凭证与刷新逻辑,调用层只传业务参数,降低出错概率。
可以,小布盯盘的品种页内置了请求诊断视图,能列出近期 WebRequest 的响应码与延迟,便于快速定位是网络还是服务端问题。
倾向采用分块接收与异步解析,Connexus 在综合运用篇给出了缓冲封装示例,把大响应拆成队列处理,概率上减少超时。
主要落在多层嵌套时的引号与换行,库内用统一序列化规避,开发者不必手写转义,外汇贵金属外接行情注意高风险。