py-mt4 icon indicating copy to clipboard operation
py-mt4 copied to clipboard

MT4程序出现停止运行问题

Open JJH3024 opened this issue 6 years ago • 8 comments

我在MT4上加载了ZeroMQ_MT4_EA_Template_Edited这个程序,然后运行py脚本之后,MT4程序就停止运行,这是为什么。

JJH3024 avatar Dec 21 '18 14:12 JJH3024

具体是没有的error code

l976308589 avatar Jan 14 '19 06:01 l976308589

同样的问题

igithub2019 avatar Mar 08 '19 03:03 igithub2019

@JJH3024 @l976308589 @igithub2019 Library文件夹下面的libsodium.dll和libzmq.dll是32位的,你的系统可能是64位的,要找相应64位的dll

ns2250225 avatar Mar 08 '19 03:03 ns2250225

我也有同样的问题,不是32位64位dll的事,mt4就必须用32位,mt5才是64位,有的时候无论重复多少次,只要一运行python端就会强退,有的时候又可以打开运行很久,不过也有强退的现象。

CreativeLau avatar Apr 04 '19 16:04 CreativeLau

经过查找发现是mt4端的发送代码造成的,ZmqMsg不能作为返回值再进行发送,这就是导致mt4闪退的原因,为什么有时候行有时候又不行暂时不知道原因,这可能要debug libzmq.dll才能发现原因,因为从libzmq.dll项目的介绍看,libzmq.dll是不支持win10的。 目前解决方法是把MessageHandler返回类型改成string,在OnTimer事件里用返回值构造ZmqMsg进行发送,或者直接发送返回的string。

CreativeLau avatar Apr 05 '19 10:04 CreativeLau

嗯嗯,感谢您分享解决方案。我再测试测试。

JJH3024 avatar Apr 05 '19 10:04 JJH3024

嗯嗯,感谢您分享解决方案。我再测试测试。

查看libzmq的文档后,终于知道是怎么回事了,文档中写着Never access zmq_msg_t members directly, instead always use the zmq_msg family of functions. 所以不能直接去访问zmq_msg,必须用zmq_msg_copy方法去传递zmq_msg。

所以EA代码的137行reply=ret是不对的,应改成reply.copy(ret),但仍不能解决闪退,看来把zmq_msg作为返回值也是不行的,所以还得先返回string再做处理。

我在Pull request里上传代码了,你可以试试update那一版。 https://github.com/ns2250225/py-mt4/pull/6

CreativeLau avatar Apr 06 '19 01:04 CreativeLau

嗯嗯,感谢您分享解决方案。我再测试测试。

查看libzmq的文档后,终于知道是怎么回事了,文档中写着Never access zmq_msg_t members directly, instead always use the zmq_msg family of functions. 所以不能直接去访问zmq_msg,必须用zmq_msg_copy方法去传递zmq_msg。

所以EA代码的137行reply=ret是不对的,应改成reply.copy(ret),但仍不能解决闪退,看来把zmq_msg作为返回值也是不行的,所以还得先返回string再做处理。

我在Pull request里上传代码了,你可以试试update那一版。 #6

非常感谢

ygz-github avatar Nov 01 '19 15:11 ygz-github