执行非Python(MQL5)文件的Python命令?

2024-04-29 10:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组专家顾问(EA)脚本,它们是用MQL5编程语言为股票/外汇交易平台MetaTrader5编写的。这些文件的扩展名为mq5。我正在寻找一种方法,定期从Python脚本以编程方式运行这些MQL5文件。EA进行了一些价格转换,最终保存了一组csv文件,稍后我的Python脚本将读取这些文件,以便对其应用机器学习模型

我的第一个自然选择是Python API for MetaTrader5。然而,根据其文档,它的设计目的是通过处理器间通信直接从MetaTrader 5终端方便快捷地获取交换数据,因此,它不提供使用Python运行MQL脚本所需的功能

我在这里找到了一些关于使用python执行非python文件的帖子(比如#1#2),但这些帖子似乎总是附带一个前提条件,即它们已经编写了python代码,只是扩展不同——这与我的目标不同

然后,我遇到了Python的subprocess模块,并开始对此进行实验

print(os.path.isfile(os.path.join("path/to/dir","RSIcalc.mq5")))
with open(os.path.join("path/to/dir","RSIcalc.mq5")) as f:
   subprocess.run([r"C:\Program Files\MetaTrader 5\terminal64.exe", f], capture_output=True)

print语句返回True,因此mq5文件存在于指定位置。然后,代码打开MetaTrader5终端,但没有发生其他任何事情,EA不会执行,流程随即完成

我是否已经走上了我在这里想要实现的目标的正确轨道?如果是,对于我来说,从Python以编程方式运行这些MQL5脚本的解决方案是什么

编辑: 我使用64位Windows 10


Tags: 文件path代码脚本终端目标os编程
2条回答

subprocess确实是您想要实现的正确模块。但让我们看看你在这里做什么:

with open(os.path.join("path/to/dir","RSIcalc.mq5")) as f

您正在创建一个名为f文件描述符句柄,用于从文件中写入或读取内容。如果执行print(f),您将看到它是一个python对象,转换为字符串的对象看起来像<_io.TextIOWrapper name='RSIcalc.mq5' mode='r' encoding='UTF-8'>极不可能这样的字符串是您想要作为命令行参数传递给终端可执行文件的字符串,这是您在对^{的调用中包含该字符串时发生的情况

您可能想做的是:

full_path = os.path.abspath(os.path.join("path/to/dir","RSIcalc.mq5"))
result = subprocess.run([r"C:\Program Files\MetaTrader 5\terminal64.exe", full_path], capture_output=True)

现在,假设terminal64可以执行作为参数传递的任意脚本。这可能是真的,也可能不是真的-在传递文件路径之前,您可能需要额外的参数,如“-f”,或者您可能必须通过stdin管道提供脚本内容(在Windows上不太可能,但谁知道呢)。这需要你去弄清楚,但我上面的代码应该是你的出发点

我认为不需要将文件对象传递给子进程语句。以我的经验。当文件的路径作为命令行参数提供时,程序将运行该文件。试试这个:

subprocess.run([r"C:\\Program Files\\MetaTrader 5\\terminal64.exe", os.path.join(“path/to/dir”, “RSIcalc.mq5”], capture_output=True)

这与在终端中键入C:\Program Files\MetaTrader 5\terminal64.exe path\to\dir\RSIcalc.mq5相同

相关问题 更多 >