English Русский Español 日本語 Português
preview
市场模拟(第 10 部分):套接字(四)

市场模拟(第 10 部分):套接字(四)

MetaTrader 5示例 |
24 0
Daniel Jose
Daniel Jose

概述

在上一篇文章市场模拟(第九部分):套接字(三)中,我解释了创建迷你聊天所需的最后一步。目的是为了让您开始探索如何在 MQL5 中使用套接字。虽然这很有趣,将来可能会用到,但在回放/模拟器应用程序的背景下,我还没有决定如何实现订单系统。使用套接字通常只是在不同应用程序之间,甚至在不同操作系统之间传输信息的一种可行的替代方案。换句话说,您可以将数据从 Windows 系统传输到 macOS 或 Linux 系统,而无需实际知道源系统或目标系统。因此,我们甚至可以使用一个看似普通的系统来构建更复杂的东西,比如使用一组树莓派进行专门的计算。但这超出了本系列文章的讨论范围。这里的主要目的是让读者为回放/模拟器最终将要经历的下一个开发阶段做好准备。

然而,在文章市场模拟(第六部分):将信息从 MetaTrader 5 传输到 Excel 中,我演示了如何在 MetaTrader 5 和 Excel 之间传输信息。为什么选择 Excel?原因纯粹出于教育目的。我们本来可以使用其他任何程序。但是,Excel 让解释我们想要实现的目标变得更容易。使用 RTD 或 DDE 将数据传输到 Excel 是很常见的,但这种类型的通信总是单向的。换句话说,我们只能将数据发送到 Excel,永远不能快速读取在那里计算的数据,这将允许 MetaTrader 5 使用它。想象一下这带来的可能性:你可以使用一个简单的 EA 交易,同时将所有计算逻辑放在 Excel 中来控制它。这样一来,EA 交易就可以全自动运行,而无需通过 MQL5 进行调整和修改。在这种情况下,我们可以直接在 VBA 中实现。这可能看起来很复杂,但有了适当的知识和学习意愿,你会发现它相对简单。然而,这确实需要投入时间和精力去学习。

这就引出了另一个问题。RTD 系统本质上就是一个套接字。但它的配置仅允许单向通信。通过前三篇文章中对套接字的讲解,我们可以更清楚地认识到,我们可以实现一些更复杂的功能。再次声明,我在这里使用 Excel 纯粹是为了教学目的。事实上,你可以使用任何程序、应用程序或方法来实现同样的结果。然而,在展示实际实现之前,我希望您了解实现稍后将介绍的结果的可能性。

接下来,我们将进行一些更高级的操作。我相信很多读者都不熟悉我要介绍的内容。这个话题很有趣,但非常广泛。因此,我建议同时查阅本文末尾提供的参考文献,它们会非常有帮助。我们将使用的技术仍在开发中,但这并不意味着它不应该被研究。

由于我不想向 MQL5 代码中添加 DLL(至少目前不想),我们将探索一些非常有趣的东西。我将逐步介绍它,以便您可以跟随并了解我们将如何使 Excel 与 MetaTrader 5 通信。

这将在不使用以下方法的情况下完成:市场模拟(第六部分):将信息从 MetaTrader 5 传输到 Excel 。虽然这种方法有效,但它不是很灵活,迫使我们在使用套接字时做一些不必要的事情。最终,我们的目标是展示如何将数据从 Excel 传输到 MetaTrader 5,反之亦然。


开始在任务中使用 Python

等等,你刚才不是说我们要用 Excel 吗?我原以为我们会直接用 VBA 编程。怎么会使用 Python 了?冷静下来,亲爱的读者,我们确实会使用 Excel,但我们不会直接用 VBA 编写所有程序。从技术上讲,我们可以使用 VBA 来构建 Excel 和 MetaTrader 5 之间的通信。然而,如果我们这样做,我们将受到这两个程序所能做的限制。如果您想使用其他程序而不是 Excel 来协助 MetaTrader 5 进行市场操作,则必须重建整个通信系统。通过使用 Python 作为中间层,事情会变得更加灵活。Python 还简化了某些任务,即使没有 Excel,你也可以只用 Python 完成所有工作。但这并非我们此行的目的,我想使用 Excel,原因稍后会解释。这就是我们需要 Python 的原因。我们正在进行的操作如下图所示:


