我有一组专家顾问(EA)脚本,它们是用MQL5编程语言为股票/外汇交易平台MetaTrader5编写的。这些文件的扩展名是mq5
。我正在寻找一种定期从我的Python中以编程方式运行这些MQL5文件的方法。EAs进行了一些价格转换,最终保存了一组csv文件,这些文件稍后将被我的Python脚本读取,以便将机器学习模型应用到这些文件上。
我的第一个自然选择是用于MetaTrader5的Python。然而,根据它的文档,它“是为了方便和快速地通过处理器间通信直接从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脚本的解决方案是什么?
编辑:我使用Windows 10 64位.
发布于 2021-04-06 12:30:40
subprocess
确实是您想要实现的正确模块。但让我们看看你在这里做什么:
with open(os.path.join("path/to/dir","RSIcalc.mq5")) as f
您正在创建一个名为f
的文件描述符句柄,它用于从文件中写入或读取内容。如果您执行print(f)
,您将看到它是一个python对象,转换为string看起来类似于<_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“,或者您可能不得不通过stdin管道(在Windows上不太可能,但谁知道)输入脚本内容。这是您要搞清楚的,但我上面的代码可能应该是您的起点。
发布于 2021-04-06 12:24:34
我不认为您需要将文件对象传递给您的子进程语句。以我的经验。当文件的路径作为命令行参数提供时,程序将运行文件。试试这个:
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
是一样的。
https://stackoverflow.com/questions/66968258
复制相似问题