首页 > 解决方案 > 如何使用 ZeroMQ 从 Python 连接到 Metatrader 4

问题描述

我想要一个 EA 开立由电报消息触发的交易。

我成功地设置了一个使用 MQ4 作为服务器和 Python/Telegram-bot 作为客户端的 Hello-World 应用程序。当 Telegram-Bot 收到消息时,他会向 MQ4 发送请求并得到简单的响应,而无需执行交易。

运行代码如下。

#   Hello World client in Python
#   Connects REQ socket to tcp://localhost:5555

import zmq
context = zmq.Context()

#  Socket to talk to server
print("Connecting to trading server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
print("Connecting to trading server succeed")


#################################################################################
# Use your own values from my.telegram.org
api_id = ######
api_hash = '#####'
bot_token = '#####'
#################################################################################

from telethon import TelegramClient, events

client = TelegramClient('anon', api_id, api_hash)

@client.on(events.NewMessage)
async def my_event_handler(event):


    if "Ascending" in event.raw_text:

        if "AUDUSD" in event.raw_text:
            await event.reply("AUDUSD sell")

            #  Do 1 request, waiting for a response
            for request in range(1):
                print("Telegram: AUDUSD sell execution requested %s …" % request)
                socket.send(b"AUDUSD Sell execute")
                #Send 2 variables (Ordertype // Symbol)

                #  Get the reply. -> Not neccesary for final application
                #  Apülication just needs to send 2 Varianles to MQ4 and trigger the open_order()
                message = socket.recv()
                print("Received reply %s [ %s ]" % (request, message))



client.start()
client.run_until_disconnected()

// Hello World server in MQ4

#include <Zmq/Zmq.mqh>

//+------------------------------------------------------------------+
 void OnTick()
  {
   Context context("helloworld");
   Socket socket(context,ZMQ_REP);

   socket.bind("tcp://*:5555");

   while(!IsStopped())
     {
      ZmqMsg request;

      // Wait for next request from client

      // MetaTrader note: this will block the script thread
      // and if you try to terminate this script, MetaTrader
      // will hang (and crash if you force closing it)

      socket.recv(request);
      Print("Receive: AUDUSD Sell execute");

      Sleep(1000);

      ZmqMsg reply("Trade was executed");
      // Send reply back to client
      socket.send(reply);
      Print("Feedback: Trade was executed");
     }
  }
//+------------------------------------------------------------------+

现在我想将 2 个变量从 Python 发送到 MQ4。1. 订单类型:买入/卖出 2. 代码:EURUSD, AUDUSD,...

如果消息包含“Ascending”,则发送“Sell” - 如果消息包含“Descending”,则发送“Buy”

如果消息包含“AUDUSD”,则发送“AUDUSD”,...

为此,我从 Darwinex 找到了一个库,并希望将它(解释消息,作为数组发送值)与我已经运行的电报机器人结合起来。


为了测试,我想自己尝试来自 Darwinex 的示例代码。

我找到了代码 v2.0.1:

Python: https ://github.com/darwinex/DarwinexLabs/blob/master/tools/dwx_zeromq_connector/v2.0.1/Python/DWX_ZeroMQ_Connector_v2_0_1_RC8.py

MQ4:(注意:此库代码可能会在最终应用程序中替换上面的整个 MQ4 代码。) https://github.com/darwinex/DarwinexLabs/blob/master/tools/dwx_zeromq_connector/v2.0.1/MQL4/DWX_ZeroMQ_Server_v2.0.1_RC8 .mq4

当我在不更改的情况下复制代码时,Python 中出现错误:

NameError:名称'_zmq'未定义

运行后:_zmq._DWX_ZeroMQ_Connector() - 在 Spyder 的内核中。

我能做些什么来解决这个错误?


在最终状态下,我想在同一个 Windows Server 2012 R2 上运行 Python 代码和智能交易系统。

如果我从服务器运行 powershell 中的 .py 文件就足够了,还是应该使用 Webside 托管文件?

我希望让整个系统/示例代码在我的 VPS 或 Webside-Host-Server 上运行,并获得一个测试环境以进行进一步的编码操作,但目前我无法让 Python 中的库代码正常运行。

MT4 也会因当前代码崩溃 - 但如果我将我的应用程序与 Library-Codeexample 结合使用,则应该修复。

(使用 WIN 10 在我的本地 PC 上运行所有内容)。

标签: pythonzeromqtelegrammql4

解决方案


我认为这是 MT4 和 Python 之间的连接问题。

如果没有完全可重现的 MCVE 代码,这是无法确定的。

在 python 中的 QuantFX 和交易生态系统 MetaTrader 4 终端之间使用了基于 ZeroMQ 的双向信号/消息传递MQL4,使用此架构有一个积极的体验。

细节决定。


最好的下一步:

从一个简单的PUSH/PULL原型 python- PUSH-es、MQL4-script- PULL-s 开始,最好使用tcp://传输类(win 平台不需要准备好使用更简单、无协议的ipc://传输类。

一旦你完成了这微不足道的一步,就继续前进。

我需要如何设置我的服务器以在这两者之间建立连接 - 因为它应该与我的本地 PC 上的相同?

在原型制作过程中使用 ZeroMQ 是正常的localhost,因此您可以测试和调试集成。有关 ZeroMQ 的详细信息,请随时阅读其他帖子中的所有详细信息

如果我从服务器在 powershell 中运行 .py 文件就足够了,还是应该使用我已经拥有的 Webside 托管该文件并将其用作“Python-Server”?

是的,如果 .py 文件是这样设计的。没有代码,没有建议。就这么简单。


可能的问题:

版本 - ZeroMQ,从 2.11.x 到最近的 4.3.+,进行了很多更改 安装 DLL 细节很重要。

MQL4 类似地经历了许多变化(string不再是一个字符串,而是成为struct影响最大的一个),所以从简单的场景开始,并在步骤/阶段中集成目标架构,并适当测试完成的阶段是否按预期工作。


推荐阅读