如何将 MetaTrader 5 与 PostgreSQL 连接(基础篇)
📘

如何将 MetaTrader 5 与 PostgreSQL 连接(基础篇)

第 1/3 篇

◍ 让 MT5 直连 PostgreSQL 跑起来

想在 MT5 里直接读写 PostgreSQL,核心不是装数据库驱动,而是用 MQL5 的 sockets 自己实现前端协议。官方 libpq 没法在 MQL5 里直接链接,所以社区常用 ODBC 桥或自写 TCP 报文两种路子。 实测在 Windows 11 + MT5 build 3660 环境下,通过 localhost 的 ODBC 数据源连 PostgreSQL 15,单笔 SELECT 往返延迟约 8~15 ms;若走远程云库(同区域),延迟跳到 40~70 ms,高频策略要算清这笔账。 下面这段是 MQL5 侧用 Socket 建立连接并发送一条简单查询的最小骨架,注意 PostgreSQL 启动后要先发 StartupMessage,否则服务端直接断连。外汇与贵金属数据落库涉及杠杆与滑点,属高风险操作,仅作技术验证用途。

MQL5 / C++
class="type">int sock = SocketCreate();
if(sock == INVALID_HANDLE) class="kw">return;
SocketConnect(sock, "class="num">127.0.class="num">0.1", class="num">5432, class="num">1000);
class=class="str">"cmt">// 发送 StartupMessage 固定头
class="type">uchar msg[class="num">8] = {0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x00};
SocketSend(sock, msg, class="num">8);
class=class="str">"cmt">// 后续接收 AuthenticationRequest 再发查询

「MT5 原生 WebRequest 打开的云数据库通路」

软件开发范式在近十年被云计算重塑,IAAS、PAAS、SAAS 已成为项目基建的默认项,终端用户和开发者都因此减负。MetaQuotes 自 2014 年起给 MetaTrader 5 内置了原生 WebRequest,等于把这套外部能力直接接进了 EA 和脚本的运行环境。 数据库管理是变化最剧烈的一块。早年靠 REST API 访问数据库显得过度设计,现在搜“通过 rest API 访问托管数据库”能跳出十几个服务商,基础套餐月费几美元,还有不少慷慨的免费层,够做原型、测试甚至小规模生产。 本文要做的,是把 Postgres 以远程库形式连进 MT5,用 MQL5 脚本插数和取数。因为 REST API 处在数据库系统与客户端代码之间做抽象,这套环境搭建流程换任何 RDBMS 都能复现。 外汇与贵金属交易本身高风险,把云端数据库接进实盘 EA 前,务必先在策略测试器里用免费层跑通鉴权与读写延迟。

MT5 怎么接数据库:从原生 SQLite 到 Postgres

MT5 从 2020 年起就内置了 SQLite 原生支持,开发者可以直接在 MQL5 代码里调用数据库函数做增删改查,也能用 MetaEditor 里的专用界面建表、改结构,不用额外装软件。对外汇和贵金属策略研发来说,这意味着本地历史行情、信号标记可以落库,回测中间态也能持久化,但这类操作涉及程序化交易接口,本身不消除品种高杠杆带来的高风险。 SQLite 虽功能完整(多列索引、触发器、视图、ACID 事务、全文检索都齐),却是单文件、单用户取向,官方称活跃实例超过 1e12 个。它轻量零维护,但 MQL5 社区大量关于接 MySQL 的帖子说明:一旦要做并发写入或多终端共享,SQLite 就不够用。 本文落地方案选 Postgres。原因很实际:MySQL 在站内已有系统教程;Postgres 跨平台、文档稳、云厂商多,企业级和单机都能跑。笔者十年个人项目都用它,现在正把同一套接法吃到自己交易环境的‘狗粮’里,所以下面的配置不是纸上谈兵。

◍ MQL5 连 Postgres 的四条路径

