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

时间:2018-04-30 19:51:38

标签: python zeromq mql4 mql5

我只想从MetaTrader Terminal发送消息,使用它的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方面是:

   Context context( "helloworld" );
   Socket socket( context, ZMQ_REQ );

   Print( "Connecting to hello world server…" );
   socket.connect( "tcp://127.0.0.1:9999" );

   while ( True )
   {
      ZmqMsg request( "Hello" );
      socket.send( request );

      ZmqMsg reply;
      socket.recv( reply );           // Get the reply.

      Sleep( 1000 );
   }
好像MQL4 / 5似乎没有发送任何东西 你能说出它有什么问题吗?

1 个答案:

答案 0 :(得分:0)

  

你能说出它有什么问题吗?

MQL4 / 5-side开始的一些事情:

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

如果在 Script 中尝试过这种情况,那么损害赔偿的基数就会低于 ExpertAdvisor ,并且最严重的副作用会如果这是在某些 CustomIndicator 类型的MQL4 / 5代码中运行的话会发生。

在ZeroMQ方面:

无论如何, REQ/REP 内置的可扩展形式通信原型模式是最糟糕的选择,就像之前的许多帖子一样,已经解释了这个内置程序是多么脆弱并且它很容易陷入一种主要是不可救的共同死锁并置,所以最好重新阅读这些帖子,并在进入生产级服务设计和实施之前尽量避免这种风险。

始终在MQL4 / 5和Python端设置 socket.setsockopt( zmq.LINGER, 0 ) 。没有例外,没有任何借口。

MQL4 / 5和Python方面的 socket.setsockopt( zmq.COMPLETE, 1 ) 的设置也不仅仅是建议。

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

由于MetaTrader Terminal MQL4 / 5代码执行生态系统与ZeroMQ API vXYZ DLL库之间存在多个MQL4 / 5 #import -ed中介的活动绑定,因此ATM无法进入更多细节。使用了API v2.1.11(我修改了 .MQH -file,用于解决引入游戏中的 #import -ed界面不兼容问题>新 - MQL4.56789 更改了游戏 - string 实际上已停止 string 和其他一些人)并且已经看过其他绑定,直到ZeroMQ API v.4.2。+,如果超出“ Helloworld ”,就会有不同的细节知识。 - 实施例。

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

还可以使用 #import -ed函数 int aZmqERROR = zmq_errno(); ,无论您的怀疑何时出现,以便知道没有ZeroMQ错误状态在呼叫发生之前/之后相关的权利,或者确切地知道来自其内部层的ZeroMQ信令是什么,这可能阻止了API调用以提供预期的功能状态/结果。 MQL4 / 5-side string Zmq::errorMessage( int error ) 已准备好就观察任何此类ZeroMQ端错误标记的一些人类可读提示提供建议。

最后,但并非最不重要:

还检查localhost FireWall配置,如果TCP port# == 9999 实际上可以免费使用,或者FireWall安全策略的管理禁令确实阻止了任何尝试成功去使用这个端口#。

在公开验证之前,请更明确地终止每个 Context() -instance并谨慎处理(明确 .close() 之后创建了ZeroMQ- Socket() - 实例。在早期的API版本中可能会出现令人讨厌的事情,所以在所有较新的API版本中更好的系统性和防御性,即使示例或发布的代码没有系统地做到这一点。