简单的MT4 - Java桥

 
大家好。

我是一个JAVA程序员,我从一年前就开始使用MT4。虽然MQL非常简单易学,但用这种语言编写代码时,有些事情确实很痛苦。几周前,我想把用Java编写的逻辑代码简单地整合到我的metatrader EA中。我在互联网和这个论坛上寻找解决方案,我发现了一些有趣的工具(MT4-Java API https://forum.mql4.com/27050, Java Class to DLL converter, ...) 但所有这些都有其优点和缺点,所以我决定自己写一个MT4-Java集成。

我对我的解决方案有以下四个必须具备的要求。

1. 简单的安装
2. 对JAVA代码的调试能力
3. 速度快

4. 4.MT-Terminal和另一个进程之间没有网络通信


有一件事对我来说并不重要,那就是需要在我的Java代码中调用MT4功能(指标,交易功能)。对于技术分析,我使用来自www.ta-lib.org 的开源库,订单处理仍在MQL代码中完成。Javacode只是在买入或卖出的时候通知MQL代码。

你所需要的是MetaTrader,一个已安装的JVM(1.6)和所附的ZIP文件,其中包含MQL代码和JVM容器的DLL。

将ZIP中的文件复制到你的MT安装目录(保持目录结构),编辑mt4j.properties文件,并调整jvm.dll文件的路径。这就是运行mt4Sample EA的全部内容。

样本实现不做任何事情。它只是一个骨架,向你展示什么是可能的。 请阅读MT4BasicClient.java和SampleEA.java这两个文件中的注释。 你可以在mt4jSample.jar中找到JAVA源。 你自己的类必须实现MT4BasicClient接口或必须扩展 AbstractBasicClient。不要忘记在classpath中添加包含你自己的类的目录或JAR文件(见mt4j.properties)。

你的Java类被一个在终端进程内运行的JVM加载和执行。这将给你带来最佳的性能。我做了一些性能测试,并计算了在MT回测中执行processTick()的频率。每秒的平均调用次数为400.000次/秒,我认为这对我的需求来说已经足够快了。

JVM被配置为在8001创建一个调试端口,所以你可以使用你最喜欢的IDE并调试你的组件。

试用我的MT4-Java小桥的所有资源都附在这个帖子里。

祝你愉快 :-)
Cyberflohr
附加的文件:
mt4j_v0.1.zip  17 kb
 

不错。谢谢。然而,我找不到https://forum.mql4.com/270509 - 它显示一个错误。另外,能不能请你把你的代码贴出来。Java和mt4是我想使用的东西,但需要看到代码。

 

我已经纠正了链接:https://www.mql5.com/en/forum/121466

你可以在ZIP文件中找到MQL和Java代码。

 

这是个很好的工具

我不能让它工作,你能帮助我吗?

当我运行EA时,MT4崩溃了。

我使用的是windows 7 64bit, Java 7.0.1, MT4 ver4.00 build 409 25 oct 2011

java安装在这里 C:\jre\bin\client\jvm.dll

mt4安装在这里 C:\MT4\

windows给出了以下错误信息

问题签名。

问题事件名称: BEX

应用程序名称: terminal.exe

应用程序版本: 4.0.0.409

应用程序时间戳: 0028f000

故障模块名称: MSVCR100.dll

故障模块版本: 10.0.30319.1

故障模块时间戳: 4ba1dbbe

异常偏移量: 0008ae6e

异常代码: c0000417

异常数据: 00000000

操作系统版本: 6.1.7601.2.1.0.256.1

本地ID: 2057

附加信息1: a0db

附加信息2: a0db43c64a51ee21486e76f538ab825d

附加信息3: 5a50

附加信息4: 5a50e927a493324cabb3491f7239cdd1


在线阅读我们的隐私声明。

http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409


如果没有在线隐私声明,请离线阅读我们的隐私声明。

C:\Windows\system32\en-US\erofflps.txt

 
很抱歉延迟回复 - 但不知何故,这个主题的新帖子没有通知我。


你的MT4终端崩溃的原因可能有两个

1.您使用的是64位JVM

这是不可能的,因为MT4是一个32位的应用程序。您必须在您的Win7-64bit上安装一个32bit的JVM,它可以和MT4一起使用。

JVM 版本检查 不应显示 "64 位"

C:\jre\bin\java -version

Java(TM) SE运行环境(build 1.6.0_30-b12)
Java HotSpot(TM) 64-Bit服务器虚拟机(build 20.5-b03,混合模式)。

2.Java 7

