文章 "用于MetaTrader 5的WebSocket:借助Windows API实现异步客户端连接"

 

新文章 用于MetaTrader 5的WebSocket:借助Windows API实现异步客户端连接已发布:

本文详细介绍了开发一款自定义动态链接库的过程,该库旨在为MetaTrader程序提供异步WebSocket客户端连接功能。

在文章《MetaTrader 5中的WebSocket:使用Windows API》中,阐述了如何在MetaTrader 5应用程序中利用Windows API实现WebSocket客户端。但其中所展示的实现方式受限于其同步运行模式。

在本文中,我们将再次探讨如何使用Windows API为MetaTrader 5程序构建WebSocket客户端,目标是实现异步客户端功能。实现这一目标的一种实用方法是创建一个自定义动态链接库(DLL),该库导出适合与MetaTrader 5应用程序集成的函数。

因此,本文将讨论该DLL的开发过程,并通过一个MetaTrader 5程序示例展示其应用。

用于MetaTrader 5的WebSocket:借助Windows API实现异步客户端连接


作者:Francis Dube

 
这是一篇出色的文章。你鼓励我在有时间的时候分享我的 IOCP 资料库。干得好,感谢分享。
 

你好,我也认为这是一篇很好的文章。

我正在开发一个使用多个指标的 EA。 最初,我选择将指标计算功能化,以便它们既能在指标图中使用,也能在 EA 中使用。 在策略测试器中 测试时,我发现在可视模式下运行的指标和 EA 确定的值之间,Bars 函数返回的值不同。您知道如何向开发人员报告这个问题以及我在 MLQ5 中发现的其他错误吗?

简单的解决方案是使用 iCustom,我以前在 MQL4 中使用过 iCustom。 但是,MQL5 版本只允许在第一个指标绘图上使用 CopyBuffer,而我的许多指标都有多个绘图缓冲区。

我能想到的解决方案有:使用 WebSockets 在多个指标和 EA 之间进行通信,使用命名管道进行相同的通信,或者将指标分离成单个缓冲区绘图,这将大大增加处理量,因为相同计算的数量会成倍增加,而且要保持十几个或更多指标的同步以确保计算的准确性将是一场噩梦。

由于 WebSockets 是异步的,如果 ea 几乎同时从指标获取数十个数据流,会产生什么影响? 它能否跟上,还是会出现溢出?

如果能提供任何建议,我们将不胜感激。

感谢您的回复


科达角

 
CapeCoddah 策略测试器中 测试后,我发现在可视模式下运行的指标和 EA 确定的值之间,Bars 函数返回的值不同。您知道如何向开发人员报告这个问题以及我在 MLQ5 中发现的其他错误吗?

简单的解决方案是使用 iCustom,我以前在 MQL4 中使用过 iCustom。 但是,MQL5 版本只允许在第一个指标绘图上使用 CopyBuffer,而我的许多指标都绘制了多个缓冲区。

我能想到的解决方案有:使用 WebSockets 在多个指标和 EA 之间进行通信,使用命名管道进行相同的通信,或者将指标分离到单个缓冲区绘图中,这将大大增加处理量,因为相同计算的数量会成倍增加,而且要保持十几个或更多指标的同步以确保计算的准确性将是一场噩梦。

由于 WebSockets 是异步的,如果 ea 几乎同时从指标获取数十个数据流,会产生什么影响? 它能否跟上,还是会出现溢出?

如果有任何建议,我们将不胜感激。

感谢您的回复


科达角

您好:

简单的解决方案是使用 iCustom,我以前在 MQL4 中使用过 iCustom。但是,MQL5 版本只允许在第一个指标图上使用 CopyBuffer,而我的许多指标图都有多个缓冲区。

这是不正确的。您可以复制任何您想要的缓冲区。CopyBuffer 函数的所有三个重载都允许您复制指定的任何缓冲区。以第一个版本(如下所示)为例:

int  CopyBuffer(
   int       indicator_handle,     // 指标句柄
   int       buffer_num,           // 指示器缓冲区编号
   int       start_pos,            // 起始位置
   int       count,                // 复制的数量
   double    buffer[]              // 要复制的目标数组
   );

第二个参数 "buffer_num "允许您指定要复制的缓冲区--从索引 0 开始作为第一个缓冲区,索引 1 作为第二个缓冲区等,从而允许您从自定义指标中复制任何您想要的缓冲区。例如,内置的 iMACD 就有 2 个缓冲区(
0 - MAIN_LINE,1 - SIGNAL_LINE)。 我建议您在尝试 WebSockets 或任何类型的套接字之前,先用 iCustom 指标来解决您的问题。这是一个简单得多的解决方案,不需要任何外部库,如 C++ DLL 等。始终尽量使用 MQL5 语言,除非绝对必要,否则避免使用 DLL。 我用 C、C++、C# 等语言进行开发,我可以根据经验告诉您,坚持使用 MQL5(一种极其强大的语言,尽管有其局限性--与其他语言一样)是最好的方法。

