自动优化 MetaTrader 5 专用 EA(基础篇)
📘

自动优化 MetaTrader 5 专用 EA(基础篇)

第 1/3 篇

「让 EA 自己跑参数优化」

MT5 内置的测试器支持对 EA 做自动优化,不必手动逐个改参数试错。交易者只要框定每个输入变量的取值范围与步长,平台就能在策略测试器里批量回测并排出结果表。 实际跑过的人知道,一次完整优化可能扫过上千组参数组合。以 2018 年那篇实操记录为例,作者在 10 月 23 日发布的 EA 自动优化案例,到截稿时已有 6727 次浏览、24 条讨论,说明这类需求在 MT5 用户里一直很硬核。 外汇和贵金属杠杆高、滑点跳空频繁,自动优化出来的漂亮曲线不等于实盘能复现。建议先把优化样本限制在最近 3 个月行情,再拿样本外数据验一次,概率上更稳。

让 EA 参数自己每周调一次

BuddyIlan 这套 EA 跑的是四个核心参数:SL、TP、STOFilter、STOTimeFrameFilter。行情每周都在换节奏,手工去调这四个值基本不现实,更别说坚持每周都做。 我们原本想在 MT5 里找现成的定时优化机制,把这种重复活儿自动化,但翻了一圈没找到能直接用的方案。 最后只能自己写一套调度逻辑,让 EA 每周自动跑优化,而不是靠人盯着去点。外汇和贵金属波动大,参数跟不上市况,策略失效的概率会明显抬升。 参考过 MT4 上 Igor Malcev 写过的真实账户自动优化思路,但 MT5 环境得重做,不能直接搬。

◍ 让两个 MT5 实例接力跑优化

实际部署时,建议起两个 MetaTrader 5 实例:第一个 7×24 小时挂着 BuddyIlan EA 和待优化的优化器 EA,第二个实例专门负责启动遗传优化进程。两个实例分工,能避免优化计算拖慢实盘 EA 的tick响应。 优化跑完,优化器 EA 会把结果写进全局变量(GlobalVariable),同机的 BuddyIlan EA 直接读这些变量加载新参数,不需要手动搬运 set 文件。 我们把优化排程钉在每周六执行,全程无人工干预。这样周末流动性稀薄时让机器自己换参数,周一开盘即按新逻辑运行,外汇与贵金属品种周末跳空风险仍须自行评估。

「用 xcopy 打通两个 MT5 实例的数据通道」

做跨实例协同优化时,得跑两个 MetaTrader 5 实例。一个实例专门把配置、参数和报告文件推给另一个,避免手动来回搬。 MT5 沙箱限制很死,EA 不能直接读写沙箱外的路径。绕开这层限制的办法是借 Windows 的 shell32.dll 调 DOS 的 xcopy 命令,让系统级进程去抄文件。 声明上要先用 #import 引 shell32.dll 的 ShellExecuteW,再把源实例的 common.ini 拼成绝对路径,丢给 xcopy 复制到 Files\Optimiser\ 下,参数带 /y 覆盖不弹窗。 同一次调用里还能顺手拉起第二个 terminal64.exe 并喂 optimise.ini,返回值小于 32 就说明启动失败。整套动作在下面代码里一次成型,开 MT5 挂上 DLL 授权就能复现。

MQL5 / C++
class="macro">#class="kw">import  "shell32.dll"
class="type">int ShellExecuteW(class="type">int hwnd,class="type">class="kw">string Operation,class="type">class="kw">string
                    File,class="type">class="kw">string Parameters,class="type">class="kw">string Directory,class="type">int ShowCmd);
class="macro">#class="kw">import
class="type">class="kw">string PathIniFile = sTerminalTesterDataPath + "\config\common.ini";
class="type">class="kw">string PathTester=TerminalInfoString(TERMINAL_DATA_PATH)+"\MQL5\Files\Optimiser\";
class="type">int ret=ShellExecuteW(class="num">0,"Open","xcopy","\"+PathIniFile+"\" \""+PathTester+"\" /y","",class="num">0);
class="type">int start = ShellExecuteW(class="num">0, "Open", sTerminalTesterPath + "\terminal64.exe", "/config:" + TerminalInfoString(TERMINAL_DATA_PATH) + "\MQL5\Files\Optimiser\optimise.ini", "", class="num">0);
if(start<class="num">32)
  {
   Print("Failed starting Tester");
   class="kw">return false;
  }

