文章 "使用命名管道与 MetaTrader 5 进行无 DLL 通信"

 

新文章 使用命名管道与 MetaTrader 5 进行无 DLL 通信已发布:

许多开发人员面临同样的问题 - 如何在不使用不安全 DLL 的情况下到达交易端沙箱。

一种最简单和最安全的方法是使用作为普通文件操作的标准命名管道。它们允许您组织程序之间的处理器间客户端-服务器通信。虽然《一个使用命名管道在 MetaTrader 5 客户端之间进行通信的无 DLL 解决方案》一文已经就此主题说明了对 DLL 访问的启用,我们将使用客户端的标准和安全的功能。

您可以在 MSDN 库中找到有关命名管道的更多信息,但我们将着手处理 C++ 和 MQL5 实例。我们将实施服务器、客户端、其间的数据交换以及性能基准。

作者:MetaQuotes Software Corp.

 
测试仪中的点子有用吗?
 
Graff:
管道在测试仪中工作吗?

为什么不同终端之间的通信要在测试仪中进行?

通过事件进行通信,它们在测试仪中也能正常工作。

 
Urain:

为什么不同终端之间的通信可以在测试仪中正常工作?

你应该试试,但我不知道为什么...:)


通过事件来实现,它们在测试仪中正常工作。

什么通过事件?

;)

 

命名管道可在本地代理中使用,但在群组中被禁用。

也就是说,单个测试和大规模本地代理都可以连接到第三方(不仅是本地)管道服务器。

 
MetaDriver:
为什么不呢,值得一试,我也不知道为什么。:)


什么通过事件?

;)

抓住问题的本质,如果一个人需要在测试仪中的程序之间进行通信,那么在一个终端中的程序之间进行数据传输的任务是可见的,而且可以通过事件来完成,省略这些废话,我的答案是非常合乎逻辑的。
 
Urain:
如果一个人需要在测试仪中的程序之间进行通信,那么在一个终端中的程序之间进行数据传输的任务是显而易见的,这可以通过事件来完成,省略这些废话,我的答案是非常合乎逻辑的。
在我看来,他只是对从外部程序监控测试过程感兴趣。
 

一目了然,有两种使用方法:

有关此主题的文章将非常有趣。

 
Rosh:

一目了然,有两种使用方法:

有关这一主题的文章将非常有趣。

遗憾的是,只有那些懂得 Windows 下 C 语言编程的人才能做到这一点,因为..:

Renat:
请注意,这是客户端支持,不能在终端创建服务器连接器。

也就是说,在客户端-服务器技术中,如果没有服务器的调解,两个客户端是无法看到对方的。我曾研究过在其他编程语言中创建命名通道的问题,但遗憾的是,在大多数编程语言中,你都只能通过标准方法创建 Windows 客户端,而在 Unix 中创建通道几乎没有任何问题。

我们需要 EXE 外壳形式的网关,它可以根据算法全双工连接两个命名通道:

  1. 创建两个命名通道 A 和 B
  2. 创建第一个子进程,监听通道 A 的连接。
  3. 在等待信息的客户端连接到通道 A 后,创建第二个子进程,监听通道 B 的连接。
  4. 开启第一个子进程,从通道 A 向通道 B 循环传输字节流。
  5. 一旦有客户端连接到信道 B,第二个子进程就会启动,从信道 B 向信道 A 循环读取字节流。
  6. 第二个客户端开始从 B 频道向 A 频道传输第一条信息。
  7. 以此类推,直到某个客户端退出,然后两个通道都被破坏,我们继续回到第 1 点。1

当然,在单任务 MQL 脚本中不需要全双工,因为客户端不能异步接收和发送信息。但半双工只适用于服务器知道交换协议的情况,服务器可以很容易地计算出从一个客户端到另一个客户端的接收-发送在哪里结束,从而切换到相反的模式。如果服务器不知道,因为它没有心灵感应能力,而且只有使用只有它们自己知道的协议进行交换的客户机才知道,那么就需要使用带有两个子进程的全双工网关。这样的网关很方便,因为每个客户机只有一个与另一个客户机通信的通道,如果客户机在初始循环中一定会检查连接的可能性,那么客户机方面的连接顺序就不会起任何作用。网关算法排除了客户机连接的可能性,根据协议,第一个客户机必须在第二个客户机连接之前发送一条信息,否则就不会向空客户机发送信息。

