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

Python command to execute non-Python (MQL5) files?

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

我的第一个自然选择是 Python API for MetaTrader5。然而,根据其文档,它 " 旨在通过处理器间通信直接从 MetaTrader 5 终端方便快捷地获取交换数据" 因此,它不提供该功能我需要能够使用 Python.

运行 MQL 脚本

我在 SO(例如 , #2)上找到了一些关于使用 Python 执行非 python 文件的帖子,但这些帖子似乎总是以它们为前提已经在其中编写了 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)

打印语句returnsTrue,所以mq5文件存在于指定位置。然后代码打开 MetaTrader5 终端,但没有其他任何事情发生,EA 没有被执行,流程在此之后立即完成。

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

编辑: 我使用 Windows 10 64 位。

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

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 相同。

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'>极不可能您想要将这样的字符串作为命令行参数传递给您的终端可执行文件,当您将其包含在对 subprocess.run().

的调用中

您可能想要做的是:

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”,或者您可能必须通过标准输入管道提供脚本内容(不太可能,在 Windows 上,但谁知道呢) .那是你要弄明白的,但我上面的代码可能应该是你的起点。