如何使用 JAVA(或任何东西!)send/receive 数据 to/from MetaTrader Terminal 4

How to send/receive data to/from MetaTrader Ternminal 4 with JAVA (or anything!)

我一直在研究一种算法(不是我的,我只是在修改它)预测何时在外汇市场上买卖。我需要能够打开和关闭订单、动态更新订单参数(例如止损、最大止损等)并接收实时报价数据。

我已经研究了一个多星期了,还是没有成功。

我最接近的是使用 JavoNet and Mt4 Api

我设法将 DLL 导入 java 并使用了一个 MQL4 函数,它是 AccountBalance(),但是它返回了 0.0,这不是账户余额,我搞砸了绕过 MT4 客户端上的代码和设置,但仍然没有成功。

Q0:谁能给我指出正确的方向?

我是自动外汇交易的新手,但据我所知,某处有一个经纪人有 MT4 服务器,我用我的 windows 机器上的 MT4 客户端连接到该服务器。

问题 1: 如果是这种情况,我是否需要 API 使用服务器端而不是我的客户端?

到目前为止,我尝试过的所有这些 DLL 都已与我机器上的 MT4 客户端软件一起使用。

我也一直在阅读 FIX-Protocol 和 ZeroMQ。

问题 2: 这些能否以任何方式帮助我实现我的目标(而不是在 JAVA 和 MT4 DLL 之间创建一些桥梁)?

如果您需要 send/receive MT4 和 Java 应用程序之间的同步消息,REST 将是最好的方法,因为在这种情况下快速响应很重要。像 ZeroMQ 这样的 Message Queue 解决方案更适合异步解决方案,所以它不会帮助你。选择 REST 方法后,您可以使用 MQL4 WebRequest() 调用您的 Java 应用程序。

A0: 是的,直接忘记外汇交易领域中的 REST 和同步、阻塞链

A1: 嗯,不是典型的方式。 MetaTrader Server 是经纪商端的一套专有系统,它们 API 未公开以允许针对某些第 3 方集成。

A2: FIX-Protocol 是行业标准的 LP 接口通用语。如果您与您的机构交易提供商有合同关系,包括。 FIX-Protocol GWY-端口,这可以为您提供 A 级市场访问权限并集成您的交易工具。如果是这种情况,请忘记 MT4 工具,因为黄金时段节奏远远超出 MT4 终端本地主机处理架构(具有 亚毫秒 TimeDOMAIN 分辨率的多个事件很常见,而 MQL4不提供对多线程并发/更好的并行程序调度设计的任何直接支持)。 FIX-Protocol 事件与上图完全不同,在最左边,"before" 该图从第一 [ms] 列开始。

ZeroMQ 可能有助于解放您的进一步设计免受 MQL4 的限制。可能想阅读我关于分布式系统的其他帖子,其中出现了 MQL4 / ZeroMQ / ML-AI 预测器 / GPU 处理基础设施。

无论如何:

享受MQL4/MQL5

的狂野世界


有兴趣吗? May also like reading other MQL4, ZeroMQ distributed processing and low-latency trading posts

我开始使用 MQL5 编写专家代码,自然是在 MT5 平台上,我必须承认随着应用程序复杂性的增加,管理应用程序的难度很高。这不仅是因为缺少垃圾收集器,这当然会强制删除新实例,还因为 Java 提供了一组 MQL5 自然没有的强大数据结构和语法。最后但同样重要的是,谈到可用的社区和第三方库,Java 和 MQL5 之间的距离只有一光年。 IE。如果我需要在 Java 端找到用于 JSON 转换的库,我找到了数十个官方和稳定版本,在 MQL5 社区中,我只找到了我必须自己修改的垃圾。

因此,在多次尝试用 MQL5 编写我的专家代码(当然不是简单的)失败之后,我决定采用一种激进的方法:编写一个应用程序,client-side MQL5,server-side Java,它为 MT5 平台提供了 Java 门面。相同 API,相同的基本事件等等。尽管我不止一次地认为自己陷入了一条盲道,但我还是坚持编码,最终,我做到了,获得了一个非常可靠的结果。 自然地,REST 接口大大降低了性能,并且每个请求,即使在同一本地主机中使用 Tomcat 和 MT5 运行,也是以毫秒为单位的,而不是微秒,但另一方面这减少了只是这个架构的适用性,并没有让它一无是处。

像剥头皮和各种 high-frequency 交易这样的策略不适合这种情况,vice-versa 较长时期内的所有其他策略,即使是日内策略,也可以成功实施而无需任何缺点。 最后但同样重要的是,不必使用 WebRequest() MQL5 方法调用任何 Servlet 容器,可以从 OS 导入 wininet.dll(谈论 Windows ) 并且策略测试器的工作方式就好像策略是用 MQL5 编写的一样,可能只是稍微慢一点。 总而言之,我不会对外汇交易平台的 Java 门面方法如此讽刺,只引用裸体表演而不考虑整体情况是一种天真的面对争论的方法。

为了收集分时信息并打开、更新或关闭订单,您可以使用 mt4 服务器 api。

请检查此 url。

http://mtapi.online/#overlappable-4

也许你会找到你想要的。

然后我还有mt4服务器api。如果您有任何问题,请更新我。

您可以尝试 MetaApi https://metaapi.cloud 云服务,它提供 REST API 和 WebSocket API 访问 MetaTrader 4 和 MetaTrader 5 账户。

官方 REST API 文档:https://metaapi.cloud/docs/client

SDK:https://metaapi.cloud/sdks(javascript、python 和 Java SDK 于 2021 年 4 月提供)

支持读取账户信息、持仓、订单、交易历史、接收报价、访问市场数据。

该服务还提供跟单交易API https://metaapi.cloud/docs/copyfactory and API to calculate forex trading metrics on a MetaTrader account https://metaapi.cloud/docs/metastats.

WebRequest 不是世界末日,您可以使用 API 从您的 EA 提交 http 请求,甚至可以使用 Strategy Tester。