说实话,我数不清有多少次在准备启动一个新EA的时候,眼睁睁看着那个红色的“DLL imports are not allowed”弹出来。编译通过了,文件也放到文件夹里了,代码检查了八百遍,结果MetaTrader就是给你摆一张臭脸。最气人的是,有时候同样的操作在别人电脑上跑得飞起,到你这就卡住了。
后来我仔细琢磨了一下,发现问题不在MT4本身,而是Windows在背后使绊子。我把这几年踩过的坑整理一下,重点说几个官方文档里没写明白的地方。
第一步:软件层面的开关(这个大家都知道)
打开MT4,菜单栏点 工具 > 选项 > 智能交易系统。在“允许自动交易”那一片选项里,有个“允许DLL导入”的复选框,打上勾。这是最基本的一道门。
但有个细节很多人没注意到:就算你勾了,如果你的EA调用的DLL文件本身有数字签名问题,或者是个比较老旧的第三方库,MT4照样会把它拦下来。MQL5官方文档(docs.mql5.com)里关于
#import指令的说明,只讲了怎么导入,根本没提Windows这一层会怎么处理。这属于文档的“留白地带”,得靠实际经验去填补。第二步:Windows 10和11的隐藏区别(独家观察)
我这里说的绝对不是网上那些“右键管理员运行”的万能答案。我亲自试过,在Win10上,管理员运行基本能解决八成的问题。但到了Win11,情况变得复杂了。Win11默认开启了内核隔离和内存完整性这两个安全功能,它们会阻止未经数字签名的DLL加载到MT4的进程里。这个问题你翻遍MetaQuotes的帮助中心都不会找到答案,因为这不是他们能控制的事情。
我找到的解决办法是:把整个
MQL4\Libraries 文件夹添加到Windows Defender的排除列表里。注意,是文件夹,不是单个DLL文件。具体操作:C:\Users\[你的用户名]\AppData\Roaming\MetaQuotes\Terminal\[终端ID]\MQL4\Libraries\。补充一句:如果你用的是绿色免安装版的MT4,路径会不一样,但原理相同——把整个Libraries文件夹放进去。
第三步:绿色版(便携版)的特殊处理
便携版MT4有个老毛病,它不像安装版那样会在Windows注册表里留下痕迹,所以系统有时候不认它。这就导致即使用了上面的方法,DLL还是加载失败。我一般的处理方式是:先按第二步做完排除,然后把整个MT4文件夹的“只读”属性去掉,最后再以管理员身份运行。三步缺一不可,顺序也别乱。
第四步:怎么确认问题到底在哪
别瞎猜,直接看MT4下面的“智能交易系统”选项卡(就是终端窗口那一栏)。如果报错信息是“DLL function call failed”加函数名,那基本就是权限问题,按上面的步骤走一遍就能解决。如果报错是“cannot open file”或者“file not found”,那问题就简单了——DLL根本不在Libraries文件夹里,或者文件名打错了。DLL文件名是区分大小写的,
MyLib.dll和mylib.dll是两个东西,别在这种地方犯低级错误。参考来源: MetaQuotes MQL5官方文档. "DLL导入." docs.mql5.com。
参考来源: 微软官方技术支持. "Windows 10和11的内核隔离设置." support.microsoft.com。
本文首发于FXEAR.com,原创内容,未经授权禁止转载。