欢迎光临散文网 会员登陆 & 注册

股票量化:赫兹量化系统中对连通器的探索

2023-11-02 17:11 作者:大牛啊呢  | 我要投稿

套接字

套接字是软件实现的进程间交换数据的接口。 这些过程既可以在单台 PC 上启动,也可在连接到网络里的不同 PC 上启动。

MQL5 仅提供客户端 TCP 套接字。 这意味着我们能够发起连接,但我们不能等待并响应外部的连接请求。 所以,如果我们需要通过套接字在 MQL5 程序之间提供连通,则需要一个充当中介的服务器。 服务器等待并侦听端口的连接,并响应客户端的请求执行某些功能。 若要连接到服务器,我们需要知道其 IP 地址和端口。

端口是一个介于 0 到 65535 之间的数字。 有三个端口范围:系统保留(0 - 1023),用户(1024 - 49151),和动态端口(49152 - 65535)。 一些端口已分配给某些功能占用。 分配是由 IANA 执行,该组织负责管理 IP 地址区段和顶级域名,并注册 MIME 数据类型。

默认情况下,端口 3306 已分配给 MySQL。 当访问服务器时,我们将与其连接。 请注意,此端口值可以更改。 因此,在开发 EA 时,应在输入中设置端口以及 IP 地址。

Wireshark 流量分析器

流量分析器有助于调试应用套接字的程序代码。 缺了它,整个过程就像不用示波器进行电子设备维修一样。 分析器从选定的网络接口捕获数据,并以可读形式显示它们。 它跟踪数据包的大小,它们之间的时间间隔,重传和连接丢失是否存在,以及许多其他有用的数据。 它还解码许多协议。

为了令我们自己熟悉流量分析器,我们尝试与 “google.com” 服务器建立连接,并跟踪该过程。 为此,编写一个小脚本。

void OnStart()  { //--- Get socket handle   int socket=SocketCreate();   if(socket==INVALID_HANDLE)      return; //--- Establish connection   if(SocketConnect(socket,"google.com",80,2000)==false)     {      return;     }   Sleep(5000); //--- Close connection   SocketClose(socket);  }

为此,首先我们创建一个套接字,并利用 SocketCreate() 函数获取其控柄。 在这种情况下,按参考资料的说辞,您可能会得到两种情况的错误,尽管这几乎是不可能的:

  1. ERR_NETSOCKET_TOO_MANY_OPENED 错误信号表示已有多于 128 个以上的套接字被打开。

  2. 出现 ERR_FUNCTION_NOT_ALLOWED 错误则表示尝试从指标里调用套接字创建,而此功能是被禁止的。

得到控柄后,尝试建立连接。 在本示例中,我们连接到 “google.com” 服务器(不要忘记在终端设置中将其添加到允许的服务器地址中),即连接到端口 80,且超时为 2000 毫秒。 建立连接之后,等待 5 秒钟,然后将其关闭。 现在,我们在流量分析器窗口中看看它的样子。

顶部的三个数据包代表建立连接,而底部的三个数据包代表将其关闭。 “Time(时间)” 列显示数据包之间的时间,我们可以看到 5 秒钟的停顿时间。 请注意,数据包的颜色为绿色,与图例 2 中的不同。 这是因为在之前的情况下,分析器在数据交换中检测到 MySQL 协议。 在当前情况下,没有数据经过,分析器使用默认的 TCP 颜色显示数据包。



数据交换

根据协议,MySQL 服务器应在建立连接后发送应答语。 作为响应,客户端发送授权请求。 在 dev.mysql.com 网站上,该机制于连接阶段部分进行了详细阐述。 如果未收到服务端的应答语,则 IP 地址无效,或服务器正在侦听其它端口。 无论何种情况,这意味着我们已连接的绝对不是 MySQL 服务器。 在正常状况下,我们需要接收数据(从套接字读取数据),并解析它。


股票量化:赫兹量化系统中对连通器的探索的评论 (共 条)

分享到微博请遵守国家法律