如何使用JAVA(或其他任何语言)与MetaTrader Ternminal 4发送/接收数据

12
我一直在研究一个算法(不是我的,我只是在修改它),用于预测外汇市场的买入和卖出时机。我需要能够开启和关闭订单,动态更新订单的参数(如止损、最大止损等),并接收实时的Tick数据。
我已经研究了一个多星期,但没有取得任何成功。
我找到的最接近的方法是使用JavoNetMt4 Api
我成功地将DLL导入到Java中,并使用了一个MQL4函数,即AccountBalance(),但是它返回的是0.0,而不是账户余额。我尝试过修改代码和MT4客户端的设置,但仍然没有成功。 问题0:请问有人可以指点我正确的方向吗?
我对自动化外汇交易还不太了解,但据我所知,某个地方有一家经纪人拥有一个MT4服务器,我可以通过我的Windows机器上的MT4客户端连接到该服务器。

Q1: 如果是这种情况,我需要将API与服务器端配合使用,而不是客户端吗?

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

我还阅读了一些关于FIX协议和ZeroMQ的内容。

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

6个回答

6

A0:在外汇交易领域,REST和同步阻塞链都可以忘记了。

A1:这不是一个典型的方式。MetaTrader服务器是经纪人端的专有系统套件,他们的API未公开,不允许与第三方集成。

enter image description here

A2:FIX协议是工业标准LP接口枢纽。如果您与机构交易提供商有签约关系,包括FIX协议GWY端口,这可能为您提供市场上A级访问,并集成您的交易工具。如果这是情况,请忘记MT4仪器,因为主时间节奏远远超出了MT4终端本地处理体系结构(多个事件具有亚毫秒时域分辨率很常见,而MQL4不提供任何直接支持多线程并发/更好的并行程序调度设计)。 FIX协议事件完全不在图像之上,远在最左边,“在”第一个[ms]列开始之前。

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

无论如何:

享受MQL4 / MQL5的奇妙世界吧!


感兴趣? 您也可以阅读其他 MQL4 ZeroMQ分布式处理低延迟交易文章


2
同意A0的观点。我们不是外汇工具或协议方面的专家,但REST或任何其他基于HTTP的协议永远无法像本地桥接那样实现性能。如果您需要从Java使用.NET DLL,则Javonet似乎是首选。我代表Javonet,我们有一些高频交易客户强调它让他们可以进行> 250,000次/秒的调用并且可以同时接收回调,这在http服务中是不可能的。相比之下,在普通机器i7 8gb mem上,xml webservice需要840秒!才能处理250k个调用。希望这条评论对您的架构规划决策有所帮助。干杯。 - Przemysław Ładyński
谢谢,Yvette,非常慷慨的举动。 - user3666197

5
您可以尝试使用 MetaApi https://metaapi.cloud 云服务,该服务提供了对MetaTrader 4和MetaTrader 5账户的REST API和WebSocket API访问权限。
官方REST API文档:https://metaapi.cloud/docs/client SDK:https://metaapi.cloud/sdks(截至2021年4月,提供了JavaScript、Python和Java SDK)
该服务支持读取账户信息、仓位、订单、交易历史记录、接收报价并访问市场数据。
此外,该服务还提供了复制交易APIhttps://metaapi.cloud/docs/copyfactory和用于计算MetaTrader账户的外汇交易指标APIhttps://metaapi.cloud/docs/metastats

2
我开始用MQL5编写专家,自然地在MT5平台上,我必须承认,随着应用程序的复杂度增加,管理它的困难度很高。这不仅是由于缺少垃圾回收器,当然也强制删除新实例,而且因为Java提供了一组强大的数据结构和语法,而MQL5自然没有。最后但并非最不重要的是,说到社区和第三方库的可用性,在Java和MQL5之间有一个光年的距离。例如,如果我需要在Java端查找JSON转换库,我可以找到数十个官方和稳定版本,而在MQL5社区中,我只找到了一些我不得不自己修改的垃圾。
因此,在多次尝试使用MQL5(当然不是简单的)编写我的专家失败后,我决定采取激进的方法:编写一个应用程序,客户端MQL5和服务器端Java,为MT5平台提供Java门面。同样的API,同样的基本事件等等。即使我曾经认为自己陷入了盲目的道路,我仍然坚持编码,最终取得了真正坚实的结果。
自然地,REST接口会大大降低性能,并且每个请求,即使在Tomcat和MT5在同一台本地主机上运行时,也是毫秒级而不是微秒级的。但另一方面,这只会降低此架构的适用性,而不是使其完全无用。
像高频交易等策略对于这种情况并不好,相反,在较长时间内的每种策略,即使是日内交易,也可以成功实施,没有任何缺点。
最后但并非最不重要的是,不需要使用WebRequest() MQL5方法来调用任何Servlet容器,可以从操作系统(谈论Windows)中导入wininet.dll,策略测试器将像策略已经编写在MQL5中一样工作,可能只是慢了一点。
总之,我不会对FX交易平台的Java门面方法如此讽刺,仅引用裸性能而不对整体情况进行情境化处理是应对该参数的一种天真方法。

1
如果您需要在MT4和Java应用程序之间发送/接收同步消息,则REST是最好的方法,因为在这种情况下快速响应很重要。消息队列解决方案(如ZeroMQ)更适合异步解决方案,因此它对您没有帮助。一旦选择了REST方法,您可以使用MQL4 WebRequest()调用Java应用程序。

3
恕我直言,外汇行业专业系统中没有容纳同步、阻塞链的空间。如果使用基于REST + WebRequest() 的方法进行发布,可能只是为了一个沙盒式的“教育”目的,对真实世界的客户的认真程度存在疑问。对于这样直白坦率的表述,我感到抱歉。 - user3666197
WebRequest() 无法在策略测试器中执行。- https://docs.mql4.com/common/webrequest - Cristian Florescu

1

WebRequest并不是万能的,您可以使用API从EA提交http请求,即使在策略测试器中也可以使用。


1
您的回答可以通过添加更多支持信息来改善。请进行[编辑]以添加进一步细节,例如引用或文档,以便他人可以确认您的答案是正确的。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

0

为了收集交易信息并开启、更新或关闭订单,您可以使用MT4服务器API。

请查看此网址。

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

也许你会找到你想要的。

另外我还有MT4服务器API。如果您有任何问题,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接