在您的 MQL 项目中使用 JSON 数据 API·进阶篇
🔌

在您的 MQL 项目中使用 JSON 数据 API·进阶篇

(2/3)· 只会读平台内数据的 EA 已不够用,本篇拆解如何把 AI 预测与基本面流式喂给交易系统

实战向 第 2/3 篇

不少交易者把 EA 困在 MT5 自带的报价和指标里,以为这就是全部市场真相。当债券收益率和散户仓位早已转向,策略却还在等均线交叉。把外部 API 接进来,不是炫技,是补上那块缺失的情报拼图。

◍ 用 WebRequest 把行情 API 拉进 MT5

MQL5 里真正能打通外部数据的入口是 WebRequest,它走标准 HTTP 协议,让你在 EA 或脚本里直接调第三方 REST 接口,不用绕 DLL。 下面这段示例用 GET 方法向一个示例 API 发请求,带 apikey 和两个参数,超时设成 2000 毫秒。注意它虽写在 MQL 语境里,但 WebRequest 的签名在 MQL5 同样适用,只是头文件与权限要在 MT5 的「EA 交易属性—依赖项」里勾选允许 WebRequest 的 URL。 代码先声明 cookie、headers、apikey 及参数变量,拼出完整 URL;ResetLastError 清空错误码后发请求。若返回 -1 说明底层调用失败,常见错误 4060 是 URL 未加入信任列表,5203 是 HTTP 层失败;返回 200 才代表服务端正常,此时用 CharArrayToString 按 UTF8 把字节数组转成可读 JSON 字符串。 实盘接外部信号前,先在脚本里把这段跑通:把 example.com 换成你自己的接口,看 Print 出来的 JSON 是否符合预期。外汇与贵金属波动剧烈,外部 API 延迟或断流都可能让信号滞后,接入后务必做超时与错误兜底。

MQL5 / C++
class=class="str">"cmt">// Required variables
class="type">class="kw">string cookie=NULL, headers="", apikey="your api key",
value1="value class="num">1", value2="value class="num">2";
class="type">char post[],result[];
class="type">int res;
class="type">class="kw">string URL  = "https:class=class="str">"cmt">//www.example.com/API?apikey="+apikey+"&data1=value1&data2="+value2; // Rest API address
ResetLastError(); class=class="str">"cmt">// Reset ast error
class=class="str">"cmt">// HTTP request via MQL Webrequest, GET method with apikey, value1, and value2 and class="num">2000 millisecond timeout 
res=WebRequest("GET", URL, cookie, NULL, class="num">2000, post, class="num">0, result, headers);
if(res==-class="num">1) class=class="str">"cmt">// WebRequest error handling
 {
    class="type">int error =  GetLastError();
    if(error==class="num">4060) Print("Webrequest Error ",error);
    else if(error==class="num">5203) Print("HTTP request failed!");
    else Print("Unknow HTTP request error("+class="type">class="kw">string(error)+")! ");
    LastHTTPError=error;
 }
else if (res==class="num">200) class=class="str">"cmt">// The HTTP class="num">200 status response code indicates that the request has succeeded
 {
    Print("HTTP request successful!");
    class=class="str">"cmt">// Use CharArrayToString to convert HTTP result array to a class="type">class="kw">string
    class="type">class="kw">string HTTP_Result = CharArrayToString(result, class="num">0, class="num">0, CP_UTF8); 
    Print(HTTP_Result);       
 }

用 Ziwox API 给 EA 加一层 AI 基本面过滤

Ziwox 终端的 AI 预测并非单一指标,而是汇总了新闻、经济日历、利率及变动、央行政策、市场情绪、货币强度、COT 与散户仓位等多源数据后给出的方向倾向。要在 MT5 里用它,得先通过他们的 Forex Data API 把 JSON 响应拉回来,落盘保存再做解析。 实际做法分四步:请求 API 拿到 JSON、写入本地文件、用 MQL5 解析字段、把预测方向接进 EA 逻辑。我们选的方案是用一条简单 MA 做技术信号,只有当 Ziwox 的 AI 预测方向与 MA 信号一致时才放行订单,相当于给趋势策略加了一道基本面滤网。 外汇与贵金属属高杠杆品种,这类 AI 预测仅代表概率倾向而非确定结论,实盘前务必在策略测试器里用历史数据验证过滤前后胜率与回撤的差异。

「拿到 Ziwox 数据接口的钥匙」

想在 MT5 里接 Ziwox 的外汇流动性数据,第一道关是先拿到 API 密钥。整个注册链路不复杂,但每一步都要走完,断在邮箱验证那一步的人不少。 先去 Ziwox 终端填注册表,勾完条款、过掉人机校验、点建号;系统会发一封验证邮件,不点开确认,后面登录进个人资料的 API 选项卡是灰的。 登录后进 profile 页面的 API 标签,点绿色 generate 按钮,串字符就出来了。这串密钥就是你后面 MQL5 脚本里 HttpRequest 的鉴权头,复制好别泄给别人——外汇数据接口滥用可能触发封号,且外接数据本身不消除交易高风险。

◍ 拆开 Ziwox 终端的 API 请求串

想让 MT5 自己拉外部数据,先得看清 Ziwox 终端给的接口长什么样。完整请求串是 https://ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&apikey={API_KEY}&apitype={REQUEST_TYPE}&pair={PAIR},四个变量卡死了返回内容。 {API_KEY} 就是上一篇里注册拿到的那串唯一密钥,直接明文拼进 URL;{REQUEST_TYPE} 决定响应体是 JSON 还是纯文本,写 EA 时建议选 JSON,方便 MQL5 里用 CJAVal 解析。 {PAIR} 只认中间不带任何前缀后缀的准格式,实测能用的包括 EURUSD、USDJPY、GBPUSD、XAUUSD、WTI 这类写法。外汇与贵金属波动剧烈、杠杆风险高,接口拿到的数据仅作辅助参考,不构成方向判断。

