ns2250225 / py-mt4

🎰 用Python来写MT4的自动化交易脚本
205 stars 103 forks source link

MT4程序出现停止运行问题 #2

Open JJH3024 opened 5 years ago

JJH3024 commented 5 years ago

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

l976308589 commented 5 years ago

具体是没有的error code

igithub2019 commented 5 years ago

同样的问题

ns2250225 commented 5 years ago

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

CreativeLau commented 5 years ago

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

CreativeLau commented 5 years ago

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

JJH3024 commented 5 years ago

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

CreativeLau commented 5 years ago

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

查看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

ygz-github commented 4 years ago

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

查看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

非常感谢