请注意,Python 位于中心,所有信息都通过它传递。我们的实际目标是将 MetaTrader 5 与 Excel 结合使用。但是,通过将 Python 置于中心,我们也可以摆脱 Excel,或者用任何其他应用程序代替它。

为什么选择 Python 而不是 C/C++?原因在于实用性。如果我们能更简单地使用 Python 实现出色的结果,那么用 C/C++ 编码就没有意义了。因为 Python 不断发展,为我们提供了越来越多的实用性。因此,我们将使用 Python 通过套接字与 MetaTrader 5 进行通信。

现在,有必要解释一件事。MetaTrader 5 允许您直接在图表上执行 Python 脚本,前提是您已正确配置。这种配置并不复杂,相反,一切都极其简单明了。您只需要下载并安装最新稳定版的 Python 即可。然后,在 MetaEditor 中,按如下所示设置 Python 可执行文件的目录:


请注意,您只需要指向包含 Python 可执行文件的目录。在撰写本文时,最稳定的版本是 3.11.3,但可能会有更新的版本。您可以从 Python.org 下载最新版本。

安装后,您就可以开始创建 Python 脚本了。尽管存在各种工具和编辑器来帮助编码,但您并不严格需要它们。您可以使用 MetaEditor 或您选择的任何编辑器。您可以选择下载一些工具来帮助编码,但我不会在这里推荐任何特定的工具。

回到在 MetaTrader 5 中使用 Python 的话题,我们在这里实际上不会这样做。然而,如果你愿意,你可以以任何你认为合适的方式使用它。我们实际要做的是完全用 MQL5 构建通信代码,就像之前的文章中所做的那样,并使用 Python 来简化为 Excel 创建套接字的任务。再次强调,虽然可以直接在 VBA 中创建套接字,但通过 Python 来创建套接字要简单得多,尤其是因为我们要做的是创建服务器端。在 MQL5 中,我们无法仅使用纯 MQL5 创建服务器。

然而,这里有一个重要的细节。如上图所示,仅在操作系统上下载并安装 Python 是不足以让您使用 Python 的,图中显示了 Excel 和 MetaTrader 5 之间通过 Python 进行的通信。我们需要在我们的机器上安装一个额外的组件 —— 当然,除了 Excel。正是这个额外的组件将使一切变得不同。


了解 xlwings

这就是我们需要添加的额外组件。xlwings 是一个模块,它允许我们运行 Python 脚本来替代 Excel 中的 VBA。是的,您可以在 Excel 中直接在 Python 中执行任务,而不是使用 VBA 执行相同的操作。然而,VBA 仍然有其用途,因为 xlwings 并不能完全取代 VBA。它只是扩展了可能性,使我们能够通过 Python 执行许多任务。

值得一提的是,还有其他模块可以实现与 xlwings 相同的功能。是的,它们确实存在。然而,在某些情况下,它们是要购买许可证的。对于 xlwings,非商业用途无需额外费用即可使用。由于大多数时候你会在实验的同时学习,而不是真正创造商业化的东西,xlwings 在学习过程的开始是一个很好的选择。特别是因为它很简单,正如你将看到的。


安装 xlwings

在参考资料部分,我将指出如何访问文档并更好地理解 xlwings。然而,为了使事情更容易,在本文中,我将展示您应该如何在第一阶段进行。首先,我们需要安装 Python。在 Python 安装过程中,您必须选中下图中指示的选项。


如果不这样做,之后您需要手动将 Python 路径添加到 Windows 环境变量中才能使其正常工作。如果您已经具备较多的 Python 使用经验,则无需添加路径变量。但在这里,我们将假设您之前完全没有 Python 经验。因此,我们将使用默认设置进行所有操作。等待 Python 安装完成。

屏幕上将显示以下内容。