从理论上讲,由于命名信道的数量是无限的,因此可以根据该算法创建一个单任务单工网关:

  1. 创建第一个命名通道,用于从网关向客户端传输信息
  2. 在第一个客户机建立连接后,创建第二个通道,用于接收来自客户机的信息
  3. 发送客户端连接到第二个信道后,该过程将字节流从接收信道循环到发送信道。
  4. 一旦有客户端退出,我们就会删除两个通道,然后继续执行步骤 1。

在这种情况下,你需要两个这样的网关来连接两个半双工客户机,如果只使用单工,则需要一个网关。与全双工网关相比,它的缺点是在 MQL 脚本中必须编写两个通道(用于接收和传输),而且还要严格遵守连接顺序:先接收,后传输(否则第二个通道将永远无法创建)。该网关的算法还排除了连接客户端的可能性,根据协议,第一个客户端必须在第二个客户端连接之前传输信息,否则将无法传输到空处。

当然,网关应提供根据接收-发送-连接客户端的顺序配置通道名称的可能性,例如在启动时通过命令行进行配置。

如果有人用 C 语言编程创建了这样的网关,并将其编译成 EXE 发布在这里,那么使用标准 MQL5 工具就可以轻松创建脚本、智能交易系统和指标之间的连接,而无需使用其他编程语言。

理论上,您也可以撰写一篇文章,介绍如何将客户端与此类网关正确连接起来,从而避免使用 MQL 之外的语言创建服务器(我可能不是唯一一个不会使用 C 语言编程的人,对吧?也就是说,我用 MQL 编写文章和示例,C-sh 程序员用 C 和 EXE-shniki 编写网关。费用由双方分担。

 
服务器非常简单,全部采用源代码,包括 /release 目录中已编译的 exe 文件。测试很容易重复。
 
Renat:
顺便说一下,这些示例显示的是全双工交换,您无需等待任何人。服务器很简单,全部采用源代码,包括 /release 目录中的编译后 exe 文件。测试很容易重复。

这不是重点。我试着运行了你的例子。可以运行。但它没有任何用处,也就是说,我试过了,仅此而已,可以删除,因为不再需要它了。

一方面,你摆脱了 dll,但另一方面,要在应用程序中使用,你又需要其他编程语言的拐杖。

建议方法的缺点是,它只适用于使用 MQL 以外的语言开发应用程序并支持 Windows API 的程序员。也就是说,提议的示例并不通用,不加修改就无法适用于其他任务。而每个人都有不同的任务。这意味着,用户将不得不在两个脚本之间创建即使是基本的信息交换,以便学习除 MQL 之外的另一种语言,从而在其上创建一个服务器,在其中需要编写与交换协议相关的一些逻辑。

我建议只创建一次网关,编译后供所有用户使用,这样任何用户都可以只使用标准 MQL 工具创建连接。

例如,对我来说,打开或关闭 C 语言的原始文件没有任何区别。因为我不会用 C 语言写任何东西,而且整理航班也需要时间。我甚至无法编译这些相同的原始文件。而在纯 Java 以及许多其他编程语言中,您只能使用标准工具通过文件流创建客户端连接。如果有一个网关,至少可以通过单工方式连接两个命名通道,那就没有问题了。我可以在客户端编写交换协议,通过几个网关进行连接,调试后一切正常。也就是说,没有必要为每个任务设计和创建一个单独的服务器。

而在目前,即没有网关的情况下,许多人将不得不安装 C 语言的开发环境,学习新的编程语言,等等。

网关根本不在乎:它从一个客户端接收到什么,就发送给另一个客户端。虽然逻辑很简单,但它可以将两个客户端连接起来,而不需要任何额外的拐杖和手鼓,也就是说,它是通用的,与信息交换协议和 C 语言知识无关。

在这里,正如人们常说的,饱汉不知饿汉饥。用 C 语言开发的人不可能发现任何问题。至于其他人,我们可以按照自己的意愿来处理这个系统。