安装 Python 和 MetaTrader5 包

要学习本章中的资料,必须将 Python 安装到电脑。如果还没有安装它,请从 https://www.python.org/downloads/windows下载最新版本的 Python(例如,在撰写本文时是 3.10 版)。

安装 Python 时,建议选中“Add Python to PATH(将 Python 添加到 PATH)”标志,以便可以从任何文件夹的命令行运行 Python 脚本。

下载并运行 Python 后,从命令行安装 MetaTrader5 模块(这里 pip是一个标准的 Python 包管理器程序):

pip install MetaTrader5

随后可以使用以下命令行检查软件包更新:

pip install --upgrade MetaTrader5

添加其他常用软件包的语法都类似。特别是,许多脚本需要数据分析和可视化软件包:分别为 pandasmatplotlib 软件包。

pip install matplotlib
pip install pandas

可以直接从 MetaEditor 中的 MQL5 向导创建新的 Python 脚本。除了脚本名称,用户还可以选择导入多个软件包的选项,如 TensorFlowNumPyDatetime

默认情况下,建议将脚本放在 MQL5/Scripts 文件夹中。新创建和现有 Python 脚本在 MetaTrader 5 导航器中显示,用一个特殊的图标标记,并且可以以通常的方式从导航器中启动。Python 脚本可以在图表上与其他 MQL5 脚本和 EA 交易并行执行。要在脚本循环执行时停止脚本,只需将其从图表中删除即可。

在终端中运行 Python 脚本

在终端中运行 Python 脚本

从终端启动的 Python 脚本通过命令行参数接收交易品种的名称和图表的时间范围。例如,我们可以在 EURUSD,H1 图表上运行以下脚本,其中的自变量以 sys.argv 数组的形式给出:

import sys
   
print('The command line arguments are:')
for i in sys.argv:
   print(i)

结果将输出到 EA 交易日志:

The command line arguments are:
C:\Program Files\MetaTrader 5\MQL5\Scripts\MQL5Book\Python\python-args.py
EURUSD
60

此外,通过在编辑器 Settings 对话框、Compilers 选项卡中指定 Python 安装位置,可以直接从 MetaEditor 运行 Python 脚本 - 随后扩展名为 *.py 的文件的编译命令,成为运行命令。

最后,Python 脚本也可以在其本机环境中运行,方法是从命令行或另一个适用于 Python 的IDE(集成开发环境),如 Jupyter Notebook,将它们作为参数在 python.exe 调用中传递。

如果在终端中启用了算法交易,那么在默认情况下也会启用从 Python 进行交易。为了在使用第三方 Python 库时进一步保护账户,平台设置提供了“通过外部 Python API 禁用自动交易”选项。这样,Python 脚本可以选择性地阻止交易,方便 MQL 程序来使用。启用此选项时,Python 脚本中的交易函数调用将返回错误 10027 (TRADE_RETCODE_CLIENT_DISABLES_AT),表明客户端禁用了算法交易。

MQL5 与 Python 的对比
 
Python 是一种解释型语言,而 MQL5 是编译语言。对于我们这些开发人员来说,这会减少我们很多负担,因为我们不需要单独的编译阶段来获得一个工作程序。但是,Python 中脚本的执行速度明显低于在 MQL5 中编译的脚本的执行速度。
 
Python 是一种动态类型语言:变量的类型是由我们赋予它的值决定的。一方面,这带来了灵活性,但另一方面,我们也需要谨慎,以避免不可预见的错误。MQL5 使用静态类型,即在说明变量时,我们必须显式指定其类型,同时编译器监控类型兼容性。
 
Python 会自己“清理垃圾”,即释放应用程序为对象分配的内存。在 MQL5 中,我们必须跟踪动态对象的 delete 调用。
 
在 Python 语法中,源代码缩进是非常重要的。如果你需要编写一个包含多个嵌套语句的复合语句(例如,循环或条件语句),那么 Python 会使用空格或制表符来实现这一目的(它们在块中必须具有相同的大小)。不允许混合使用制表符和空格进行缩进。不正确的缩进会导致错误。在 MQL5 中,我们通过花括号 {...} 将多个语句包裹形成复合语句块,这里没有使用格式化,你可以在不破坏程序性能的情况下应用喜欢的样式。
 
Python 函数支持两种类型的参数:命名参数和位置参数。第二种类型对应于我们在 MQL5 中常用的类型:每个参数的值必须严格按照它在自变量列表中的顺序传递(根据函数原型)。相比之下,命名参数是作为名称和值(中间用 = 连接)的组合传递的,因此可以按任何顺序指定,例如 func(param2 = value2, param1 = value1)