凌晨两点四十,MT5终端还开着,Python脚本第三次抛出那个熟悉的报错:ipc_init failed,error code 0x8001011F。说实话这玩意儿比EA里的数组越界还难缠,因为日志给的信息几乎等于没说。折腾了大半夜,把三个藏得比较深的配置项捋了一遍,记录一下,免得后面再踩。
先说环境,免得有人对不上号。Windows Server 2019的VPS,MT5 build 4260,Python 3.11,MetaTrader5包版本5.0.45。脚本逻辑很简单,就是通过Python读欧美EURUSD的实时报价然后写回CSV。报错发生在initialize()那一步,不是连接超时,是IPC通道初始化直接失败。
排查过程按顺序来:
另外补充一个细节,如果你的脚本里用了time.sleep()去等initialize返回,别用太短的间隔,我试过0.5秒会偶发失败,改成2秒稳定很多。还有就是MetaTrader5这个包最好用pip装指定版本,别用最新,5.0.45在我这跑欧美和黄金都稳,5.0.48反而有个句柄泄漏的bug。
现在脚本跑了一周多没再出问题,镑美和黄金的报价读取都正常。如果你也卡在ipc_init这一步,先按上面三项过一遍,大概率能解决。有没有人遇到过initialize成功但symbol_info返回None的情况?那个我还没完全搞明白,交流。
先说环境,免得有人对不上号。Windows Server 2019的VPS,MT5 build 4260,Python 3.11,MetaTrader5包版本5.0.45。脚本逻辑很简单,就是通过Python读欧美EURUSD的实时报价然后写回CSV。报错发生在initialize()那一步,不是连接超时,是IPC通道初始化直接失败。
排查过程按顺序来:
- 第一项:MT5终端的“允许算法交易”和“允许DLL导入”。这个最容易被忽略,因为手动跑EA时大家都会勾,但Python桥接走的是另一条通道。我一开始只勾了算法交易,DLL导入没开,结果ipc_init就是过不去。注意,这两个选项在“工具-选项-Expert Advisors”里,必须同时勾选,改完要重启终端,不是刷新就行。
- 第二项:终端启动参数里的 /portable 模式。这个坑我踩得最狠。我的VPS上装了两个MT5,一个跑实盘一个跑回测,Python默认去找安装目录下的terminal64.exe,但那个实例是用/portable启动的,数据目录在别处。结果Python连的是另一个没开算法交易的实例。解决办法是在initialize()里显式指定路径:mt5.initialize(path=r"C:\MT5_Real\terminal64.exe")。如果你不确定,用mt5.terminal_info()看commondata_path对不对。
- 第三项:Windows的DEP和UAC对IPC句柄的影响。这个最隐蔽。VPS默认UAC是开的,Python进程和MT5进程如果不在同一完整性级别,命名管道会被拦截。我后来把Python和MT5都设成“以管理员身份运行”,并且在“高级系统设置-性能-数据执行保护”里把terminal64.exe和python.exe都加进例外列表。改完必须重启VPS,不是重启进程。这一步做完ipc_init才彻底不报了。
另外补充一个细节,如果你的脚本里用了time.sleep()去等initialize返回,别用太短的间隔,我试过0.5秒会偶发失败,改成2秒稳定很多。还有就是MetaTrader5这个包最好用pip装指定版本,别用最新,5.0.45在我这跑欧美和黄金都稳,5.0.48反而有个句柄泄漏的bug。
现在脚本跑了一周多没再出问题,镑美和黄金的报价读取都正常。如果你也卡在ipc_init这一步,先按上面三项过一遍,大概率能解决。有没有人遇到过initialize成功但symbol_info返回None的情况?那个我还没完全搞明白,交流。