到目前为止,我只用Java6来测试我的程序。也许在Java7中有一些变化,引发了崩溃。

 

新版本0.2已经推出,将修复上述终端崩溃。

附加的文件:
mt4j_v0.2.zip  17 kb
 

嗨,cyberflohr。

我是MT的新手,但对Java有一些经验,所以这个桥对我来说是非常有趣的工具。我已经执行了你提到的所有安装步骤,但却无法启动这个例子。我在专家日志中看到以下内容。

20:53:13 mt4jSample EURUSD,H4: 载入成功

20:53:13 mt4jSample EURUSD,H4输入。IntProperty=99; BoolProperty=true; DoubleProperty=1.23; StringProperty="helloWorld"。

20:53:17 mt4jSample EURUSD,H4: 无法加载库 'mt4j.dll'(错误 126)

20:53:17 mt4jSample EURUSD,H4:专家停止工作

20:53:17 mt4jSample EURUSD,H4:已初始化

20:54:27 mt4jSample EURUSD,H4:加载成功

20:54:27 mt4jSample EURUSD,H4:无法加载库 "mt4j.dll"(错误126)。

20:54:27 mt4jSample EURUSD,H4:专家停止工作

20:54:27 mt4jSample EURUSD,H4:取消初始化

20:54:27 mt4jSample EURUSD,H4: 取消初始化的原因1

20:54:27 mt4jSample EURUSD,H4:移除

问题的原因可能是什么?

 
white123right:

嗨,cyberflohr。


20:53:17 mt4jSample EURUSD,H4: 无法加载库 'mt4j.dll' (错误 126)


这个问题的原因是什么?

你好

根据我的理解,错误126 意味着MT4找不到dll文件。假设你用正确的名字调用它,它主要需要在/experts/libraries/文件夹中。它可以放在其他地方,但这是你的最佳位置。

希望这有帮助。

谢谢

布鲁克

 

你好,Cyberflohr。

我按照您的指示安装了mt4jv0.2,在MT4平台上没有得到任何错误报告。然而,从SampleEA.java中我发现,根据MT4BasicClient.java中的描述,有一个方法似乎在EA初始化时运行

SampleEA.java中的代码。

@Override

public void init() {

System.out.println("init()")。

}

MT4BasicClient.java中的描述。

/**

*由MT4客户端在初始阶段调用。

从这些代码中,我认为在初始化时应该有一些东西被打印出来。但在MT4平台上,我没有看到 "init() "信息被打印。我对这段代码的理解是否正确?

此外,你能给另一个演示来下单吗?

非常感谢你,我真的很欣赏你的代码。

 
brooky29:

你好

根据我的理解,错误126意味着MT4找不到dll文件。假设你用正确的名字调用它,它主要需要在/experts/libraries/文件夹中。它可以放在其他地方,但这是你的最佳位置。

希望这有帮助。

谢谢

布鲁克

正确 - mt4j.dll不在libraries文件夹中。

即:如果你的metatrader安装文件夹是c:\program files\metatrader,那么mt4j桥的文件必须在以下位置。

c:\program files\metatrader\experts\mt4jSample.ex4
c:\program files\metatrader\experts\mt4jSample.mq4
c:\program files\metatrader\experts\libraries\mt4j.dll
c:\program files\metatrader\experts\libraries\mt4j.properties
c:\program files\metatrader\experts\libraries\mt4jSample.jar

PS:查看桥接日志文件,了解有关错误的进一步信息

c:\program files\metatrader\experts\files\mt4j.log


 
limk0032:

你好,Cyberflohr。

我按照您的指示安装了mt4jv0.2,在MT4平台上没有得到任何错误报告。然而,从SampleEA.java中我发现,根据MT4BasicClient.java中的描述,有一个方法似乎在EA初始化时运行

SampleEA.java中的代码。

@Override

public void init() {

System.out.println("init()")。

}

MT4BasicClient.java中的描述。

/**

*由MT4客户端在初始阶段调用。

从这些代码中,我认为在初始化时应该有一些东西被打印出来。但在MT4平台上,我没有看到 "init() "信息被打印。我对这段代码的理解是否正确?

此外,你能给另一个演示来下单吗?

非常感谢你,我真的很欣赏你的代码。

不幸的是,写到System.out/System.err不会在你的MT终端上显示信息。你必须把信息写到一个文件里(使用java.io)或者使用一个java日志框架,如log4j或slf4j。

我将在未来几天准备一个更复杂的例子,做一些交易。

问候。
cyberflohr