为什么要把 MQL5 与 Python 集成?
全方位的数据处理需要大量工具,并且经常超出单一应用程序的功能沙箱。专用编程语言正在用于处理和分析数据,统计和机器学习。Python 是数据处理的主要编程语言之一。一个非常有效的解决方案是利用语言的力量并包含函数库来开发交易系统。
在两个或更多个程序之间实现交互存在众多不同的解决方案。套接字是最快速、最灵活的解决方案之一。
网络套接字是计算机网络上进程间通信的端点。MQL5 标准库包含一组 Socket 函数,这些函数为在互联网上操作提供了一个低层接口。这是不同编程语言的通用接口,因为它在操作系统级别进行系统调用。
价格之间的数据交换是通过 TCP/IP(传输控制协议/互联网协议)实现的。因此,进程可以在单个计算机内,以及通过局域网或互联网进行交互。
若要建立连接,必须创建并初始化 TCP 服务器,以便客户端进程连接。一旦交互进程完成,则连接必须强制关闭。TCP 交换中的数据是字节流。
创建服务器时,我们需要将套接字与一个或多个主机(IP 地址)的未使用端口相关联。如果未设置主机列表,或将其指定为 “0.0.0.0”,则套接字将监听所有主机。如果指定 “127.0.0.1” 或 “localhost”,则只能在 “内部循环” 内连接,即仅在一台计算机内监听。
由于在 MQL5 中只提供客户端,我们利用 Python 创建一个服务器。
利用 Python 创建套接字服务器
本文的目的并非教授 Python 编程的基础知识。因此,假定读者熟悉这种语言。
我们将使用 3.7.2 版本的内置 socket 软件包。更详细信息,请阅读相关文档。
我们将编写一个简单的程序,它创建一个套接字服务器,并从客户端(MQL5 程序)接收必要的信息,处理它并发回结果。这似乎是最有效的交互方法。假设我们需要使用机器学习函数库,例如 scikit learn,它将计算价格的线性回归并返回坐标,根据这些坐标可以在 MetaTrader 5 终端中绘制一条线。这是基本的示例。然而,这种交互也可以用于训练神经网络,用于从终端发送数据(报价),学习并将结果返回给终端。
我们来创建 socketserver.py 程序并导入上述函数库:
import socket, numpy as np
from sklearn.linear_model import LinearRegression
现在我们可以继续创建一个负责处理套接字操作的类:
class socketserver:
def __init__(self, address = '', port = 9090):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.address = address
self.port = port
self.sock.bind((self.address, self.port))
self.cummdata = ''
def recvmsg(self):
self.sock.listen(1)
self.conn, self.addr = self.sock.accept()
print('connected to', self.addr)
self.cummdata = ''while True:
data = self.conn.recv(10000)
self.cummdata+=data.decode("utf-8")if not data:break
self.conn.send(bytes(calcregr(self.cummdata), "utf-8"))return self.cummdata
def __del__(self):
self.sock.close()
创建类的对象时,构造函数将获取主机名(IP 地址)和端口编号。然后创建 sock 对象,该对象与地址和端口 sock.bind() 相关联。
recvmsg 方法监听传入连接 sock.listen(1)。当传入的客户端连接到达时,服务器会接受它 self.sock.accep