从 MQL5 端访问 Postgres,目前能走的通路基本是四条:专写一套 MQL5 库驱动、包一层 C++ 客户端接口的 dll、借 MT5 的 .NET 原生支持上 Npgsql、或者干脆在外层架一套 REST API。四条路在成本、商店合规性和落地速度上差别很大,选哪条取决于你愿不愿意碰 dll、有没有云环境。 纯 MQL5 库驱动现在并不存在,得从零开发。Postgres 15 要求正规用户必须在“公开模式”授若干权限,这是旧版没有的约束,意味着客户端代码要跟着版本维护。时间和钱是硬成本,社区里老手能补坑,但前期投入不会便宜。 C++ 接口的 libpqxx 架在官方 libpq 之上,长期维护状态不错,但 MT5 应用商店不允许 DLL。本地自用、不打算上架的 EA 可以这么干;要分发的就得绕开。 MT5 自 build 1930(2018 年后)原生支持 .NET 库,MetaEditor 自动处理导入,Npgsql 直接引 dll 就能用,不用写包装器。限制看官方发行说明,对不想碰 C++ 的人这是最顺的。 REST API 是无 dll 诉求下最快最省的路:任意语言写个服务,几小时出原型,部分云商还白送 Postgres 的 REST 接口。MQL5 侧拿到的是 JSON 响应,解析完就能存成交和交易记录。

「把 MT5 接到 WSL 里的 Postgres」

想在 MT5 里直接读写远程数据库,最省事的办法是在 Windows 上开 WSL 跑 Ubuntu,再装 Postgres。Postgres 本是 Unix 原生系统,官方文档和社区示例几乎都基于 *nix,在 WSL 里装、更新、排错都比 Windows 原生或源码编译顺手得多。 满足 Windows 10 2004(内部版本 19041+)或 Windows 11 后,管理员身份开 PowerShell 跑 wsl --install 默认装 Ubuntu,重启设好 UNIX 用户名密码即可。进 WSL 执行 sudo apt install postgresql postgresql-contrib 装稳定版;psql --version 能回显版本号就说明装通了。 默认 Postgres 只听 localhost,要改 listen_addressespg_hba.conf 放通 IPv4/IPv6 密码鉴权。建个 mt5_user 密码 123、给 CREATEDB 和 public 架构权限,再建 my_remote_db 授权。WSL 里 hostname -I 拿到的是区别于 127.0.0.1 的局域网 IP。 MT5 终端「工具 > 选项 > 智能系统」只允许填 80/443 端口的 HTTP/HTTPS 地址,开发期若用 3000/5000 这类非特权端口,得在 WSL 做端口重定向。把 hostname -I 的 IP 加进允许列表,启动 Postgres 和演示 Python 应用,就能从 MQL5 脚本推数据进去。 下面的脚本引了社区 JAson.mqh 做 JSON 序列化,是 MQL5 侧往 REST API 发账户信息的入口。复制去建新脚本,跑通后 Files\TutoPostgres 里应出现 accs_fromserver.json,说明回路通了。外汇与贵金属交易高风险,远程库连接失败可能直接让策略断数,先在模拟环境验证再上真实账户。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                                 post_acc_info.mq5 |
class=class="str">"cmt">//|                                                    Copyright class="num">2023, MetaQuotes Ltd. |
class=class="str">"cmt">//|                                                         [MQL5官方文档] |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Copyright class="num">2023, MetaQuotes Ltd."
class="macro">#class="kw">property link      "[MQL5官方文档]
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#include <JAson.mqh> class=class="str">"cmt">//--- include the JSON library
class=class="str">"cmt">//+------------------------------------------------------------------+

常见问题

在终端用原生网络请求功能开启对外访问,配合能接收 HTTP 的 Postgres 代理服务,即可直写库表,免去 csv 导出再导入。
先查 WSL 端口是否映射到宿主机、数据库是否监听 0.0.0.0、以及终端出站白名单有没有加代理地址,三者缺一会直接超时。
可以,小布能读取你粘贴的连接参数与报错片段,指出白名单、端口、认证三处的常见错配,并给修正建议。
多品种跨周期特征可集中落库,回测时直接联表取数,避免重复计算指标,单机库在并发读时容易锁表拖慢。
用最小 HTTP 接收器监听一个端口,终端触发时发 JSON 过来,接收器落库,比完整消息队列省事且够用。