MT5/Metatrader 5 使用 python 连接到不同的 MT5 终端

MT5/Metatrader 5 connect to different MT5 terminals using python

我有多个 python 程序使用以下代码连接到 Mt5 终端。

# Establish connection to the MetaTrader 5 terminal
if not mt5.initialize("C:\Program Files\ICMarkets - MetaTrader 5 - 01\terminal64.exe"):
    print("initialize() failed, error code =", mt5.last_error())
    quit()

这里是 MT5 的 python 模块 - https://www.mql5.com/en/docs/integration/python_metatrader5

我遇到的问题是,当多个程序连接到同一个 MT5 terminal.exe 时,性能下降并且一个或多个 python 程序退出并出错。为了克服这个问题,我安装了多个 MT5 副本并更新了 python 代码,以便 python 程序的不同副本使用不同的 MT5 安装。但是,只有MT5的第一次安装是唯一可以被所有python程序调用的。尝试使用来自其他安装的任何其他 terminal.exe 会引发异常并且连接失败。

互联网上也没有太多解决此问题的信息。如果有人有解决此问题的想法或已经解决了问题,我很想听听您的意见。

这样的错误是-

initialize() failed, error code = (-10003, "IPC initialize failed, Process create failed 'C:\Program Files\ICMarkets - MetaTrader 5 - 02\terminal64.exe'")

这可能与 Windows 的默认指向第一次安装或类似的事情有关,您甚至都不会想到。只是在这里大声思考。

根据我的经验,恕我直言,MT5 python API 并非设计用于同时处理来自同一台机器的多个连接。

我通过创建虚拟机克服了这个问题,运行 一切都通过它们。 我使用 Oracle VM 是因为它是免费的,我有过使用经验,但它不太擅长共享资源。

如果您的机器不是很强大,您可能需要研究其他解决方案。 听说Docker擅长分享宿主资源

您必须在路径中包含 terminal64.exe。这对我有用:

 path1='C:\Program Files\Capitaria MT5 Terminal\terminal64.exe'

 path2='C:\Program Files\Admiral Markets MT5\terminal64.exe'

            

问题出在 MT5 的 python 模块 https://www.mql5.com/en/docs/integration/python_metatrader5

他们对该模块的编码方式不允许您 运行 该模块的多个实例,您只能连接到一个终端。 但我对这个问题有一个肮脏的解决方案,请仔细阅读! :

1 - 从 C:\Users\your_user_name\AppData\Local\Programs\Python\Python38\Lib\site-packages\MetaTrader5

复制 metatrader5 python 包

2 - 将其添加到您的项目位置

3 - 在您的项目中复制“MetaTrader5”文件夹并将其重命名为不同的名称,如“Meta2”

4 - 像这样导入该文件夹:

import MetaTrader5 as mt5
import Meta2 as mt2
import time

if not mt5.initialize(path="C:/Program Files/Fusion Markets MetaTrader 5/terminal64.exe",login=xxxx, server="FusionMarkets-Demo",password="xxxxx"):
        print("initialize() failed, error code =",mt5.last_error())

if not mt2.initialize(path="C:/Program Files/MetaTrader 5 EXNESS/terminal64.exe",login=xxxxx, server="Exness-MT5Trial",password="xxxxx"):
        print("initialize() failed, error code =",mt5.last_error())  
       
fusion_ticker = mt5.symbol_info_tick("EURUSD")
exness_ticker = mt2.symbol_info_tick("EURUSDm")