多线程计算示范:MetaTrader 5的伪指标解析

Mike 2020.01.17 05:13 18 0 0
附件

大家好,今天我想和大家分享一个关于MetaTrader 5的有趣工具——伪指标。这个指标没有缓冲区,主要是为了展示多线程计算的技术。

这个伪指标可以发出命令,执行一些耗时的计算,而且这些计算会在单独的线程中进行。这些线程是为图表对象创建的,并使用了工作专家顾问。我们在随附的头文件MultiThreadedObjectWorker.mqh中提供的类会自动创建图表对象,并将指定的工作专家顾问应用到每个对象上。一旦计算完成,图表对象会自动从图表中移除。

这个示例主要面向有编程背景的用户。

这个想法来源于一篇关于多线程异步Web请求的文章。你可以在文章中找到关于消息(事件)如何调度,以及如何在图表之间传递数据的所有技术细节。

与文章中的实现相比,这个指标采用了更“紧凑”的实现方式,使用图表对象而不是完整的图表窗口。你可以在论坛上找到更多细节。

在编译和运行指标MultiThreadedIndicator之前,请确保工作专家顾问MultiThreadedObjectWorker已经编译。

输入参数

  • sinput int _Cores = 1; - 使用的线程数量(不要超过可用的物理核心数量)
  • sinput int _Tasks = 1; - 同时执行的伪任务数量(使用大于核心数量的数字以查看并行性能)
  • input string MultiThreadedScriptPath = "Experts\MultiThreadedObjectWorker.ex5"; - 必须指明工作专家顾问的路径

每个伪任务会计算一系列平方根函数(仅用于演示目的)。你可以在你的MQL项目中将其更改为任何其他耗时的算法。

在将指标附加到图表后,请点击图表以启动并行计算。过程中的所有重要阶段(无论是在客户端还是工作MQL5程序中)都会记录日志。

发出并行计算请求的客户端MQL程序不仅可以是指标,也可以是专家顾问。脚本和服务不受平台支持。

使用头文件MultiThreadedObjectWorker.mqh,你应该实现MQL5客户端与工作专家顾问之间的数据传输。

以下是两个日志示例。

在2个核心上执行4个任务(2个线程并行)

在2个核心上执行4个任务(2个线程并行)

在2个核心上运行4个任务时,有2个并行线程,这使得执行速度比在1个核心上快了一倍(对比上面3354毫秒和下面6240毫秒)。

在1个核心上执行4个任务(单线程-标准MQL程序)

在1个核心上执行4个任务(单线程-标准MQL程序)

更多核心=更快的速度。

列表
评论 0