在 macOS 中 使用 Python 与 MetaTrader5 开发自动交易系统——环境配置失败及原因

2025-02-16 261 0

(一)在 macOS 中使用 Python 包管理工具 pip 安装 Metatrader5 package

MetaTrader5 提供了 Python 的 API,可以通过其获取数据或使用 Python 编写程序在 MetaTrader5 平台进行自动交易。使用 macOS 中的 terminal 窗口安装 MetaTrader5 package 到本机的 Python 时,会出现安装不上的情况。原因可能是本机 mac OS 中的Python 版本与下载的安装包版本不匹配,需要更名为 mac OS 中与本机 Python 版本对应的文件才能成功安装。

问题出现:

在 mac OS 的 terminal 窗口中输入:

python3 -m pip install MetaTrader5

pip3 install MetaTrader5

terminal 窗口显示如下:

Could not find a version that satisfies the requirement MetaTrader5 (from versions: )

ERROR: Could not find a version that satisfies the requirement MetaTrader5 (from versions: none)

ERROR: No matching distribution found for MetaTrader5

解决方法:

1. 查看本地主机的 Python 版本号。在 terminal 中输入:

(base) mac@Macs-Mac-mini ~ % python

teminal 窗口显示以下内容,说明当前系统中安装的 Python 版本号为 3.12.7

Python 3.12.7 | packaged by Anaconda, Inc. | (main, Oct  4 2024, 08:22:19) [Clang 14.0.6 ] on darwin

Type "help", "copyright", "credits" or "license" for more information.

2. 为避免联网下载源出现问题,可下载 MetaTrader5 package 进行本地安装。在下载链接https://pypi.org/project/MetaTrader5/#files 中找到包含“cp312”字段的链接,点击下载。其中,“cp312”是指安装包支持的是python 3.12版本

3. 更新pip工具包。在 terminal 中输入:

python -m pip install --upgrade pip

teminal 窗口显示以下内容,说明更新成功

(base) mac@Macs-Mac-mini ~ % python -m pip install --upgrade pip

Requirement already satisfied: pip in /opt/anaconda3/lib/python3.12/site-packages (24.2)

Collecting pip

  Downloading pip-25.0.1-py3-none-any.whl.metadata (3.7 kB)

