MetaTrader 5 Manager API:存在持仓但PositionGet返回Not found错误
我使用MT5Manager库获取MetaTrader 5中的客户持仓,已确认客户(登录ID:114714)存在且持有eurusd.rw的未平仓持仓,但请求返回错误:(-1, <EnMTAPIRetcode.MT_RET_ERR_NOTFOUND: 13>, 'Not found')。
代码示例
# Include the library import MT5Manager server = "" login = password = "" # Create the graphical interface manager = MT5Manager.ManagerAPI() # Connect to the server if manager.Connect( server=server, login=login, password=password, # pump_mode=MT5Manager.ManagerAPI.EnPumpModes.PUMP_MODE_USERS, timeout=120000 ): # Get the client's position managers = manager.PositionGet(login=114714, symbol="eurusd.rw") print(managers) # Check the position if managers is not False: print(f"Opening price is {managers.PriceOpen}") else: # Failed to retrieve the position list print(f"Failed to get position: {MT5Manager.LastError()}") # Disconnect from the server manager.Disconnect() else: # Failed to connect to the server print(f"Failed to connect to the server: {MT5Manager.LastError()}")
已尝试的操作
- 确认客户登录ID(114714)正确且客户存在
- 检查该客户确实持有
eurusd.rw的未平仓持仓 - 尝试调用
PositionGetAll(login=114714)获取所有持仓,仍未返回预期数据 - 确认合约代码格式正确
可能的原因及解决办法
Manager账号权限不足
代码中用于连接MT5服务器的manager账号(login参数)可能没有查看目标客户持仓的权限。MT5后台对manager账号有严格的权限划分,需要确保该账号拥有查看客户持仓的权限(比如VIEW_CLIENT_POSITIONS权限),或者直接使用管理员级别的账号进行连接。可以登录MT5后台的用户管理模块检查权限设置。未开启正确的Pump模式
MT5Manager需要开启对应的数据同步Pump模式才能获取用户相关数据。你代码中注释掉了pump_mode=MT5Manager.ManagerAPI.EnPumpModes.PUMP_MODE_USERS,取消这行注释,重新连接服务器后再尝试获取持仓。符号名称大小写不匹配
MT5的交易符号名称通常区分大小写,比如后台实际显示的是EURUSD.RW,而你代码中用了小写的eurusd.rw。尝试将符号名称修改为和MT5后台完全一致的大小写格式再测试。持仓状态误判
确认目标持仓确实处于未平仓的活跃状态。如果持仓已经平仓(哪怕是刚刚完成平仓操作),PositionGet接口无法获取到,需要改用DealGet系列接口查询历史交易记录。数据同步延迟问题
连接服务器后,可能需要等待数据同步完成再调用持仓查询接口。可以在连接成功后添加短暂的延迟(比如time.sleep(1)),或者多次调用manager.Pump()触发数据同步,之后再执行PositionGet。
内容的提问来源于stack exchange,提问作者sanjugohel

