MT4通讯方式

时间:2018-05-24 12:30:18

标签: mql4 mt4

我已经尝试但无法自己解决。

我知道MT4提供Pipe和WebRequest()作为通信手段,但WebSocket不是作为编程的一部分构建的。所以现在,Pipe是唯一可用的东西。但是与管道的沟通在某些时候会中断。它在发送时会跳过一些信号。

我怎么能解决这个问题呢?

3 个答案:

答案 0 :(得分:0)

MQL中的管道是通过文件实现的,因此您可以使用文件而不是管道 - 您将获得相同或更快的结果,而无需关心通信

答案 1 :(得分:0)

  

我怎么能解决这个问题呢?

免费使用ZeroMQ或nanomsg信令/消息传递框架

多年前一直处于这样的需求,开始使用ZeroMQ / MQL4绑定,以便使MetaTrader终端在 QuantFX分析和基于ML的增强交易系统内工作。

没有O / S localhost-only管道,没有基于文件的伪装,但是公平,分布式,低延迟的信令/消息传递,包括:

  • 远程键盘/终端系统 - 控制台(是的,添加了DSL命令语言)
  • 远程集中日志(避免MQL4执行被资源争用阻止)
  • 分布式远程AI / ML预测引擎,延迟低于<< 80 [ms] RTT
  • 分布式远程自动化贸易管理处理

如果要将集成需求保留在您自己的设计控制之下,ZeroMQ是一种方法。这里有一个简短的草图,在[ZeroMQ hierarchy in less than a five seconds]部分。

欢迎在posts on this and about the differences between WebSockets and ZeroMQ here及其他相关帖子中阅读更多

答案 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);
    });
});