Downloading pip-25.0.1-py3-none-any.whl (1.8 MB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 317.5 kB/s eta 0:00:00

Installing collected packages: pip

  Attempting uninstall: pip

    Found existing installation: pip 24.2

    Uninstalling pip-24.2:

      Successfully uninstalled pip-24.2

4. 查看当前 Python 平台支持的版本。在 terminal 中输入:

pip debug --verbose

teminal 窗口显示以下内容

(base) mac@Macs-Mac-mini ~ % pip debug --verbose

WARNING: This command is only meant for debugging. Do not use this with automation for parsing and getting these details, since the output and options of this command may change without notice.

pip version: pip 25.0.1 from /opt/anaconda3/lib/python3.12/site-packages/pip (python 3.12)

sys.version: 3.12.7 | packaged by Anaconda, Inc. | (main, Oct  4 2024, 08:22:19) [Clang 14.0.6 ]

sys.executable: /opt/anaconda3/bin/python

sys.getdefaultencoding: utf-8

sys.getfilesystemencoding: utf-8

locale.getpreferredencoding: UTF-8

sys.platform: darwin

sys.implementation:

  name: cpython

'cert' config value: Not specified

REQUESTS_CA_BUNDLE: None

CURL_CA_BUNDLE: None

pip._vendor.certifi.where(): /opt/anaconda3/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem

pip._vendor.DEBUNDLED: False

vendored library versions:

  CacheControl==0.14.1

  distlib==0.3.9

  distro==1.9.0

  msgpack==1.1.0

  packaging==24.2

  platformdirs==4.3.6

  pyproject-hooks==1.2.0

  requests==2.32.3

  certifi==2024.08.30

  idna==3.10

  urllib3==1.26.20

  rich==13.9.4 (Unable to locate actual module version, using vendor.txt specified version)

  pygments==2.18.0

  typing_extensions==4.12.2 (Unable to locate actual module version, using vendor.txt specified version)

  resolvelib==1.0.1

  setuptools==70.3.0 (Unable to locate actual module version, using vendor.txt specified version)

  tomli==2.2.1

  truststore==0.10.0

Compatible tags: 636

  cp312-cp312-macosx_15_0_arm64

  cp312-cp312-macosx_15_0_universal2

  cp312-cp312-macosx_14_0_arm64

  cp312-cp312-macosx_14_0_universal2

  cp312-cp312-macosx_13_0_arm64

  cp312-cp312-macosx_13_0_universal2

  cp312-cp312-macosx_12_0_arm64

  cp312-cp312-macosx_12_0_universal2

  cp312-cp312-macosx_11_0_arm64

  cp312-cp312-macosx_11_0_universal2

  cp312-cp312-macosx_10_16_universal2

  cp312-cp312-macosx_10_15_universal2

  cp312-cp312-macosx_10_14_universal2

  cp312-cp312-macosx_10_13_universal2

  cp312-cp312-macosx_10_12_universal2

  cp312-cp312-macosx_10_11_universal2

  cp312-cp312-macosx_10_10_universal2

  cp312-cp312-macosx_10_9_universal2

  cp312-cp312-macosx_10_8_universal2

  cp312-cp312-macosx_10_7_universal2

  cp312-cp312-macosx_10_6_universal2

  cp312-cp312-macosx_10_5_universal2

  cp312-cp312-macosx_10_4_universal2

  cp312-abi3-macosx_15_0_arm64

  cp312-abi3-macosx_15_0_universal2

  cp312-abi3-macosx_14_0_arm64

  cp312-abi3-macosx_14_0_universal2

  cp312-abi3-macosx_13_0_arm64

  cp312-abi3-macosx_13_0_universal2

  cp312-abi3-macosx_12_0_arm64

  cp312-abi3-macosx_12_0_universal2

  cp312-abi3-macosx_11_0_arm64

  cp312-abi3-macosx_11_0_universal2

  cp312-abi3-macosx_10_16_universal2

  cp312-abi3-macosx_10_15_universal2

  cp312-abi3-macosx_10_14_universal2

  cp312-abi3-macosx_10_13_universal2

  cp312-abi3-macosx_10_12_universal2

  cp312-abi3-macosx_10_11_universal2

  cp312-abi3-macosx_10_10_universal2

  cp312-abi3-macosx_10_9_universal2

  cp312-abi3-macosx_10_8_universal2

  cp312-abi3-macosx_10_7_universal2

  cp312-abi3-macosx_10_6_universal2

  cp312-abi3-macosx_10_5_universal2

  cp312-abi3-macosx_10_4_universal2

  cp312-none-macosx_15_0_arm64

  cp312-none-macosx_15_0_universal2

  cp312-none-macosx_14_0_arm64

  cp312-none-macosx_14_0_universal2

  cp312-none-macosx_13_0_arm64

  cp312-none-macosx_13_0_universal2

  cp312-none-macosx_12_0_arm64

  cp312-none-macosx_12_0_universal2

  cp312-none-macosx_11_0_arm64

  cp312-none-macosx_11_0_universal2

  cp312-none-macosx_10_16_universal2

  cp312-none-macosx_10_15_universal2

  cp312-none-macosx_10_14_universal2

  cp312-none-macosx_10_13_universal2

  cp312-none-macosx_10_12_universal2

  cp312-none-macosx_10_11_universal2

  cp312-none-macosx_10_10_universal2

  cp312-none-macosx_10_9_universal2

  cp312-none-macosx_10_8_universal2

  cp312-none-macosx_10_7_universal2

  cp312-none-macosx_10_6_universal2

  cp312-none-macosx_10_5_universal2

  cp312-none-macosx_10_4_universal2

  cp311-abi3-macosx_15_0_arm64

  cp311-abi3-macosx_15_0_universal2

  cp311-abi3-macosx_14_0_arm64

  cp311-abi3-macosx_14_0_universal2

  cp311-abi3-macosx_13_0_arm64

  cp311-abi3-macosx_13_0_universal2

  cp311-abi3-macosx_12_0_arm64

  cp311-abi3-macosx_12_0_universal2

  cp311-abi3-macosx_11_0_arm64

  cp311-abi3-macosx_11_0_universal2

  cp311-abi3-macosx_10_16_universal2

  cp311-abi3-macosx_10_15_universal2

  cp311-abi3-macosx_10_14_universal2

  cp311-abi3-macosx_10_13_universal2

  cp311-abi3-macosx_10_12_universal2

  cp311-abi3-macosx_10_11_universal2

  cp311-abi3-macosx_10_10_universal2

  cp311-abi3-macosx_10_9_universal2

  cp311-abi3-macosx_10_8_universal2

  cp311-abi3-macosx_10_7_universal2

  cp311-abi3-macosx_10_6_universal2

  cp311-abi3-macosx_10_5_universal2

  cp311-abi3-macosx_10_4_universal2

  cp310-abi3-macosx_15_0_arm64

  cp310-abi3-macosx_15_0_universal2

  cp310-abi3-macosx_14_0_arm64

  cp310-abi3-macosx_14_0_universal2

  cp310-abi3-macosx_13_0_arm64

  cp310-abi3-macosx_13_0_universal2

  cp310-abi3-macosx_12_0_arm64

  cp310-abi3-macosx_12_0_universal2

  cp310-abi3-macosx_11_0_arm64

  cp310-abi3-macosx_11_0_universal2

  cp310-abi3-macosx_10_16_universal2

  cp310-abi3-macosx_10_15_universal2

  cp310-abi3-macosx_10_14_universal2

  cp310-abi3-macosx_10_13_universal2

  cp310-abi3-macosx_10_12_universal2

  cp310-abi3-macosx_10_11_universal2

  cp310-abi3-macosx_10_10_universal2

  cp310-abi3-macosx_10_9_universal2

  cp310-abi3-macosx_10_8_universal2

  cp310-abi3-macosx_10_7_universal2

  cp310-abi3-macosx_10_6_universal2

  cp310-abi3-macosx_10_5_universal2

  cp310-abi3-macosx_10_4_universal2

  cp39-abi3-macosx_15_0_arm64

  cp39-abi3-macosx_15_0_universal2

  cp39-abi3-macosx_14_0_arm64

  cp39-abi3-macosx_14_0_universal2

  cp39-abi3-macosx_13_0_arm64

  cp39-abi3-macosx_13_0_universal2

  cp39-abi3-macosx_12_0_arm64

  cp39-abi3-macosx_12_0_universal2

  cp39-abi3-macosx_11_0_arm64

  cp39-abi3-macosx_11_0_universal2

  cp39-abi3-macosx_10_16_universal2

  cp39-abi3-macosx_10_15_universal2

  cp39-abi3-macosx_10_14_universal2

  cp39-abi3-macosx_10_13_universal2

  cp39-abi3-macosx_10_12_universal2

  cp39-abi3-macosx_10_11_universal2

  cp39-abi3-macosx_10_10_universal2

  cp39-abi3-macosx_10_9_universal2

  cp39-abi3-macosx_10_8_universal2

  cp39-abi3-macosx_10_7_universal2

  cp39-abi3-macosx_10_6_universal2

  cp39-abi3-macosx_10_5_universal2

  cp39-abi3-macosx_10_4_universal2

  cp38-abi3-macosx_15_0_arm64

  cp38-abi3-macosx_15_0_universal2

  cp38-abi3-macosx_14_0_arm64

  cp38-abi3-macosx_14_0_universal2

  cp38-abi3-macosx_13_0_arm64

  cp38-abi3-macosx_13_0_universal2

  cp38-abi3-macosx_12_0_arm64

  cp38-abi3-macosx_12_0_universal2

  cp38-abi3-macosx_11_0_arm64

  cp38-abi3-macosx_11_0_universal2

  cp38-abi3-macosx_10_16_universal2

  cp38-abi3-macosx_10_15_universal2

  cp38-abi3-macosx_10_14_universal2

  cp38-abi3-macosx_10_13_universal2

  cp38-abi3-macosx_10_12_universal2

  cp38-abi3-macosx_10_11_universal2

  cp38-abi3-macosx_10_10_universal2

  cp38-abi3-macosx_10_9_universal2

  cp38-abi3-macosx_10_8_universal2

  cp38-abi3-macosx_10_7_universal2

  cp38-abi3-macosx_10_6_universal2

  cp38-abi3-macosx_10_5_universal2

  cp38-abi3-macosx_10_4_universal2

  cp37-abi3-macosx_15_0_arm64

  cp37-abi3-macosx_15_0_universal2

  cp37-abi3-macosx_14_0_arm64

  cp37-abi3-macosx_14_0_universal2

  cp37-abi3-macosx_13_0_arm64

  cp37-abi3-macosx_13_0_universal2

  cp37-abi3-macosx_12_0_arm64

  cp37-abi3-macosx_12_0_universal2

  cp37-abi3-macosx_11_0_arm64

  cp37-abi3-macosx_11_0_universal2

  cp37-abi3-macosx_10_16_universal2

  cp37-abi3-macosx_10_15_universal2

  cp37-abi3-macosx_10_14_universal2

  cp37-abi3-macosx_10_13_universal2

  cp37-abi3-macosx_10_12_universal2

  cp37-abi3-macosx_10_11_universal2

  cp37-abi3-macosx_10_10_universal2

  cp37-abi3-macosx_10_9_universal2

  cp37-abi3-macosx_10_8_universal2

  cp37-abi3-macosx_10_7_universal2

  cp37-abi3-macosx_10_6_universal2

  cp37-abi3-macosx_10_5_universal2

  cp37-abi3-macosx_10_4_universal2

  cp36-abi3-macosx_15_0_arm64

  cp36-abi3-macosx_15_0_universal2

  cp36-abi3-macosx_14_0_arm64

  cp36-abi3-macosx_14_0_universal2

  cp36-abi3-macosx_13_0_arm64

  cp36-abi3-macosx_13_0_universal2

  cp36-abi3-macosx_12_0_arm64

  cp36-abi3-macosx_12_0_universal2

  cp36-abi3-macosx_11_0_arm64

  cp36-abi3-macosx_11_0_universal2

  cp36-abi3-macosx_10_16_universal2

  cp36-abi3-macosx_10_15_universal2

  cp36-abi3-macosx_10_14_universal2

  cp36-abi3-macosx_10_13_universal2

  cp36-abi3-macosx_10_12_universal2

  cp36-abi3-macosx_10_11_universal2

  cp36-abi3-macosx_10_10_universal2

  cp36-abi3-macosx_10_9_universal2

  cp36-abi3-macosx_10_8_universal2

  cp36-abi3-macosx_10_7_universal2

  cp36-abi3-macosx_10_6_universal2

  cp36-abi3-macosx_10_5_universal2

  cp36-abi3-macosx_10_4_universal2

  cp35-abi3-macosx_15_0_arm64

  cp35-abi3-macosx_15_0_universal2

  cp35-abi3-macosx_14_0_arm64

  cp35-abi3-macosx_14_0_universal2

  cp35-abi3-macosx_13_0_arm64

  cp35-abi3-macosx_13_0_universal2

  cp35-abi3-macosx_12_0_arm64

  cp35-abi3-macosx_12_0_universal2

  cp35-abi3-macosx_11_0_arm64

  cp35-abi3-macosx_11_0_universal2

  cp35-abi3-macosx_10_16_universal2

  cp35-abi3-macosx_10_15_universal2

  cp35-abi3-macosx_10_14_universal2

  cp35-abi3-macosx_10_13_universal2

  cp35-abi3-macosx_10_12_universal2

  cp35-abi3-macosx_10_11_universal2

  cp35-abi3-macosx_10_10_universal2

  cp35-abi3-macosx_10_9_universal2

  cp35-abi3-macosx_10_8_universal2

  cp35-abi3-macosx_10_7_universal2

  cp35-abi3-macosx_10_6_universal2

  cp35-abi3-macosx_10_5_universal2

  cp35-abi3-macosx_10_4_universal2

  cp34-abi3-macosx_15_0_arm64

  cp34-abi3-macosx_15_0_universal2

  cp34-abi3-macosx_14_0_arm64

  cp34-abi3-macosx_14_0_universal2

  cp34-abi3-macosx_13_0_arm64

  cp34-abi3-macosx_13_0_universal2

  cp34-abi3-macosx_12_0_arm64

  cp34-abi3-macosx_12_0_universal2

  cp34-abi3-macosx_11_0_arm64

  cp34-abi3-macosx_11_0_universal2

  cp34-abi3-macosx_10_16_universal2

  cp34-abi3-macosx_10_15_universal2

  cp34-abi3-macosx_10_14_universal2

  cp34-abi3-macosx_10_13_universal2

  cp34-abi3-macosx_10_12_universal2

  cp34-abi3-macosx_10_11_universal2

  cp34-abi3-macosx_10_10_universal2

  cp34-abi3-macosx_10_9_universal2

  cp34-abi3-macosx_10_8_universal2

  cp34-abi3-macosx_10_7_universal2

  cp34-abi3-macosx_10_6_universal2

  cp34-abi3-macosx_10_5_universal2

  cp34-abi3-macosx_10_4_universal2

  cp33-abi3-macosx_15_0_arm64

  cp33-abi3-macosx_15_0_universal2

  cp33-abi3-macosx_14_0_arm64

  cp33-abi3-macosx_14_0_universal2

  cp33-abi3-macosx_13_0_arm64

  cp33-abi3-macosx_13_0_universal2

  cp33-abi3-macosx_12_0_arm64

  cp33-abi3-macosx_12_0_universal2

  cp33-abi3-macosx_11_0_arm64

  cp33-abi3-macosx_11_0_universal2

  cp33-abi3-macosx_10_16_universal2

  cp33-abi3-macosx_10_15_universal2

  cp33-abi3-macosx_10_14_universal2

  cp33-abi3-macosx_10_13_universal2

  cp33-abi3-macosx_10_12_universal2

  cp33-abi3-macosx_10_11_universal2

  cp33-abi3-macosx_10_10_universal2

  cp33-abi3-macosx_10_9_universal2

  cp33-abi3-macosx_10_8_universal2

  cp33-abi3-macosx_10_7_universal2

  cp33-abi3-macosx_10_6_universal2

  cp33-abi3-macosx_10_5_universal2

  cp33-abi3-macosx_10_4_universal2

  cp32-abi3-macosx_15_0_arm64

  cp32-abi3-macosx_15_0_universal2

  cp32-abi3-macosx_14_0_arm64

  cp32-abi3-macosx_14_0_universal2

  cp32-abi3-macosx_13_0_arm64

  cp32-abi3-macosx_13_0_universal2

  cp32-abi3-macosx_12_0_arm64

  cp32-abi3-macosx_12_0_universal2

  cp32-abi3-macosx_11_0_arm64

  cp32-abi3-macosx_11_0_universal2

  cp32-abi3-macosx_10_16_universal2

  cp32-abi3-macosx_10_15_universal2

  cp32-abi3-macosx_10_14_universal2

  cp32-abi3-macosx_10_13_universal2

  cp32-abi3-macosx_10_12_universal2

  cp32-abi3-macosx_10_11_universal2

  cp32-abi3-macosx_10_10_universal2

  cp32-abi3-macosx_10_9_universal2

  cp32-abi3-macosx_10_8_universal2

  cp32-abi3-macosx_10_7_universal2

  cp32-abi3-macosx_10_6_universal2

  cp32-abi3-macosx_10_5_universal2

  cp32-abi3-macosx_10_4_universal2

  py312-none-macosx_15_0_arm64

  py312-none-macosx_15_0_universal2

  py312-none-macosx_14_0_arm64

  py312-none-macosx_14_0_universal2

  py312-none-macosx_13_0_arm64

  py312-none-macosx_13_0_universal2

  py312-none-macosx_12_0_arm64

  py312-none-macosx_12_0_universal2

  py312-none-macosx_11_0_arm64

  py312-none-macosx_11_0_universal2

  py312-none-macosx_10_16_universal2

  py312-none-macosx_10_15_universal2

  py312-none-macosx_10_14_universal2

  py312-none-macosx_10_13_universal2

  py312-none-macosx_10_12_universal2

  py312-none-macosx_10_11_universal2

  py312-none-macosx_10_10_universal2

  py312-none-macosx_10_9_universal2

  py312-none-macosx_10_8_universal2

  py312-none-macosx_10_7_universal2

  py312-none-macosx_10_6_universal2

  py312-none-macosx_10_5_universal2

  py312-none-macosx_10_4_universal2

  py3-none-macosx_15_0_arm64

  py3-none-macosx_15_0_universal2

  py3-none-macosx_14_0_arm64

  py3-none-macosx_14_0_universal2

  py3-none-macosx_13_0_arm64

  py3-none-macosx_13_0_universal2

  py3-none-macosx_12_0_arm64

  py3-none-macosx_12_0_universal2

  py3-none-macosx_11_0_arm64

  py3-none-macosx_11_0_universal2

  py3-none-macosx_10_16_universal2

  py3-none-macosx_10_15_universal2

  py3-none-macosx_10_14_universal2

  py3-none-macosx_10_13_universal2

  py3-none-macosx_10_12_universal2

  py3-none-macosx_10_11_universal2

  py3-none-macosx_10_10_universal2

  py3-none-macosx_10_9_universal2

  py3-none-macosx_10_8_universal2

  py3-none-macosx_10_7_universal2

  py3-none-macosx_10_6_universal2

  py3-none-macosx_10_5_universal2

  py3-none-macosx_10_4_universal2

  py311-none-macosx_15_0_arm64

  py311-none-macosx_15_0_universal2

  py311-none-macosx_14_0_arm64

  py311-none-macosx_14_0_universal2

  py311-none-macosx_13_0_arm64

  py311-none-macosx_13_0_universal2

  py311-none-macosx_12_0_arm64

  py311-none-macosx_12_0_universal2

  py311-none-macosx_11_0_arm64

  py311-none-macosx_11_0_universal2

  py311-none-macosx_10_16_universal2

  py311-none-macosx_10_15_universal2

  py311-none-macosx_10_14_universal2

  py311-none-macosx_10_13_universal2

  py311-none-macosx_10_12_universal2

  py311-none-macosx_10_11_universal2

  py311-none-macosx_10_10_universal2

  py311-none-macosx_10_9_universal2

  py311-none-macosx_10_8_universal2

  py311-none-macosx_10_7_universal2

  py311-none-macosx_10_6_universal2

  py311-none-macosx_10_5_universal2

  py311-none-macosx_10_4_universal2

  py310-none-macosx_15_0_arm64

  py310-none-macosx_15_0_universal2

  py310-none-macosx_14_0_arm64

  py310-none-macosx_14_0_universal2

  py310-none-macosx_13_0_arm64

  py310-none-macosx_13_0_universal2

  py310-none-macosx_12_0_arm64

  py310-none-macosx_12_0_universal2

  py310-none-macosx_11_0_arm64

  py310-none-macosx_11_0_universal2

  py310-none-macosx_10_16_universal2

  py310-none-macosx_10_15_universal2

  py310-none-macosx_10_14_universal2

  py310-none-macosx_10_13_universal2

  py310-none-macosx_10_12_universal2

  py310-none-macosx_10_11_universal2

  py310-none-macosx_10_10_universal2

  py310-none-macosx_10_9_universal2

  py310-none-macosx_10_8_universal2

  py310-none-macosx_10_7_universal2

  py310-none-macosx_10_6_universal2

  py310-none-macosx_10_5_universal2

  py310-none-macosx_10_4_universal2

  py39-none-macosx_15_0_arm64

  py39-none-macosx_15_0_universal2

  py39-none-macosx_14_0_arm64

  py39-none-macosx_14_0_universal2

  py39-none-macosx_13_0_arm64

  py39-none-macosx_13_0_universal2

  py39-none-macosx_12_0_arm64

  py39-none-macosx_12_0_universal2

  py39-none-macosx_11_0_arm64

  py39-none-macosx_11_0_universal2

  py39-none-macosx_10_16_universal2

  py39-none-macosx_10_15_universal2

  py39-none-macosx_10_14_universal2

  py39-none-macosx_10_13_universal2

  py39-none-macosx_10_12_universal2

  py39-none-macosx_10_11_universal2

  py39-none-macosx_10_10_universal2

  py39-none-macosx_10_9_universal2

  py39-none-macosx_10_8_universal2

  py39-none-macosx_10_7_universal2

  py39-none-macosx_10_6_universal2

  py39-none-macosx_10_5_universal2

  py39-none-macosx_10_4_universal2

  py38-none-macosx_15_0_arm64

  py38-none-macosx_15_0_universal2

  py38-none-macosx_14_0_arm64

  py38-none-macosx_14_0_universal2

  py38-none-macosx_13_0_arm64

  py38-none-macosx_13_0_universal2

  py38-none-macosx_12_0_arm64

  py38-none-macosx_12_0_universal2

  py38-none-macosx_11_0_arm64

  py38-none-macosx_11_0_universal2

  py38-none-macosx_10_16_universal2

  py38-none-macosx_10_15_universal2

  py38-none-macosx_10_14_universal2

  py38-none-macosx_10_13_universal2

  py38-none-macosx_10_12_universal2

  py38-none-macosx_10_11_universal2

  py38-none-macosx_10_10_universal2

  py38-none-macosx_10_9_universal2

  py38-none-macosx_10_8_universal2

  py38-none-macosx_10_7_universal2

  py38-none-macosx_10_6_universal2

  py38-none-macosx_10_5_universal2

  py38-none-macosx_10_4_universal2

  py37-none-macosx_15_0_arm64

  py37-none-macosx_15_0_universal2

  py37-none-macosx_14_0_arm64

  py37-none-macosx_14_0_universal2

  py37-none-macosx_13_0_arm64

  py37-none-macosx_13_0_universal2

  py37-none-macosx_12_0_arm64

  py37-none-macosx_12_0_universal2

  py37-none-macosx_11_0_arm64

  py37-none-macosx_11_0_universal2

  py37-none-macosx_10_16_universal2

  py37-none-macosx_10_15_universal2

  py37-none-macosx_10_14_universal2

  py37-none-macosx_10_13_universal2

  py37-none-macosx_10_12_universal2

  py37-none-macosx_10_11_universal2

  py37-none-macosx_10_10_universal2

  py37-none-macosx_10_9_universal2

  py37-none-macosx_10_8_universal2

  py37-none-macosx_10_7_universal2

  py37-none-macosx_10_6_universal2

  py37-none-macosx_10_5_universal2

  py37-none-macosx_10_4_universal2

  py36-none-macosx_15_0_arm64

  py36-none-macosx_15_0_universal2

  py36-none-macosx_14_0_arm64

  py36-none-macosx_14_0_universal2

  py36-none-macosx_13_0_arm64

  py36-none-macosx_13_0_universal2

  py36-none-macosx_12_0_arm64

  py36-none-macosx_12_0_universal2

  py36-none-macosx_11_0_arm64

  py36-none-macosx_11_0_universal2

  py36-none-macosx_10_16_universal2

  py36-none-macosx_10_15_universal2

  py36-none-macosx_10_14_universal2

  py36-none-macosx_10_13_universal2

  py36-none-macosx_10_12_universal2

  py36-none-macosx_10_11_universal2

  py36-none-macosx_10_10_universal2

  py36-none-macosx_10_9_universal2

  py36-none-macosx_10_8_universal2

  py36-none-macosx_10_7_universal2

  py36-none-macosx_10_6_universal2

  py36-none-macosx_10_5_universal2

  py36-none-macosx_10_4_universal2

  py35-none-macosx_15_0_arm64

  py35-none-macosx_15_0_universal2

  py35-none-macosx_14_0_arm64

  py35-none-macosx_14_0_universal2

  py35-none-macosx_13_0_arm64

  py35-none-macosx_13_0_universal2

  py35-none-macosx_12_0_arm64

  py35-none-macosx_12_0_universal2

  py35-none-macosx_11_0_arm64

  py35-none-macosx_11_0_universal2

  py35-none-macosx_10_16_universal2

  py35-none-macosx_10_15_universal2

  py35-none-macosx_10_14_universal2

  py35-none-macosx_10_13_universal2

  py35-none-macosx_10_12_universal2

  py35-none-macosx_10_11_universal2

  py35-none-macosx_10_10_universal2

  py35-none-macosx_10_9_universal2

  py35-none-macosx_10_8_universal2

  py35-none-macosx_10_7_universal2

  py35-none-macosx_10_6_universal2

  py35-none-macosx_10_5_universal2

  py35-none-macosx_10_4_universal2

  py34-none-macosx_15_0_arm64

  py34-none-macosx_15_0_universal2

  py34-none-macosx_14_0_arm64

  py34-none-macosx_14_0_universal2

  py34-none-macosx_13_0_arm64

  py34-none-macosx_13_0_universal2

  py34-none-macosx_12_0_arm64

  py34-none-macosx_12_0_universal2

  py34-none-macosx_11_0_arm64

  py34-none-macosx_11_0_universal2

  py34-none-macosx_10_16_universal2

  py34-none-macosx_10_15_universal2

  py34-none-macosx_10_14_universal2

  py34-none-macosx_10_13_universal2

  py34-none-macosx_10_12_universal2

  py34-none-macosx_10_11_universal2

  py34-none-macosx_10_10_universal2

  py34-none-macosx_10_9_universal2

  py34-none-macosx_10_8_universal2

  py34-none-macosx_10_7_universal2

  py34-none-macosx_10_6_universal2

  py34-none-macosx_10_5_universal2

  py34-none-macosx_10_4_universal2

  py33-none-macosx_15_0_arm64

  py33-none-macosx_15_0_universal2

  py33-none-macosx_14_0_arm64

  py33-none-macosx_14_0_universal2

  py33-none-macosx_13_0_arm64

  py33-none-macosx_13_0_universal2

  py33-none-macosx_12_0_arm64

  py33-none-macosx_12_0_universal2

  py33-none-macosx_11_0_arm64

  py33-none-macosx_11_0_universal2

  py33-none-macosx_10_16_universal2

  py33-none-macosx_10_15_universal2

  py33-none-macosx_10_14_universal2

  py33-none-macosx_10_13_universal2

  py33-none-macosx_10_12_universal2

  py33-none-macosx_10_11_universal2

  py33-none-macosx_10_10_universal2

  py33-none-macosx_10_9_universal2

  py33-none-macosx_10_8_universal2

  py33-none-macosx_10_7_universal2

  py33-none-macosx_10_6_universal2

  py33-none-macosx_10_5_universal2

  py33-none-macosx_10_4_universal2

  py32-none-macosx_15_0_arm64

  py32-none-macosx_15_0_universal2

  py32-none-macosx_14_0_arm64

  py32-none-macosx_14_0_universal2

  py32-none-macosx_13_0_arm64

  py32-none-macosx_13_0_universal2

  py32-none-macosx_12_0_arm64

  py32-none-macosx_12_0_universal2

  py32-none-macosx_11_0_arm64

  py32-none-macosx_11_0_universal2

  py32-none-macosx_10_16_universal2

  py32-none-macosx_10_15_universal2

  py32-none-macosx_10_14_universal2

  py32-none-macosx_10_13_universal2

  py32-none-macosx_10_12_universal2

  py32-none-macosx_10_11_universal2

  py32-none-macosx_10_10_universal2

  py32-none-macosx_10_9_universal2

  py32-none-macosx_10_8_universal2

  py32-none-macosx_10_7_universal2

  py32-none-macosx_10_6_universal2

  py32-none-macosx_10_5_universal2

  py32-none-macosx_10_4_universal2

  py31-none-macosx_15_0_arm64

  py31-none-macosx_15_0_universal2

  py31-none-macosx_14_0_arm64

  py31-none-macosx_14_0_universal2

  py31-none-macosx_13_0_arm64

  py31-none-macosx_13_0_universal2

  py31-none-macosx_12_0_arm64

  py31-none-macosx_12_0_universal2

  py31-none-macosx_11_0_arm64

  py31-none-macosx_11_0_universal2

  py31-none-macosx_10_16_universal2

  py31-none-macosx_10_15_universal2

  py31-none-macosx_10_14_universal2

  py31-none-macosx_10_13_universal2

  py31-none-macosx_10_12_universal2

  py31-none-macosx_10_11_universal2

  py31-none-macosx_10_10_universal2

  py31-none-macosx_10_9_universal2

  py31-none-macosx_10_8_universal2

  py31-none-macosx_10_7_universal2

  py31-none-macosx_10_6_universal2

  py31-none-macosx_10_5_universal2

  py31-none-macosx_10_4_universal2

  py30-none-macosx_15_0_arm64

  py30-none-macosx_15_0_universal2

  py30-none-macosx_14_0_arm64

  py30-none-macosx_14_0_universal2

  py30-none-macosx_13_0_arm64

  py30-none-macosx_13_0_universal2

  py30-none-macosx_12_0_arm64

  py30-none-macosx_12_0_universal2

  py30-none-macosx_11_0_arm64

  py30-none-macosx_11_0_universal2

  py30-none-macosx_10_16_universal2

  py30-none-macosx_10_15_universal2

  py30-none-macosx_10_14_universal2

  py30-none-macosx_10_13_universal2

  py30-none-macosx_10_12_universal2

  py30-none-macosx_10_11_universal2

  py30-none-macosx_10_10_universal2

  py30-none-macosx_10_9_universal2

  py30-none-macosx_10_8_universal2

  py30-none-macosx_10_7_universal2

  py30-none-macosx_10_6_universal2

  py30-none-macosx_10_5_universal2

  py30-none-macosx_10_4_universal2

  cp312-none-any

  py312-none-any

  py3-none-any

  py311-none-any

  py310-none-any

  py39-none-any

  py38-none-any

  py37-none-any

  py36-none-any

  py35-none-any

  py34-none-any

  py33-none-any

  py32-none-any

  py31-none-any

  py30-none-any

其中,compatible tags 是当前python版本可以适配的标签。本机是mac mini,且mac系统的版本是macOS Sequoia 15.2,因此对应的 compatible tag是“cp312-cp312-macosx_15_0_arm64”

5. 安装MetaTrader5 package。在下载文件的存放目录,找到已下载文件“MetaTrader5-5.0.4803-cp312-cp312-win_amd64.whl”,将其重命名为“MetaTrader5-5.0.4803-cp312-cp312-macosx_15_0_arm64.whl”。在“Finder”文件夹中复制包含文件路径的文件名,在terminal中输入:

(base) mac@Macs-Mac-mini ~ % python3 -m pip install /Users/mac/Downloads/MetaTrader5-5.0.4803-cp312-cp312-macosx_15_0_arm64.whl

teminal窗口显示以下内容,说明MetaTrader5 package已经成功安装到macOS

Processing ./Downloads/MetaTrader5-5.0.4803-cp312-cp312-macosx_15_0_arm64.whl

Requirement already satisfied: numpy>=1.7 in /opt/anaconda3/lib/python3.12/site-packages (from MetaTrader5==5.0.4803) (1.26.4)

Installing collected packages: MetaTrader5

Successfully installed MetaTrader5-5.0.4803

如不进行重命名,直接安装下载后的安装包,会显示以下信息,说明本地主机mac OS中的python版本与下载的安装包版本不匹配,需要更名为mac OS中与本机python版本对应的文件才能成功安装。

(base) mac@Macs-Mac-mini ~ % pip install /Users/mac/Downloads/MetaTrader5-5.0.4803-cp312-cp312-win_amd64.whl

ERROR: MetaTrader5-5.0.4803-cp312-cp312-win_amd64.whl is not a supported wheel on this platform.

6. 连接MetaTrader5账号失败

在 pycharm 窗口输入以下命令连接 MetaTrader5 账号:

import MetaTrader5 as mt5

点击“run”按钮后,pycharm 显示以下内容,说明连接MetaTrader5账号失败。

Traceback (most recent call last):

File "/Users/mac/PycharmProjects/PythonProject/first.py", line 1, in 
import MetaTrader5 as mt5

ModuleNotFoundError: No module named 'MetaTrader5'

Process finished with exit code 1

连接失败的原因可能是 MetaTrader5 不支持 macOS 或 Linux 中的 Python API。

(二)在 Docker / Orbstack 中安装 MetaTrader5 的 Python 库

由于 Python 无法连接 MetaTrader5,于是考虑在 macOS 中使用 Docker / Orbstack 安装MetaTrader5 的 Python 库。

1. 下载所需文件。在 https://orbstack.dev/download 下载系统对应版本的 Orbstack程序并安装。 Orbstack 具备 Docker所有功能,但资源占用率和运行速度都比 Docker 更好。然后打开链接 https://github.com/tickelton/docker-metatrader ,下载一个比较著名的 MetaTrader5 的 Python 库的 Docker 文件。

2. 从 Github 克隆 Docker 仓库到本地。在 macOS 的 terminal 中,输入以下命令

git clone https://github.com/tickelton/docker-metatrader.git

terminal 窗口显示以下内容:

Cloning into 'docker-metatrader'...

remote: Enumerating objects: 34, done.

remote: Counting objects: 100% (11/11), done.

remote: Compressing objects: 100% (8/8), done.

remote: Total 34 (delta 3), reused 11 (delta 3), pack-reused 23 (from 1)

Receiving objects: 100% (34/34), 9.96 KiB | 4.98 MiB/s, done.

Resolving deltas: 100% (10/10), done.

然后输入以下命令:

cd docker-metatrader

6. 本地安装 image 文件。输入以下命令:

docker build .


terminal窗口显示以下内容,表明安装 image 已成功::

[+] Building 0.0s (1/1) FINISHED                                            docker:desktop-linux

 => [internal] load build definition from Dockerfile                                 0.0s

 => => transferring dockerfile: 2B            0.0s

ERROR: failed to solve: failed to read dockerfile: open Dockerfile: no such file or directory

7. 运行 image 文件。在 macOS 的 terminal 中,输入以下命令

docker run \
--net host \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY \
-v $METATRADER_HOST_PATH:/MetaTrader \
--name mt \
tickelton/mt

terminal 窗口显示以下内容,表明安装容器失败:

docker: invalid spec: :/MetaTrader: empty section between colons.

See 'docker run --help'.

(三)结论

使用 macOS 中的 Python 进行 MetaTrader5 自动交易功能的开发,被上述操作证明为不可行。

选择不在 macOS 中直接安装 MetaTrader5 的 Python 库,而是在 Docker / Orbstack 中安装,结果仍不成功。查了一些英文资料后得出结论:因为 MetaTrader5 是基于 Windows 开发,可能 macOS 或 Linux 中的 Python 无法将 Windows 中的函数成功转译到 macOS 或 Linux 中,导致 Python 无法连接 MetaTrader5,从而无法实现获取数据或自动交易等一系列后续功能。使用 Docker / Orbstack 安装 Metatrader5,只能避免通过 Wine / Crossover / Parallels / VMware 等安装方式造成的系统资源占用率过高,并不能解决 Windows 与其他操作系统之间系统级别的函数转译错误。

因此,试图使用 macOS 中的 Python 进行 MetaTrader5 自动交易功能的开发过程被终止,只能使用 Windows 中的 Python 进行 MetaTrader5 自动交易功能的开发。坚持使用 macOS 系统环境进行开发的解决方案是,在 macOS 系统中使用 Docker / Orbstack 安装 Windows,然后在虚拟环境中的 Windows 安装 Python 和 MetaTrader5 并将其进行连接,这种情况下,在虚拟环境中运行诸多软件可能会出现系统级问题,还不如完全直接使用 Windows 系统进行开发环境配置。该问题的其他解决方案在进一步探索中。

相关文章

如何在Python中安装配置MetaTrader5模块
总有一天,我会慢慢长成参天大树
改变命运的唯一手段
豺狼的日子

发布评论