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")
我有多个 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")