开发具有 RestAPI 集成的 MQL5 强化学习代理(第 1 部分):如何在 MQL5 中使用 RestAPI·综合运用
📘

开发具有 RestAPI 集成的 MQL5 强化学习代理(第 1 部分):如何在 MQL5 中使用 RestAPI·综合运用

第 3/3 篇

MT5 里直接拉 Coinbase 币种清单

想在 MT5 里把 Coinbase 的可用币种和最小交易精度一次性列出来,核心是用 WebRequest 打它的公开接口,5 秒超时足够覆盖大多数网络环境。 下面这段从 REST 封装库里摘出的逻辑,先拼好 url 和超时,再发 GET;返回码大于 0 才进解析分支,否则直接报无响应。 [CODE] string url = "https://api.coinbase.com/v2/currencies"; char headers[]; int timeout = 5000; int res; Print("Fetching list of available currencies from Coinbase API"); res = WebRequest("GET", url, NULL, NULL, timeout, data, 0, result, result_headers); string currencies = ""; if(res > 0) { Print("Response received from Coinbase API"); CJAVal jv; if(jv.Deserialize(result)) { // Considerando que a resposta é uma lista de moedas for(int i = 0; i < jv["data"].Size(); i++) { currencies += "Currency: " + jv["data"][i]["id"].ToStr(); currencies += ", Name: " + jv["data"][i]["name"].ToStr(); currencies += ", Min Size: " + jv["data"][i]["min_size"].ToStr(); currencies += "\n"; } Print(currencies); } else { Print("Error: Unable to parse the response."); } } else { Print("Error: No response from Coinbase API or an error occurred."); } return currencies; } [/CODE] 逐行看:url 写死为 v2/currencies 端点;timeout=5000 即 5 秒;res 接 WebRequest 返回值;res>0 才认为拿到响应。 CJAVal 是 JSON 解析对象,jv["data"].Size() 给出币种条数,循环里把 id、name、min_size 三个字段拼成多行字符串,min_size 就是该币种在 Coinbase 的最小下单精度。 实际跑起来,数据数组长度通常上百(Coinbase 公开币种超 100 个),Print 出的内容可直接贴到日志里核对。外汇与贵金属本身波动剧烈、杠杆风险高,这类 API 拉取仅作标的中转参考,不构成任何方向判断。

MQL5 / C++
class="type">class="kw">string url = "https:class=class="str">"cmt">//api.coinbase.com/v2/currencies";
class="type">char headers[];
class="type">int timeout = class="num">5000;
class="type">int res;
Print("Fetching list of available currencies from Coinbase API");
res = WebRequest("GET", url, NULL, NULL, timeout, data, class="num">0, result, result_headers);
class="type">class="kw">string currencies = "";
if(res > class="num">0)
  {
    Print("Response received from Coinbase API");
    CJAVal jv;
    if(jv.Deserialize(result))
      {
        class=class="str">"cmt">// Considerando que a resposta é uma lista de moedas
        for(class="type">int i = class="num">0; i < jv["data"].Size(); i++)
          {
            currencies += "Currency: " + jv["data"][i]["id"].ToStr();
            currencies += ", Name: " + jv["data"][i]["name"].ToStr();
            currencies += ", Min Size: " + jv["data"][i]["min_size"].ToStr();
            currencies += "\n";
          }
        Print(currencies);
      }
    else
      {
        Print("Error: Unable to parse the response.");
      }
  }
else
  {
    Print("Error: No response from Coinbase API or an error occurred.");
  }
class="kw">return currencies;
}

◍ 把报价与币种打印到日志里

在 OnInit 末尾把关键变量打到 Experts 日志,是验证脚本是否拿到正确环境的最快办法。下面这几行直接输出买价、卖价、现货价以及可用币种清单,MT5 终端按 Ctrl+T 打开「专家」标签就能看到。 [CODE] Print("Buy Price: ", buyPrice); Print("Sell Price: ", sellPrice); Print("Spot Price: ", spotPrice); const string currencies = GetAvailableCurrencies(); Print("Available Currencies: ", currencies); //--- return(INIT_SUCCEEDED); } [/CODE] 逐行看:前三行 Print 分别输出 buyPrice、sellPrice、spotPrice,注意浮点报价默认精度可能只显示小数点后两位,若要看满五位需自行格式化。第四行用 const string 接住 GetAvailableCurrencies() 返回的字符串,第五行打印出来,能确认当前账户下能交易的货币对范围。 最后 return(INIT_SUCCEEDED) 表示初始化通过,若前面任一变量为空或函数失败,日志里会缺行,这时初始化虽返回成功但后续逻辑可能异常。外汇与贵金属杠杆高,这类环境检查不通过就开仓,可能触发意外滑点。

MQL5 / C++
   Print("Buy Price: ", buyPrice);
   Print("Sell Price: ", sellPrice);
   Print("Spot Price: ", spotPrice);
   const class="type">class="kw">string currencies = GetAvailableCurrencies();
   Print("Available Currencies: ", currencies);
class=class="str">"cmt">//---
   class="kw">return(INIT_SUCCEEDED);
   }

「把接口思维带进 MT5 实盘验证」

前面几节把 REST 架构、MQL5 的 WebRequest 调用和 Coinbase 行情读取都拆开了,落到最后一件能立刻动手的事:开 MT5 把那套读取 JSON 的脚本挂上模拟盘,看返回字段和延迟是否跟你本地 Postman 测的一致。 外汇与贵金属本身就是高杠杆高风险品种,任何第三方 API 的行情延迟或断连都可能让策略信号错位,所以先在策略测试器里跑通再谈实盘。 保持对报错日志的嗅觉比追新框架更重要——一个未捕获的 HTTP 403 就可能让 Agent 静默失效。关掉文档,去 GitHub 把作者那几个 RestAPI 例程拉下来,改一个 Endpoint 参数,跑通就是你的第一道集成经验。

常见问题

用 RestAPI 在 EA 里发 GET 请求到 Coinbase 公共端点,把返回的币种清单解析后 Print 到日志,开盘加载一次即可。
在 OnInit 或定时器中请求接口,把币种和价格用 Print 输出到专家日志,打开日志面板核对时间戳与数值是否刷新。
小布可接管这类重复拉取与比对,把接口返回的币种报价和本地品种做差异标记,你只看异常就行。
先写个只拉清单和打印报价的脚本,不交易,跑一天确认网络与字段稳定,再谈策略接入。
多为端点限频或证书问题,加超时参数、错峰请求,并把原始响应码打印出来定位最快。