多个用户将数据从Metatrader 4推送到Python后端。因此Metatrader 4(=生产者)的运行实例的数量是动态的。MT4的每个实例都将在用户的本地机器上运行,创建自己的zmq.上下文以及zmq插座(推)。所以我们最终得到一个基本上是N:1的结构:
你知道吗|-------------------生产商1-----生产商2-----生产商3-----生产商4-----生产商X---------------------------------------------------------------------\124;-------------------\ 124;-------------------\ 124;-----------------------------\ br/>……………………………..\124;--------------消费者/后端------------------|........................................... 你知道吗
这就是说,消费者将全天候运行并等待来自任何生产者的数据。例如,如果有160个用户在线使用服务,消费者将不得不处理来自这160个节点的数据输入,以此类推。接收到的消息的顺序并不重要,如果一些消息偶尔掉下来也不重要。你知道吗
当前状态:
现在,我的代码(见下文)在我自己的本地机器上使用一个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.)我应该使用不同的模式吗?你知道吗
事先非常感谢您的想法和意见。你知道吗
inproc
传输时才需要共享上下文。当您使用tcp
时,它将如您所期望的那样工作。你知道吗connect()
。因此,是的,所有的终端将连接到端口32225在您的代码中指定。你知道吗相关问题 更多 >
编程相关推荐