我已经尝试但无法自己解决。
我知道MT4提供Pipe和WebRequest()
作为通信手段,但WebSocket不是作为编程的一部分构建的。所以现在,Pipe是唯一可用的东西。但是与管道的沟通在某些时候会中断。它在发送时会跳过一些信号。
我怎么能解决这个问题呢?
答案 0 :(得分:0)
MQL中的管道是通过文件实现的,因此您可以使用文件而不是管道 - 您将获得相同或更快的结果,而无需关心通信
答案 1 :(得分:0)
我怎么能解决这个问题呢?
多年前一直处于这样的需求,开始使用ZeroMQ / MQL4绑定,以便使MetaTrader终端在distributed-computing QuantFX分析和基于ML的增强交易系统内工作。
没有O / S localhost-only管道,没有基于文件的伪装,但是公平,分布式,低延迟的信令/消息传递,包括:
<< 80 [ms] RTT
如果要将集成需求保留在您自己的设计控制之下,ZeroMQ是一种方法。这里有一个简短的草图,在[ZeroMQ hierarchy in less than a five seconds]部分。
欢迎在posts on this and about the differences between WebSockets and ZeroMQ here及其他相关帖子中阅读更多zeromq。
答案 2 :(得分:0)
我尝试了ZeroMQ,但无法正常工作。 我现在正在使用WinSockets,到目前为止,它没有任何问题。
请参阅:https://www.mql5.com/en/blogs/post/706665 在这里,您将找到一种在MQL中将WinSockets用作服务器或客户端或两者兼而有之的方法。 我知道链接可能会失效,但是无法将文件附加到此答案,并且代码格式不正确,因此我无法包含它。
然后,您可以使用也支持套接字的任何编程语言与MQL EA进行通信。我正在使用内置节点实现。 参见:https://www.digitalocean.com/community/tutorials/how-to-develop-a-node-js-tcp-server-application-using-pm2-and-nginx-on-ubuntu-16-04
const net = require('net');
const port = 7070;
const host = '127.0.0.1';
const server = net.createServer();
server.listen(port, host, () => {
console.log('TCP Server is running on port ' + port + '.');
});
let sockets = [];
server.on('connection', function(sock) {
console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
sockets.push(sock);
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ': ' + data);
// Write the data back to all the connected, the client will receive it as data from the server
sockets.forEach(function(sock, index, array) {
sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + '\n');
});
});
// Add a 'close' event handler to this instance of socket
sock.on('close', function(data) {
let index = sockets.findIndex(function(o) {
return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
})
if (index !== -1) sockets.splice(index, 1);
console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
});
});