如果单击突出显示的选项,则可以使用长文件名。这是个人选择,有些人不喜欢使用过长的文件名。如果情况确实如此,只需点击 “关闭 ”按钮,就完成了。但是,如果您希望使用长度超过 256 个字符(或在 Python 中为 260 个字符)的名称,建议单击突出显示的选项。这样,Python 就能处理这类名称了。

接下来,我们将打开命令提示符。您可以使用 PowerShell,但我个人更喜欢传统的 CMD。我建议您在提示中做的第一件事是键入下面显示的命令。


我将尝试以这种方式呈现事情:一个接一个命令,以及结果,以便清楚地知道正在做什么。输入命令后,可以看到 Python 默认安装了两个软件包。其中一个软件包已经需要升级,所以请输入命令。结果如下所示。


好,系统更新完毕后,我们可以继续讨论 xlwings了。xlwings 是一个可以连接到 Excel 的插件。但是,正如您将在文档中看到的那样,它并不严格需要 Excel。总之,我们将采用实际使用 Excel 的方式来进行。Excel 安装完成后,界面将如下图所示。


请注意,此时 Excel 功能区没有任何变化。因此,返回命令提示符/PowerShell,输入如下图所示的命令。


如您所见,此命令下载 xlwings 并将其安装为 Python 包。当您再次检查已安装的软件包时,您将看到如下所示的结果:


xlwings 版本可能有所不同,因为它会不时更新。但是,请注意,除了 xlwings 之外,还安装了另一个软件包:pywin32。别担心,这只是 xlwings 的一个依赖项。

下一步是获得 xlwings 的授权。但别担心,由于我们将以非商业方式使用它,也就是说,我们不会出售或将这里所做的工作商业化,因此我们可以专门为此目的使用许可证。只需按照下图所示步骤操作,即可获得 xlwings 的授权。


非常好,非常好,现在我们差不多准备就绪了。剩下的唯一工作就是将 xlwings 与 Excel 集成。此时,有几个问题需要考虑。第一个问题是:你真的想通过 Excel 运行 Python 应用程序,还是想在 Excel 的操作方式上用 Python 取代 VBA?我之所以提到这一点,是因为如果您只想创建用 Python 编写的 Excel 宏,实际上并不需要将 xlwings 加载项添加到 Excel 中。在宏编辑过程中,您只需要执行一小步。这样就可以将 VBA 和 Python 集成到 Excel 中。

但是,如果您真的想在 Excel 中运行 Python 脚本,最好将 xlwings 添加为 Excel 加载项。通过这样做,将在功能区中创建一个新区域,允许您直接从 Excel 运行 Python 脚本,而不会出现问题或复杂情况。虽然你仍然需要执行一些额外的步骤来确保一切正常工作。

所有这些内容在 xlwings 文档中都有详细说明。因此,如果您有任何疑问,请参阅 xlwings 文档以了解如何继续。在本文的最后,我将提供参考资料,以便您可以直接访问相关材料。

不过,在这里我将做出以下假设:读者对 xlwings 一无所知,并且刚刚开始学习 Python。在这种情况下,理想的方法是将 xlwings 添加为插件,并使其可在宏中使用。随着时间的推移,您将能够确定哪种方法最适合您。


将 xlwings 添加为 Excel 插件

添加 xlwings 作为插件并不是最复杂的任务之一。事实上,这很简单。你可以选择两种方法。请记住,这里我们使用的是标准安装方式。如果你更有经验,你可以用其他方式配置它。

第一种方法是直接通过 Excel,从 Excel 内部添加 xlwings 作为插件。为此,您必须选择以下选项:


然后,选择下图所示的选项:


这将向功能区添加 “开发人员” 选项卡。在 “开发人员” 选项卡中,选择下图所示的项目:


这将会打开以下窗口:


这里列出的是 Excel 安装包中的默认插件。要从此窗口添加 xlwings,您必须单击“浏览”按钮并导航到以下路径:

C:\Users\ {USERNAME} \AppData\Local\Programs\Python\Python311\Lib\site-packages\xlwings\addin

