如何使用ZeroMQ将MQL4/5中的消息从MetaTrader终端发送到python?

2024-04-29 14:53:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想从MetaTrader终端发送一条消息,使用它的MQL4/5到Python,这是一个简单的客户机服务器,其中MQL4/5是发送的客户机,Python是接收的服务器,这两个服务器正在与ZeroMQ同步。在

Python端的代码是这样的,我确信这部分工作得很好:

    import zmq
    import time


    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.bind("tcp://127.0.0.1:9999")

    print("Server Started")
    while True:
        message = socket.recv()              # Wait for next request from client
        print("Received request: ", message)
        time.sleep (1)
        socket.send_string("World")

MQL4/5侧是:

^{pr2}$

MQL4/5似乎没有发送任何内容。
你能说说它有什么毛病吗?在


Tags: import服务器终端消息message客户机timerequest
1条回答
网友
1楼 · 发布于 2024-04-29 14:53:59

Can you say what is wrong with it?

在MQL4/5-side上首先要做的一些事情:

MetaTrader终端可以在几种完全不同的代码执行模式下操作编译的MQL4/5语言。在

如果这是在Script中尝试的,那么与在ExpertAdvisor中这样做相比,损害要小得多,如果在某个CustomIndicator-type-of-MQL4/5代码中运行,则会产生最坏的副作用。在


零MQ侧:

在任何情况下,REQ/REP内置的可伸缩正式通信原型模式是最糟糕的选择,正如在以前的许多帖子中所说,这个内置的是多么脆弱,它很容易陷入一个基本上无法挽救的相互死锁并置,为了避免这些岗位在实施前更好地规避这些岗位的风险。在

总是在MQL4/5和Python端设置socket.setsockopt( zmq.LINGER, 0 )同时设置。没有例外,没有借口。在

在MQL4/5和Python端同时使用socket.setsockopt( zmq.COMPLETE, 1 )的设置也是非常值得建议的。在


MQL4/5的ZeroMQ语言特定绑定:

由于MetaTrader终端MQL4/5代码执行生态系统和zeromqapi v.X.Y.Z DLL库之间的MQL4/5#import-ed中介有几个可用的活动绑定,因此ATM不可能深入了解更多细节。使用了API v2.1.11(我修改了用于解决.MQH-文件的#import-ed接口的不兼容引入到游戏中,新的-MQL4.56789改变了游戏-因为string实际上不再是string和其他一些人),并且其他绑定,直到ZeroMQ API v.4.2.+版本,如果超出了一个简单的“Helloworld”—示例,则需要详细了解这些差异。在

然而,Context()实例启动应该配备适当的设置/参数,并且在测试时,您的代码应该定期获取所有返回代码并以编程方式处理所有异常(至少Print()将它们放入日志中,以便使用文件进行进一步调试)。在

也可以使用#import-ed函数int aZmqERROR = zmq_errno();,以便知道在呼叫发生之前/之后没有与ZeroMQ错误状态相关的信息,或者从内部层准确地知道什么是ZeroMQ信令,这可能会阻止API调用传递预期的功能状态/结果。MQL4/5-sidestring Zmq::errorMessage( int error )准备就观察任何此类ZeroMQ-side错误标志的一些更具可读性的提示提供建议。在


最后,但并非最不重要:

还要检查localhost防火墙配置,如果TCPport# == 9999实际上可以自由使用,或者防火墙安全策略上的管理禁令确实阻止了任何尝试成功使用此端口。在

在公开验证之前,最好明确并谨慎地终止每个Context()-实例(在显式地.close()-ed所有本地创建的ZeroMQ-Socket()-实例。在早期的API版本中可能会发生一些令人讨厌的事情,所以最好在所有较新的API版本中进行系统化和防御,即使示例或发布的代码没有系统地做到这一点。在

相关问题 更多 >