让我知道您的进展情况
如果您在使用 "CopyBuffer "时遇到任何问题,请随时询问。如果您从 MQL4 转到 MQL5,有些事情的处理方式会有所不同,因此您的 MQL4 知识可能无法直接移植。但请继续努力,MQL5 会更好,功能更强大,速度更快。

祝你好运。

 

请查看以下示例代码:

代码库

用于 MT5 的 Brooky 趋势强度

Ryan L Johnson, 2025.04.29 19:52

该指标调用其他 3 个子窗口指标。所有文件都放在您的 "指标 "文件夹中。
同样的基本前提也适用于 EA。
 
Ryan L Johnson #:

在以下网站查看一些示例代码可能会有所帮助:

同样的基本前提也适用于 EA。

这是一个非常好的想法。

 

感谢两位对我问题的回复。 我一定是错过了重载函数定义,只读到了第一个。 你们是否知道终端是否足够智能,可以并行处理 iCustom 调用,以最大限度地利用处理器,因为我计划改变 28 个交易对中每个交易的符号参数,并计划像 Brooky Trend Strength 一样使用多个 iCustom 调用。

另外,你们谁能告诉我在哪里可以发表对 MQ5 中错误的意见,以及对 Mq 管理员的建议。 我已经发现了一些问题,最近的问题是终端和策略测试器 之间的Bars 差异。 另外,我有一个 3 屏幕设置,主显示屏在最左边。 尝试移动一个面板,如导航器或市场面板。拖动鼠标指针是在最左边的屏幕上,但拖动的面板却在中间。 当鼠标移动一个像素,然后切换显示屏将面板移动一个像素,然后再移动回来时,我认为终端或 Windows 都疯了。

 
CapeCoddah 策略测试器 之间的Bars 差异。

如果缺少价格数据,Bars() 就会打嗝,而 rates_total 则不会。如果我没记错过去读过的文章,Bars() 可以通过参考时间戳来修复。也许值得一试。

CapeCoddah#:
我有一个 3 屏幕设置,主显示屏在最左边。 尝试将一个面板(如导航器或市场面板)从左边移到右边非常麻烦。 拖动鼠标指针在最左边的屏幕上,但拖动的面板在中间。 当鼠标移动一个像素,然后切换显示屏将面板移动一个像素再移回来时,我认为终端或 Windows 都疯了。

我真的不知道该怎么办。我有 3 台电脑,每台电脑都有自己的显示器和终端。我知道 Windows 一般都有多显示器显示设置,包括画中画可能是一种解决方法。

能否请其他真正在一台机器上使用多台显示器的人在此提供帮助?

 

很棒的信息

我的问题是,在终端中两者是相同的,但在STrategy Tester Visualize 中,Bars 是更大的一个,这导致我没有将文档读完。 我将采纳您的意见并将其用于 iCustom。 我推测,必须为每种符号和时间规格组合设置一个单独的 iCustom 地址。

另外,有没有办法让 EA 在策略测试器的屏幕上显示文本? 在 Mq4 中,它可以自动显示,但现在不行了。 我使用大量类对象来显示信息,在模板中放置第二个副本会使策略测试器的运行速度更慢。

关于 3 面板显示,我认为问题在于当鼠标从屏幕 2 移动到屏幕 1 时,终端无法正确更新显示器位置。

我有两台迷你电脑,每台都支持 3 个显示器,因此我将 3 个屏幕连接到两台迷你电脑上,一台电脑使用 HDMI1,另一台电脑使用 HDMI2。 虽然必须确保遥控器正确配置为只控制一个显示器(请致电亚马逊支持中心),但与 43 英寸 Fire 电视机配合使用效果非常好。 唯一的缺点是开关按钮会关闭所有显示器,有时我需要拔掉插头来同步电源。


科达角

 
CapeCoddah STrategy Tester Visualize 中,Bars 却大了一圈,这导致我没有将文档读完。 我将采纳您的意见并将其用于 iCustom。 我推测,符号和时间规格的每种组合都必须有一个单独的 iCustom 地址。

  1. iCustom() 的多个实例可以重复使用单个目录中的单个指标文件。
  2. 多个 CopyBuffer() 实例可以重复使用单个指标句柄。
  3. 我现在明白你为什么要使用 Bars(),因为 rates_total 本身仅限于单个时间框架。您大概是在每个时间框架的单独循环中使用 Bars()。

CapeCoddah#:
另外,有没有办法让 EA 在策略测试器的屏幕上显示文本? 在 Mq4 中,它可以自动显示,但现在不行了。 我使用大量类对象来显示信息,在模板中放置第二个副本会使策略测试器更慢。
据我所知不会。您已经在使用我从测试可视化 MT5 帮助页面中了解到的唯一方法。
CapeCoddah#:
关于 3 面板显示,我认为问题在于当鼠标从屏幕 2 移动到屏幕 1 时,终端没有正确更新显示器位置。
遗憾的是,我无法用自己的设置来测试这个问题。您是否在所有显示器上拉伸了一个 MT5 终端屏幕?我见过其他人用这种方法解决问题。