请记住,此路径指的是默认的 Python 安装路径。{USERNAME} 值表示安装 Python 时使用的 Windows 用户名。Python311 值表示当前安装的 Python 版本。这就是为什么在程序安装过程中知道自己在做什么很重要。如果在安装过程中更改任何内容,这些值将不同。无论如何,我们的想法是找到下面图像中显示的文件:


添加这些文件后,您将能够直接从 Excel 功能区访问该插件。不过,我个人更喜欢用第二种方法来完成同样的添加。这是因为我们已经打开了命令提示符,我们只需要输入以下命令:


在这两种情况下,结果都是一样的,如下图所示。有一个细节可能会影响您选择哪种添加插件的方法。这一细节与以下事实有关:在提示符中执行的所有命令都可以放入批处理文件中。这样一来,您就可以自动执行所有这些键入的命令,从而使整个集成过程更快、更容易。


请注意,Excel 中新增了一个名为 xlwings 的选项卡。在这里,您可以使用以 Python 编写的脚本。然而,要使其完美工作,还需要一些细节。再次提醒,请仔细阅读 xlwings 文档,学习如何正确执行此操作,因为您可能会尝试以 xlwings 不期望的方式执行操作。在这种情况下,即使一切正常,您也会始终收到错误消息。

但事实上,还有一点很重要。使 Python 脚本像 VBA 编写的宏一样执行,在我看来,最有趣的是将两者结合起来:将 VBA 与 Python 结合使用。但这完全取决于你。本文的目的只是提出一个问题的解决方案。问题是如何轻松地在 Excel 和 MetaTrader 5 之间传输信息。我们还没有达到那个目标,但我们已经非常接近了。

进一步的解释与 VBA 有关。为了保持条理清晰,我们接下来讨论一个新的话题。


将 Python 与 VBA 集成

为了让你在用 VBA 编写的代码中直接使用 Python,除了我们在这里实际使用的方法外,还有一些不同的方法。其中一种方法是进行 SHELL 调用。这种方法确实可行,但会带来一些不便,而使用 xlwings 甚至其他与 xlwings 功能相同的工具则不会遇到这些问题。

下面展示了一个允许从 VBA 代码中执行 Python 脚本的 SHELL 调用示例:

Sub CallPythonInVBA()
        Dim vbaShell as Object
        
        Set vbaShell = VBA.CreateObject("WScript.Shell")
        vbaShell.Run """<PATH OF PYTHON>\python.exe""" & """<PATH OF SCRIPT>\Script.py"""
        
End Sub

VBA 宏

上面的代码片段允许 VBA 执行 Python 脚本,它确实有效。但是请注意, <PATH OF PYTHON> 的值必须指向 Python 可执行文件的位置,就像<PATH OF SCRIPT> 必须指向要执行的文件的正确路径一样 —— 在本例中,该文件名为 Script.py。

当你可以将 Python 直接集成到 VBA 中时,这种工作就没有多大意义了。这是因为上面显示的相同代码可以用一行命令替换,并且有几个优点。其中一个优点是您无需担心 Python 的安装位置。另一个优点(我不会在这里详细介绍,因为它超出了本文的范围)是,Python 脚本可以作为项目的一部分,其中 Excel 本身也包含 VBA 代码。集成完成后,整个项目可以组织在一个文件夹或目录中,xlwings 将处理路径解析以及其他相关问题。这样可以确保 Python 脚本与 VBA 无缝协作。再次提醒,您最好阅读本文参考文献中列出的文档。

现在,让我们回到我们的主题。在 Excel 中打开 VBA 编辑器后,您将看到以下画面:


请注意,我在图片中已突出显示某些内容,此突出显示的项目已设置密码保护。但是,这不应该给您带来任何担忧或不便。打开此突出显示文件所需的密码可以在 xlwings 文档中找到,可通过参考资料部分提供的链接访问该文档。我可以在这里说明,但我希望你自己查阅文件。总之,现在我们需要告诉 VBA 使用 xlwings。这是通过将 xlwings 引用添加到我们将要编写的 VBA 代码中来实现的。要添加此引用,请转到下方所示的位置。


选择上图中突出显示的选项后,您将进入以下画面:


