Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Zmq子套接字未接收MQL5 Zmq发布套接字_Python_Python 3.x_Zeromq_Pyzmq_Mql5 - Fatal编程技术网

Python Zmq子套接字未接收MQL5 Zmq发布套接字

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");

我试图在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");
   }
   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");