如何将nproducer(connect)和1consumer(bind)MT4构造到Python的普通zeroMQ单向PushPull模式

2024-04-29 16:13:50 发布

您现在位置:Python中文网/ 问答频道 /正文

多个用户将数据从Metatrader 4推送到Python后端。因此Metatrader 4(=生产者)的运行实例的数量是动态的。MT4的每个实例都将在用户的本地机器上运行,创建自己的zmq.上下文以及zmq插座(推)。所以我们最终得到一个基本上是N:1的结构:

你知道吗|-------------------生产商1-----生产商2-----生产商3-----生产商4-----生产商X---------------------------------------------------------------------\124;-------------------\ 124;-------------------\ 124;-----------------------------\ br/>……………………………..\124;--------------消费者/后端------------------|........................................... 你知道吗

这就是说,消费者将全天候运行并等待来自任何生产者的数据。例如,如果有160个用户在线使用服务,消费者将不得不处理来自这160个节点的数据输入,以此类推。接收到的消息的顺序并不重要,如果一些消息偶尔掉下来也不重要。你知道吗

enter image description here

当前状态:
现在,我的代码(见下文)在我自己的本地机器上使用一个Metatrader 4实例运行得非常好。但是如果MT4有X个实例,并且所有实例都有自己的zmq上下文,并且在本地metatrader 4实例中推送套接字来发送数据,会发生什么呢?它也会像预期的那样工作吗?你知道吗

代码生成器端(Metatrader 4实例),每个用户都将在其本地计算机上运行:

extern string ZEROMQ_PROTOCOL = "tcp";
extern string HOSTNAME = "localhost";
extern int PUSH_PORT = 32225;

// CREATE ZeroMQ Context
Context context(PROJECT_NAME);

// CREATE ZMQ_PUSH SOCKET
Socket pushSocket(context, ZMQ_PUSH);

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit()
  {

//---

   EventSetTimer(1);     // Set Second Timer as push intervall

   context.setBlocky(false);

   // Send data to PULL_PORT that consumer is listening to.
   Print("[PUSH] Connecting MT4 Dashex Feeder to Dashboard on Port " + IntegerToString(PUSH_PORT) + "..");
   pushSocket.connect(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUSH_PORT));

   pushSocket.setSendHighWaterMark(1);
   pushSocket.setLinger(0);   

   return(INIT_SUCCEEDED);
  }

//---

void OnDeinit(const int reason)
{

//---

   Print("[PUSH] Disconnecting MT4 Dashex Feeder on Port " + IntegerToString(PUSH_PORT) + "..");
   pushSocket.disconnect(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUSH_PORT));

   // Shutdown ZeroMQ Context
   context.shutdown();
   context.destroy(0);

   EventKillTimer();
}

[...]

pushSocket.send(StringFormat("%s", account_info, true));

Python后端使用者:

# create zeroMQ Pull Socket to fetch data out of the wire
context = zmq.Context()
zmq_socket = context.socket(zmq.PULL)
zmq_socket.bind("tcp://*:32225")
time.sleep(1)

while True:
    # check 24/7 for available data in the pull socket
    try:
        [...]

问题:

1.)当前代码为用户本地计算机上运行的每个metatrader 4实例创建一个新的上下文和套接字,并在MT4关闭后再次关闭它们。多个MT4实例/推送套接字能否同时向同一个使用者发送数据?(这是我想要的结果)

2.)另外,每个终端实例是否可以使用相同的套接字端口,或者每个终端实例是否需要唯一的套接字端口?

3.)我应该使用不同的模式吗?你知道吗

事先非常感谢您的想法和意见。你知道吗


Tags: to数据实例用户portcontext消费者socket
1条回答
网友
1楼 · 发布于 2024-04-29 16:13:50
  1. 只有在使用inproc传输时才需要共享上下文。当您使用tcp时,它将如您所期望的那样工作。你知道吗
  2. 终端将使用python后端指定的端口connect()。因此,是的,所有的终端将连接到端口32225在您的代码中指定。你知道吗
  3. 推/拉模式似乎是一个不错的选择,应该可以很好地工作。如果您担心python后端上的开销(许多连接),可以在终端和后端之间放置一个zeromq代理(PULL/PUSH)进程。你知道吗

相关问题 更多 >