我有多个使用以下代码连接到 Mt5 终端的 python 程序。
# 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 模块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")
根据我的经验,恕我直言,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'
import MetaTrader5 as mt5
# account details
account1 = {
"login": 123456,
"password": "password1",
"server": "MT5Server1",
}
account2 = {
"login": 654321,
"password": "password2",
"server": "MT5Server2",
}
# connect to MT5 servers
mt5.initialize()
# login to first account
account1_result = mt5.login(account1["login"], account1["password"], account1["server"])
if account1_result:
print(f"Logged in to account {account1['login']}")
else:
print(f"Failed to login to account {account1['login']}: {mt5.last_error()}")
# login to second account
account2_result = mt5.login(account2["login"], account2["password"], account2["server"])
if account2_result:
print(f"Logged in to account {account2['login']}")
else:
print(f"Failed to login to account {account2['login']}: {mt5.last_error()}")
# disconnect from MT5 servers
mt5.shutdown()
根据我的经验,MT5 尝试使用最新开放的 MT5 终端。我的意思是,如果我运行另一个终端,同时使用 MT5 终端进行代码,即使我安装在另一个驱动器中,我的代码也会开始操作我的终端。
MQL 最近推出了其网络终端,当您从互联网上运行它时,它与 MT5 终端是分开的。我听说它可以被 mql5 使用,我想尝试我的代码使用网络终端以某种方式解决这个问题。但我没有找到任何有关它的文档。也许用 python 也是不可能的。但我猜 mql5 语言可能会解决我们使用 Web 终端的大部分问题。
试试这个:
import MetaTrader5 as mt5_1
import MetaTrader5 as mt5_2
counter = 0
while True:
counter += 1
print(str(counter), "----------------------")
mt5_1.initialize(path="d:\\MT5_1\\terminal64.exe", portable=True)
print(mt5_1.symbol_info_tick("XAUUSD"))
mt5_2.initialize(path="d:\\MT5_2\\terminal64.exe", portable=True)
print(mt5_2.symbol_info_tick("XAUUSD"))
我一秒循环了1400次