您必须查看上图中所示的引用。如果您以前从未见过或使用过此窗口,请注意,它会告诉 VBA 在无法在代码内部解决某些问题时应该使用哪些引用作为支持。发生这种情况时,VBA 将搜索引用的库,以确定如何解析代码中的调用。VBA 将在可用的引用中进行搜索。如果无法解决,VBA 将把此未解决的调用报告为错误。这正是为什么许多人在网上搜索 VBA 宏代码,然后无法使其工作的原因。这个问题通常与VBA 无法解析的缺失引用有关。

在我们的例子中,VBA 代码中会存在一个调用,但它不是原生 VBA 的一部分,那就是 RunPython。如果您不选中上图中突出显示的选项,则当 VBA 遇到对 RunPython 的调用时,它会将其报告为错误。

所以不要忘记:每当您在 VBA 中创建调用 Python 代码的宏或脚本时,请务必选中引用部分中的此框。通过这样做,您的代码将正常工作。


最后的探讨

本文仅介绍了在 Excel 中执行 Python 脚本所需的步骤。虽然这可能看起来不寻常甚至奇怪,但它打开了许多大门,特别是因为许多东西在 Python 中比在 VBA 中更容易实现。更重要的是,它使我们能够以非常灵活和优雅的方式在 Excel 和 MetaTrader 5 之间传输信息。即使我们不大量使用 Excel,而是直接使用 Python 和 MetaTrader 5,一旦你真正了解了可以做什么,你也不会想仅仅依赖 Python 和 MetaTrader 5。你肯定会想用 Excel 或其他电子表格应用程序。

在下一篇文章中,我们将最终看到实现所有这些工作的代码是如何实现的。那么,我们下篇文章再见。


参考

xlwings 文档

Python 官方网站

文件 描述
Experts\Expert Advisor.mq5
演示 Chart Trade 和 EA 交易之间的交互(交互需要 Mouse Study)
 Indicators\Chart Trade.mq5 创建用于配置待发送订单的窗口(需要进 Mouse Study 才能进行交互)
 Indicators\Market Replay.mq5 创建用于与回放/模拟器服务交互的控件(需要 Mouse Study 才能进行交互)
 Indicators\Mouse Study.mq5 实现图形控件和用户之间的交互(操作回放模拟器和实时市场交易所需)
 Servicios\Market Replay.mq5 创建并维护市场回放和模拟服务(整个系统的主文件)
 VS C++ Server.cpp 用 C++ 创建并维护一个套接字服务器(简易聊天版)
 Python code Server.py 创建并维护用于 MetaTrader 5 和 Excel 之间通信的 Python 套接字。
 ScriptsCheckSocket.mq5 检查与外部套接字的连接
 Indicators\Mini Chat.mq5 实现迷你聊天功能作为指标(需要服务器)
 Experts\Mini Chat.mq5 实现迷你聊天功能作为 EA 交易(需要服务器)

本文由MetaQuotes Ltd译自葡萄牙语
原文地址: https://www.mql5.com/pt/articles/12743

附加的文件 |
Anexo.zip (560.03 KB)
交易策略 交易策略
各种交易策略的分类都是任意的,下面这种分类强调从交易的基本概念上分类。
您应当知道的 MQL5 向导技术(第 59 部分):配以移动平均和随机振荡器形态的强化学习(DDPG) 您应当知道的 MQL5 向导技术(第 59 部分):配以移动平均和随机振荡器形态的强化学习(DDPG)
我们继续上一篇文章中有关配以 MA 和随机振荡器指标的 DDPG 话题,探讨实现 DDPG 时其他关键的强化学习类。尽管我们大多用 Python 编码,但最终产品是把训练好的网络导出为 ONNX 格式,我们会将它集成到由向导汇编的 MQL5 智能系统中作为资源。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
风险管理(第三部分):构建风险管理主类 风险管理(第三部分):构建风险管理主类
在本文中,我们将开始创建一个核心风险管理类,这将是控制系统风险的关键。我们将重点建立基础,定义基本结构、变量和函数。此外,我们将实施设定最大损益值的必要方法,从而为风险管理奠定基础。