开发多币种 EA 交易(第 20 部分):整理自动项目优化阶段的输送机(一)·综合运用
(3/3)·从手动搬运参数到全流程无人干预,拆解状态机与优先级判定的落地细节
用 SQL 联表把父级策略参数捞出来
在 MT5 的数据库扩展里,想拿到某个任务的父阶段策略参数,不能只查 tasks 单表,得顺着 job→stage→parent stage→parent job→parent task 的链路做多层 JOIN。上面这段拼出的查询,核心是把当前 task 的 id 通过 %d 塞进最内层 WHERE,再在外层用 IN (%s) 批量拉 passes 里的 params 字段。 DatabasePrepare 拿到 request 句柄后,用 DatabaseReadBind 按结构体逐行读,每读一行就把 row.params 拼到 strategiesParams 后面并补逗号。若 request 等于 INVALID_HANDLE 就直接跳过,不会抛异常,但 strategiesParams 会是空串——这点调试时容易漏看。 实盘或回测里接这套逻辑,外汇与贵金属波动剧烈、杠杆风险高,参数初始化失败可能让后续信号计算静默失效。开 MT5 把 DatabasePrint 的 query 打出来,贴进 SQLite 客户端跑一遍,确认联表能返回非空 params 再接后续。
StringFormat("SELECT params" " FROM passes " " WHERE id_pass IN(%s);", passes_) ); Print(query); class="type">int request = DatabasePrepare(DB::Id(), query); if(request != INVALID_HANDLE) { class=class="str">"cmt">// Structure for reading results class="kw">struct Row { class="type">class="kw">string params; } row; class=class="str">"cmt">// For all query result strings, concatenate initialization rows while(DatabaseReadBind(request, row)) { strategiesParams += row.params + ","; } } DB::Close(); }
◍ 聚类与否的初步组合对照
第三阶段跑完后,strategy_groups 表里已经落了两组合成方案:一组是第二阶段最优组直接拼合、未做聚类的通过 ID;另一组是第二阶段最优组先聚类再拼合的通过 ID。从 passes 表取出这两组的初始化字符串,就能在 MT5 里比对两套组合的实际表现。 未聚类的版本净利润更高,但带聚类的版本夏普比率更优、净值曲线线性更好。这还只是中间产物,不是终版 EA 的定论,暂不做细拆。 往后的动作是把导出库弄进数据文件夹,生成 ExportedGroupsLibrary.mqh,再拷到工作目录——可用 Python 脚本或 DLL 的系统复制函数完成。最后阶段只需编译最终 EA,用新版本拉起终端即可。整套链路实现耗时很长,剩余细节留待下一篇。
「把输送机当实验台用」
第一阶段的自动执行已经跑通,意味着优化流水线不再靠手点。中间结果随时可查:比如你发现聚类那一步纯属拖慢速度,就直接砍掉;或者反过来,留着聚类、把不做聚类的分支删了,两种路线都能在 MT5 里实测对比。 这个工具真正的价值在后续实验。举例:第一阶段若对输入参数取不同区间分别优化,是各区间单跑更稳,还是同交易品种同周期合并跑更合理?把阶段往输送机上叠,就能逐步拼出复杂度越来越高的 EA。 部分再优化甚至连续再优化也可以排进实验计划——即在不同时间间隔重复优化。外汇与贵金属市场高波动、高杠杆,这类研究性质测试仅基于历史数据,不代表未来收益,所有结果自负风险,实盘前务必在 MT5 策略测试器复核。
把这条线请下神坛
这套多币种框架在 MT5 里最终落成一堆文件:从 Advisor.mqh 1.04 的 EA 基类,到 SimpleVolumesExpert.mq5 1.20 的并行运行端,共 38 个模块,压缩包 MQL5.zip 体量 90.37 KB。作者在第 20 部分把聚类脚本 ClusteringStage1.py 1.01 和 Optimizer.mqh 1.01 放进同一轮优化,说明第二阶段才引入整年 2023 作为前向区间,而第一阶段仅跑 EURGBP H1 的 2018–2023 单品种单实例。 有读者在回测里把 SimpleVolumesStage1 跑成一条平线,根因多半是数据库没按第 13、18、19 部分预填项目与阶段——干净库直接丢优化任务,EA 拿不到初始化字符串数组,自然零输出。想复现的人,先去 ExportedGroupsLibrary.mqh 确认组名数组已生成,再开 LibraryExport.mq5 1.01 导一次。 外汇与贵金属自动化策略回测和实盘偏差可能很大,高杠杆环境下资金曲线回撤概率不低,别把任何历史平线或聚类结果当成可复用的圣杯。线装好了,下不下神坛看你敢不敢拿真账户去撞前向检验。