【问题标题】:How can I get a connection from Python to Metatrader 4 using ZeroMQ如何使用 ZeroMQ 从 Python 连接到 Metatrader 4
【发布时间】:2019-08-30 19:58:22
【问题描述】:

我希望 EA 交易打开由 Telegram-Message 触发的交易。

我成功地设置了一个使用 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,...

如果消息包含“升序”,则发送“卖出”- 如果消息包含“降序”,则发送“购买”

如果消息包含“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 上运行所有内容)。

【问题讨论】:

  • 也许您可以分辨出您使用了哪些文件,以及使用了哪些设置。也许您在启动要连接到 ZMQ 的机器人时在 MT4 中收到一些错误,您可以分享这些错误或日志?
  • 我再次检查了正确的版本,发现他使用的是较新的版本。编辑我帖子中的链接 - 现在我在 Spyder 中收到一条错误消息。

标签: python zeromq telegram mql4


【解决方案1】:

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

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

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

细节决定。


最好的下一步:

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

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

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

在原型制作过程中,在同一个localhost 上使用 ZeroMQ 是正常的,因此您可以测试和调试集成。有关 ZeroMQ 的详细信息,请随时read all details in other posts

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

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


可能的问题:

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

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

【讨论】:

  • 谢谢,我从一个简单的“Hello-World”应用程序开始,并将 Python 客户端与我的 Telegram-Bot 结合起来,它可以解释收到的 Telegram 中的消息。现在我可以通过向机器人发送电报消息来触发 Hello-World 应用程序。代码在上面编辑。现在我想使用 Darwinex Library v2.0.1 发送 2 个变量并在 MQ4 中解释接收到的消息。单独测试纯库会在 Python 中出现错误。 NameError: name '_zmq' is not defined 当我调用一个函数时。你能告诉我我缺少什么来解决这个问题并继续集成我的代码吗?
  • @PatrikHörmann 很高兴听到在遵循答案后取得进展。然而,StackOverflow 不能以这种方式工作,添加另一个问题和/或修改代码并在解决您最初的担忧后提出另一个问题。随意遵守 StackOverflow 社区规则和网络礼仪。
【解决方案2】:

要解决这个问题,你需要这个:

from DWX_ZeroMQ_Connector_v2_0_1_RC8 import DWX_ZeroMQ_Connector
_zmq = DWX_ZeroMQ_Connector()

(根据需要调整您的连接器版本)。 应该解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多