如何使用 ZeroMQ 获得从 Python 到 Metatrader 4 的连接
How can I get a connection from Python to Metatrader 4 using ZeroMQ
我希望智能交易系统通过电报消息触发交易。
我使用 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.订单类型:buy/sell
2. 交易品种:EURUSD, AUDUSD,...
如果消息包含 "Ascending",则发送 "Sell" -
如果消息包含 "Descending"
,则发送 "Buy"
如果消息包含 "AUDUSD",则发送 "AUDUSD",...
为此,我从 Darwinex 找到了一个库,并想将它(消息的解释,将值作为数组发送)与我已经运行的电报机器人结合起来。
为了测试,我想单独尝试 Darwinex 中的示例代码。
我找到代码 v2.0.1:
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”未定义
在 运行ning 之后:_zmq._DWX_ZeroMQ_Connector() - 在 Spyder 的内核中。
我该怎么做才能解决这个错误?
在最终状态下,我想 运行 Python-Code 和 Expert Advisor 在同一个 Windows Server 2012 R2 上。
如果我从服务器 运行 powershell 中的 .py 文件就足够了,还是应该将文件托管在 Webside 上?
我希望在我的 VPS 或 Webside-Host-Server 上获得整个 system/examplecode 运行ning 并获得用于进一步编码操作的测试环境,但目前我无法获得Python 中的库代码正确地更改为 运行。
还有 MT4 ceeps 与当前代码崩溃 - 但如果我将我的应用程序与 Library-Codeexample 结合使用,应该会得到修复。
(运行使用 WIN 10 在我的本地 PC 上安装所有内容)。
Q : I think it is a connection-problem between MT4 and Python.
如果没有完全可复制的 MCVE 代码,这是无法确定的。
在 python 中的 QuantFX 和 MQL4
中实现的交易生态系统 MetaTrader 4 终端之间使用了基于 ZeroMQ 的双向 signalling/messaging,使用此架构有积极的经验。
详情决定。
最好的下一步:
从一个简单的 PUSH/PULL
原型开始 python-PUSH
-es, MQL4
-script-PULL
-s,最好使用tcp://
transport-class(win平台不需要准备好使用even更简单,无协议,ipc://
transport-class.
完成这个微不足道的步骤后,继续前进。
Q : How do I need to setup my Server to get a connection betwen those two - since it should be the same as on my local PC?
原型制作过程中在同一个localhost
上使用ZeroMQ是正常的,所以你可以测试和调试集成。关于ZeroMQ的详情,欢迎到read all details in other posts.
Q : Is it enough if I run the .py file in the powershell from the server or should I host the file with the Webside I already have and use that as "Python-Server"?
是的,如果 .py 文件是那样设计的。没有代码,没有建议。就这么简单。
可能的问题:
版本 - ZeroMQ,从 2.11.x 到最近的 4.3.+,已经做了很多改变
安装 DLL 的细节很重要。
MQL4 同样经历了很多变化(string
不再是一个字符串,变成了 struct
来命名影响最大的一个),所以从简单的场景开始,逐步集成目标架构/ 适当测试完成的阶段是否按预期工作的阶段。
要解决该问题,您需要:
from DWX_ZeroMQ_Connector_v2_0_1_RC8 import DWX_ZeroMQ_Connector
_zmq = DWX_ZeroMQ_Connector()
(适当调整您的连接器版本)。
应该解决这个问题。
我希望智能交易系统通过电报消息触发交易。
我使用 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.订单类型:buy/sell 2. 交易品种:EURUSD, AUDUSD,...
如果消息包含 "Ascending",则发送 "Sell" - 如果消息包含 "Descending"
,则发送 "Buy"如果消息包含 "AUDUSD",则发送 "AUDUSD",...
为此,我从 Darwinex 找到了一个库,并想将它(消息的解释,将值作为数组发送)与我已经运行的电报机器人结合起来。
为了测试,我想单独尝试 Darwinex 中的示例代码。
我找到代码 v2.0.1:
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”未定义
在 运行ning 之后:_zmq._DWX_ZeroMQ_Connector() - 在 Spyder 的内核中。
我该怎么做才能解决这个错误?
在最终状态下,我想 运行 Python-Code 和 Expert Advisor 在同一个 Windows Server 2012 R2 上。
如果我从服务器 运行 powershell 中的 .py 文件就足够了,还是应该将文件托管在 Webside 上?
我希望在我的 VPS 或 Webside-Host-Server 上获得整个 system/examplecode 运行ning 并获得用于进一步编码操作的测试环境,但目前我无法获得Python 中的库代码正确地更改为 运行。
还有 MT4 ceeps 与当前代码崩溃 - 但如果我将我的应用程序与 Library-Codeexample 结合使用,应该会得到修复。
(运行使用 WIN 10 在我的本地 PC 上安装所有内容)。
Q : I think it is a connection-problem between MT4 and Python.
如果没有完全可复制的 MCVE 代码,这是无法确定的。
在 python 中的 QuantFX 和 MQL4
中实现的交易生态系统 MetaTrader 4 终端之间使用了基于 ZeroMQ 的双向 signalling/messaging,使用此架构有积极的经验。
详情决定。
最好的下一步:
从一个简单的 PUSH/PULL
原型开始 python-PUSH
-es, MQL4
-script-PULL
-s,最好使用tcp://
transport-class(win平台不需要准备好使用even更简单,无协议,ipc://
transport-class.
完成这个微不足道的步骤后,继续前进。
Q : How do I need to setup my Server to get a connection betwen those two - since it should be the same as on my local PC?
原型制作过程中在同一个localhost
上使用ZeroMQ是正常的,所以你可以测试和调试集成。关于ZeroMQ的详情,欢迎到read all details in other posts.
Q : Is it enough if I run the .py file in the powershell from the server or should I host the file with the Webside I already have and use that as "Python-Server"?
是的,如果 .py 文件是那样设计的。没有代码,没有建议。就这么简单。
可能的问题:
版本 - ZeroMQ,从 2.11.x 到最近的 4.3.+,已经做了很多改变 安装 DLL 的细节很重要。
MQL4 同样经历了很多变化(string
不再是一个字符串,变成了 struct
来命名影响最大的一个),所以从简单的场景开始,逐步集成目标架构/ 适当测试完成的阶段是否按预期工作的阶段。
要解决该问题,您需要:
from DWX_ZeroMQ_Connector_v2_0_1_RC8 import DWX_ZeroMQ_Connector
_zmq = DWX_ZeroMQ_Connector()
(适当调整您的连接器版本)。 应该解决这个问题。