Connexus入门(第一部分):如何使用WebRequest函数?·综合运用
(3/3)·从鉴权到大数据响应,手把手把前三篇的坑全填平,EA直连外网不再卡壳
「用 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。
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 这类回显服务验证字节一致性。
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 验证再上实盘。
"{"key1":"value1","key2":"value2"}"