刚截了张图,是我MT5数据文件夹里那个MQL5目录的截图,Experts下面躺着十几个EA,旁边Include里一堆mqh头文件,Files文件夹里还有csv和set文件混在一起。这画面估计很多汇友都眼熟,每次换VPS或者重装系统,光是把EA搬过去就得折腾半天,更别提那些引用了外部库的,搬过去一编译全是红字报错。
问题就出在这:很多人以为把ex5文件复制走就完事了,结果EA一跑起来要么提示找不到dll,要么读不到csv数据,要么指标句柄全是INVALID_HANDLE。我上周帮一个汇友看他的黄金剥头皮EA,就是典型的依赖没打包全,他在本地跑得好好的,上了VPS之后挂单逻辑直接失效,查了半天发现是少了Files目录下的一个品种参数配置表,EA读不到默认值就静默跳过了开仓条件,这种坑最要命,因为不报错,你根本不知道它没干活。
我的做法是分三步走,先把依赖摸清楚再打包。第一步,打开EA源码,用Ctrl+F搜几个关键词:#include、FileOpen、iCustom、DLL,把所有引用的头文件路径、外部文件名、自定义指标名全列出来。第二步,按MT5的目录结构归类,Include里的mqh归一类,Files里的数据文件归一类,Indicators里的自定义指标归一类,Libraries里的dll归一类,千万别只复制Experts文件夹,这是最常见的错误。第三步,在VPS上按同样的相对路径还原,注意MQL5目录的层级不能变,比如你EA里写的是"Files\\Gold\\param.csv",那VPS上就必须是MQL5\\Files\\Gold\\param.csv,少一层都读不到。
还有个坑我踩过两次,就是相对路径和绝对路径混用。有些EA写死了绝对路径比如C:\\Users\\xxx\\AppData\\...,这种上了VPS必挂,得改成相对路径或者用TerminalInfoString拿数据目录。另外打包完别急着上实盘,先在VPS上用策略测试器跑一遍单品种回测,能正常开平仓、能读到外部文件、日志里没有"cannot open file"字样,才算依赖齐了。我现在的习惯是每个EA配一个readme,把依赖清单写清楚,换机器的时候照着清单核对,五分钟搞定,比事后debug省心多了。
你们平时打包EA是手动复制还是有什么更省事的办法?有没有遇到过那种编译过了但运行时不报错、就是不出信号的诡异情况,评论区聊聊。
问题就出在这:很多人以为把ex5文件复制走就完事了,结果EA一跑起来要么提示找不到dll,要么读不到csv数据,要么指标句柄全是INVALID_HANDLE。我上周帮一个汇友看他的黄金剥头皮EA,就是典型的依赖没打包全,他在本地跑得好好的,上了VPS之后挂单逻辑直接失效,查了半天发现是少了Files目录下的一个品种参数配置表,EA读不到默认值就静默跳过了开仓条件,这种坑最要命,因为不报错,你根本不知道它没干活。
我的做法是分三步走,先把依赖摸清楚再打包。第一步,打开EA源码,用Ctrl+F搜几个关键词:#include、FileOpen、iCustom、DLL,把所有引用的头文件路径、外部文件名、自定义指标名全列出来。第二步,按MT5的目录结构归类,Include里的mqh归一类,Files里的数据文件归一类,Indicators里的自定义指标归一类,Libraries里的dll归一类,千万别只复制Experts文件夹,这是最常见的错误。第三步,在VPS上按同样的相对路径还原,注意MQL5目录的层级不能变,比如你EA里写的是"Files\\Gold\\param.csv",那VPS上就必须是MQL5\\Files\\Gold\\param.csv,少一层都读不到。
- 头文件依赖:把Include下所有被引用的mqh连同它自己再引用的子头文件一起打包,漏一个就编译不过
- 数据文件:csv、set、txt这些,路径大小写要跟代码里完全一致,Linux架构的VPS对大小写敏感
- 自定义指标:iCustom调用的指标必须编译成ex5放进Indicators对应子目录,否则句柄返回-1
- dll库:32位和64位别搞混,MT5是64位的,放错了加载直接失败
还有个坑我踩过两次,就是相对路径和绝对路径混用。有些EA写死了绝对路径比如C:\\Users\\xxx\\AppData\\...,这种上了VPS必挂,得改成相对路径或者用TerminalInfoString拿数据目录。另外打包完别急着上实盘,先在VPS上用策略测试器跑一遍单品种回测,能正常开平仓、能读到外部文件、日志里没有"cannot open file"字样,才算依赖齐了。我现在的习惯是每个EA配一个readme,把依赖清单写清楚,换机器的时候照着清单核对,五分钟搞定,比事后debug省心多了。
你们平时打包EA是手动复制还是有什么更省事的办法?有没有遇到过那种编译过了但运行时不报错、就是不出信号的诡异情况,评论区聊聊。