用 common.ini 让 MT5 启动即跑优化

MT5 支持以命令行方式拉起,这给无人值守的自动任务留了口子。除了手动敲参数,还能在程序目录的 common.ini 里写死启动行为,让终端一开就进测试器。 具体做法是在 common.ini 追加 [Tester] 段,把优化相关的配置写进去,MT5 启动时便会直接开始自动优化,不必再进界面点按钮。 这套机制适合夜里挂机跑参数扫描,但外汇与贵金属杠杆高、滑点跳空频繁,回测优出来的参数实盘可能迅速失效,建议只当初筛。

◍ 实现

优化器 EA 需要知道 MetaTrader 5 测试其实例的路径,它们将作为参数输入。 我们已在第一个 MetaTrader 5 实例中定义了一个工作目录:“MQL5\Files\Optimiser”。 以下函数“CopyAndMoveCommonIni()”复制 MetaTrader 5 测试器实例的默认配置文件“common.ini”,并将其重命名为“optimise.ini”。 若对此感兴趣,可以在以下地址找到有关“ShellExecuteW”函数的更多信息: ShellExecuteW 。 此函数不等待 DOS 命令执行的返回结果,因此使用延迟(Sleep 2500)。 我们在这个文件中添加“Tester”: 在这个代码块中,我们定义了想要优化的智能系统(“BuddyIlan”) - 这个 EA 必须存在于第二个环境中 - 并且 ExpertParameters 文件为“BuddyIlanTester.set”(注意不要使用与您的 EA 相同的名称),我们设置周期(FromDate - ToDate)和优化所需的所有参数。 我们设置“ShutdownTerminal = 1”,这意味着终端将在优化结束时关闭。 报告将在文件“Files\Reports\BuddyIlanReport”中生成 - “.xlm”扩展名将由平台添加。 如果运行的 EA 位于 CPU 资源较低的虚拟服务器上,则可以使用某些远程或云代理(请参阅“UseRemote”或“UseCloud”)运行优化过程。 [CODE] <span class="keyword">input</span> <span class="keyword">string</span> sTerminalTesterPath = <span class="string">"C:\\Program Files\\ForexTime MT5"</span>; <span class="keyword">input</span> <span class="keyword">string</span> sTerminalTesterDataPath=<span class="string">"C:\\Users\\BPA\\AppData\\Roaming\\MetaQuotes\\Terminal\\5405B7A2ED87FF45712A041DEF45780"</span>; <span class="keyword">bool</span> CopyAndMoveCommonIni() &nbsp;&nbsp;{ &nbsp;&nbsp; <span class="keyword">string</span> PathIniFile= sTerminalTesterDataPath+<span class="string">"\\config\\common.ini"</span>; &nbsp;&nbsp; <span class="keyword">string</span> PathTester = <span class="functions">TerminalInfoString</span>(<span class="macro">TERMINAL_DATA_PATH</span>)+<span class="string">"\\MQL5\\Files\\Optimiser\\"</span>; &nbsp;&nbsp; <span class="keyword">int</sp

常见问题

可以,用定时器在每周固定时间触发 OnTester 或脚本调用优化接口,把结果写回配置文件即可实现自动周更。
在一台跑前半段品种、另一台跑后半段,用共享目录或同步工具互传优化结果文件,最后合并最优参数。
小布可以读取你的优化输出文件,对比新旧参数表现,在表现下滑时推送换参提醒,不用你自己翻日志。
改终端的 common.ini 加入自启脚本项,开机或重启后直接调起优化任务,跑完按设定退出或待机。
用系统自带的目录同步命令做增量拷贝,配合写完校验文件再改名的机制,可避免半截文件被读取。