先在浏览器里验一下 API 回包

把第 2 步拼好的 Ziwox API 链接,按自己的参数改完,直接贴进浏览器地址栏回车,就能拿到一份样本响应。这一步不用写代码,目的只是确认链接结构和密钥有没有拼错。 如果参数都对,HTTP 响应会返回正常数据包;一旦 API 密钥不对,浏览器里会直接看到 {"status":"error","desc":"invalid api key"} 这段 JSON。 资产名写错也逃不掉校验,服务端会回 {"status":"error","desc":"invalid asset name!!"})。外汇与贵金属行情接口调用涉及实时杠杆数据,属于高风险场景,任何字段错配都可能让你拿到空包或误读信号,建议每次换品种前都先手动验一次回包。

「把 API 拉取嵌进 EA 的触发逻辑」

前面的步骤把鉴权链路打通后,真正在 MT5 里自动取数的核心就是一个 GetAPI 函数。它吃三个参数:symbolname(品种名)、apikey(密钥)、filename(落地文件名),把 apikey 和 pair 拼进 URL,用 WebRequest 发 GET,再把返回的 JSON 写进本地文件。 函数开头用 LastWebRequest 这个 datetime 变量卡失败重试节奏,避免被服务端防火墙按 IP 封掉。文件若不存在,或本地文件修改时间距当前超过 900 秒(15 分钟),才认为需要更新——这是卡第三方 API 调用频率的硬限制。 即便判定要更新,还额外要求 TimeLocal()-LastWebRequest>300,也就是失败重试至少隔 5 分钟。WebRequest 超时设 5000 毫秒,返回 -1 时按错误码分流:4060 提示 MT5 的 Expert 选项里没开 URL 白名单,5203 是具体品种请求失败,其余归为未知错误。返回 200 才把 result 转成 UTF8 字符串继续处理。 这套节奏直接决定了你 EA 在外汇或贵金属行情里补数据的实时性边界:最短 15 分钟一轮成功更新,失败态下最坏 5 分钟试探一次。贵金属隔夜跳空时若恰逢 API 限频,本地缓存可能滞后,交易决策需自行评估高风险。

MQL5 / C++
class="type">class="kw">datetime LastWebRequest = class="num">0; class=class="str">"cmt">// use this class="type">class="kw">datetime var for limit failed request API
class="type">bool GetAPI(class="type">class="kw">string symbolname, class="type">class="kw">string apikey, class="type">class="kw">string filename)
  {
   Print("Get API Update");
   class="type">bool NeedToUpdate =  class="kw">false;
   class=class="str">"cmt">// Check if the API data file available
   if(FileGetInteger(filename,FILE_EXISTS,true)>=class="num">0)
     {
      class=class="str">"cmt">// Check the latest update time from file modify date time
      if(TimeLocal()-(class="type">class="kw">datetime)FileGetInteger(filename,FILE_MODIFY_DATE,true)>class="num">900) class=class="str">"cmt">// update data every class="num">15 min becasue of API call rate limitation
        NeedToUpdate  = true;
     }
   else
      NeedToUpdate  = true;
   if(NeedToUpdate && TimeLocal()-LastWebRequest>class="num">300)  class=class="str">"cmt">// retry failed API request every class="num">5 min to avoid firewall IP block
     {
      class="type">class="kw">string  cookie=NULL,headers;
      class="type">char    post[],result[];
      class="type">int     res;
      class="type">class="kw">string  URL   = "https:class=class="str">"cmt">//www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&apikey="+apikey+"&apitype=json&pair="+symbolname;
      ResetLastError();
      class="type">int timeout=class="num">5000;
      res=WebRequest("GET", URL, cookie, NULL, timeout, post, class="num">0, result, headers);
      if(res==-class="num">1)
        {
         LastWebRequest     = TimeLocal();
         class="type">int error          = GetLastError();
         if(error==class="num">4060)
            Print("API data Webrequest Error ",error, " Check your webrequest on Metatrader Expert option.");
         else  if(error==class="num">5203)
             Print("HTTP request for "+symbolname+" Data failed!");
            else
             Print("Unknow HTTP request error("+"class="type">class="kw">string"(error)+")! "+symbolname+" Data");
         class="kw">return(class="kw">false);
        }
      else
       if(res==class="num">200)
         {
          LastWebRequest =  TimeLocal();
          class="type">class="kw">string HTTPString = CharArrayToString(result, class="num">0, class="num">0, CP_UTF8);
把多源拉取交给小布盯盘
这些跨源诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到情绪与偏差面板,你专注把信号写进 EA 逻辑。

常见问题

该服务支持主要和次要外汇货币对,也含债券收益率与 VIX 等跨资产字段,黄金多通过 XAUUSD 符号取数,具体以返回 JSON 的 symbol 列表为准。
小布盯盘侧重行情侧的多源情报呈现与预警,不直接替你编译 EA;但你能把它的面板结论作为离线参数手动注入策略,减少重复查 API 的功夫。
返回多为 UTF-8 的 JSON,用 CharArrayToString 配合 Encoding 参数转码,再按 key 取 sentiment 字段;注意部分节点是数组需循环。
倾向使用输入参数或加密配置文件传递,避免公开分享 mq5 时暴露;MT5 实盘环境也建议限制 IP 白名单。外汇贵金属杠杆高,密钥被盗可能被刷额度。