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

问题描述 投票:0回答:6

我有多个使用以下代码连接到 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 默认指向第一次安装有关,或者与您根本不会想到的类似情况有关。只是在这里大声思考。

python metatrader5
6个回答
3
投票

问题在于 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")

2
投票

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

我通过创建虚拟机并通过虚拟机运行所有内容来克服这个问题。 我使用 Oracle VM 因为它是免费的,我过去有过使用它的经验,但它不太擅长共享资源。

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


1
投票

您必须在路径中包含

terminal64.exe
。这对我有用:

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

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

            

1
投票
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()

0
投票

根据我的经验,MT5 尝试使用最新开放的 MT5 终端。我的意思是,如果我运行另一个终端,同时使用 MT5 终端进行代码,即使我安装在另一个驱动器中,我的代码也会开始操作我的终端。

MQL 最近推出了其网络终端,当您从互联网上运行它时,它与 MT5 终端是分开的。我听说它可以被 mql5 使用,我想尝试我的代码使用网络终端以某种方式解决这个问题。但我没有找到任何有关它的文档。也许用 python 也是不可能的。但我猜 mql5 语言可能会解决我们使用 Web 终端的大部分问题。


0
投票

试试这个:


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次

© www.soinside.com 2019 - 2024. All rights reserved.