Python Zmq子套接字未接收MQL5 Zmq发布套接字
我试图在MQL5中设置一个PUB套接字,在Python中设置一个接收消息的子套接字 我在MQL5中有这样一个功能:Python Zmq子套接字未接收MQL5 Zmq发布套接字,python,python-3.x,zeromq,pyzmq,mql5,Python,Python 3.x,Zeromq,Pyzmq,Mql5,我试图在MQL5中设置一个PUB套接字,在Python中设置一个接收消息的子套接字 我在MQL5中有这样一个功能: #include <Zmq/Zmq.mqh> Context context("helloworld"); Socket socket(context,ZMQ_PUB); string BROKER; int OnInit() { if (socket.bind("tcp://*:5556")) { Print("Error");
#include <Zmq/Zmq.mqh>
Context context("helloworld");
Socket socket(context,ZMQ_PUB);
string BROKER;
int OnInit()
{
if (socket.bind("tcp://*:5556"))
{
Print("Error");
}
else
Print("Bound");
BROKER = AccountInfoString(ACCOUNT_COMPANY);
return(INIT_SUCCEEDED);
}
void OnTick()
{
MqlTick last_tick;
string str;
if(SymbolInfoTick(Symbol(),last_tick))
{
StringConcatenate(str, BROKER, ",", Symbol(), ",", last_tick.time_msc, ",", last_tick.ask, ",", last_tick.bid, ",", last_tick.last, ",", last_tick.volume);
}
else
str = "FAIL";
Print(str);
ZmqMsg reply(str);
socket.send(reply);
}
这个问题是,在Python端,它似乎没有收到任何东西,recv调用只是永远阻塞。OnTick方法在MT中启动,因为可以看到打印
我怎样才能让它工作
请注意,如果我切换到REP/REQ对,它就会工作
MQL5:
但是这有一些缺点,所以如果我能帮助的话,我不想使用它。您的套接字选项必须放在套接字连接之前,因此您的代码将是:
import zmq
import random
import sys
import time
context = zmq.Context()
socket = context.socket(zmq.SUB)
ports = [5556]
socket.setsockopt(zmq.SUBSCRIBE, b"") # Note.
for port in ports:
print(port)
socket.connect("tcp://localhost:{}".format(port))
print('connected')
f = open('metatrader-1.csv', 'a')
while True:
msg = socket.recv()
print(msg)
f.write(str(msg) + '\n')
此外,本部分:
if (socket.bind("tcp://*:5556"))
{
Print("Error");
}
else
Print("Bound");
应该是相反的。当套接字成功绑定时,这实际上会打印一个错误。这是有道理的,但是行为仍然是一样的。您是否使用
socket.setsockopt(zmq.SUBSCRIBE,b“”)
而不是socket.setsockopt_字符串(zmq.SUBSCRIBE“”)
?是的,我就是这样使用的。Python端没有接收到任何内容。事实证明,我在MQL端对绑定的错误检查是错误的,因此它在实际发生错误时打印“绑定”,反之亦然(当我看到它打印错误时,我想我太快了,无法停止它)<代码>设置锁定选项_字符串也可以工作。我将接受这一点,编辑错误的错误检查-我希望你不介意。还要注意,如果端口被其他东西使用,通常会出现错误-在我的情况下,5556不起作用,但5555起了作用。
import zmq
import random
import sys
import time
context = zmq.Context()
socket = context.socket(zmq.REP)
ports = [5555]
for port in ports:
print(port)
socket.bind("tcp://*:{}".format(port))
#socket.setsockopt_string(zmq.SUBSCRIBE, '')
print('connected')
f = open('metatrader-1.csv', 'a')
while True:
msg = socket.recv()
socket.send_string('ack')
print(msg)
f.write(str(msg) + '\n')
import zmq
import random
import sys
import time
context = zmq.Context()
socket = context.socket(zmq.SUB)
ports = [5556]
socket.setsockopt(zmq.SUBSCRIBE, b"") # Note.
for port in ports:
print(port)
socket.connect("tcp://localhost:{}".format(port))
print('connected')
f = open('metatrader-1.csv', 'a')
while True:
msg = socket.recv()
print(msg)
f.write(str(msg) + '\n')
if (socket.bind("tcp://*:5556"))
{
Print("Error");
}
else
Print("Bound");