您应当知道的 MQL5 向导技术(第 09 部分):K-Means 聚类与分形波配对·综合运用
一年多窗口里的回测与前向验证
在 2022.01.01 至 2023.02.01 的回测区间里,策略跑出的报告完全依赖优化阶段产出的那组输入参数,没有额外人为干预。 把同一组参数直接丢进 2023.02.02 到 2023.10.01 的前瞻测试,约八个月窗口给出的报告显示出一定前景,但样本跨度仍偏短。 外汇与贵金属品种受事件驱动明显,这类短窗口结论只具参考意义,建议拉长到数年、跨越多类行情再去验证参数鲁棒性。
◍ 用分形顶点喂给聚类模型
把收盘价变化换成 fractal 顶点之间的价差,思路上能更贴合波浪形态,但工程上先得解决指标缓冲区的坑。分形指标自带两个缓冲区:索引 0 存高点、索引 1 存低点,没有分形的位置会用 DBL_MAX 占位,所以遍历时得逐个索引判断是不是真有价格。 向量 m_wave 的装载逻辑是:先按 m_fractals.Available() 给出的可用索引数跑 for 循环,同一根柱线最多只有一个缓冲区非 DBL_MAX,命中就写进 m_wave。缓冲区大小定为 _size = 训练点 + 特征数 + 1,多出来的那一行是留给还没算出 y 值的当前点。 首次运行常常只抓到 3 个分形,远少于预设的 12 个波浪位,这时 EA 实质还在初始化,不吐任何信号。等缓冲区被填满,才进入正常推理。 回测里这套分形输入看着有戏,但前瞻测试净值是连续下滑的,没法复现之前按收盘价变化调参得到的盈利。外汇与贵金属杠杆高,这类未验证模型直接上实盘风险极大。 一个可能的改进是写自定义分形:只输出分形价格点,并加一个参数限定相邻分形间最小波动,过滤掉噪声顶点再送进 k-均值。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Get k-means cluster output from identified cluster. | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">class="kw">double CSignalKMEANS::GetOutput() { ... class="type">int _size=m_training_points+m_point_features+class="num">1,_index=class="num">0; for(class="type">int i=class="num">0;i<m_fractals.Available();i++) { class="type">class="kw">double _0=m_fractals.GetData(class="num">0,i); class="type">class="kw">double _1=m_fractals.GetData(class="num">1,i); if(_0!=DBL_MAX||_1!=DBL_MAX) { class="type">class="kw">double _v=class="num">0.0; if(_0!=DBL_MAX){_v=_0;} if(_1!=DBL_MAX){_v=_1;} if(!m_loaded){ m_wave[_index]=_v; _index++; } else { for(class="type">int i=_size-class="num">1;i>class="num">0;i--){ m_wave[i]=m_wave[i-class="num">1]; } m_wave[class="num">0]=_v; break; } } if(_index>=class="type">int(m_wave.Size())){ break; } } if(!m_loaded){ m_loaded=true; } if(m_wave[_size-class="num">1]==class="num">0.0){ class="kw">return(class="num">0.0); } ... ... }
「两种数据设置的初步交叉验证差异」
前面把 k-均值聚类接进 AlgLib 跑了两套设置:直接用原始收盘价,以及用分形价格数据。初步交叉验证里两者结果并不一样,原始收盘价系统看起来比 fractals 方式更有搞头。 我们之前拆过原因,也给了对应源代码:维基百科那批数据用来做参照,研究之门上的材料补了方法细节。开 MT5 把这两份源数据分别喂进同一套聚类逻辑,能直接复现偏差。 外汇和贵金属行情受杠杆与跳空影响大,这类聚类信号只代表历史样本里的统计倾向,实盘前务必用小资金验证。
别急着下结论
随文附带的四个文件可直接用于 MT5 验证:Kmeans.mq5(6.66 KB)、kmeans_r1.mq5(6.85 KB)、SignalWZ_9.mqh(10.17 KB)、SignalWZ_9_r1.mqh(11.5 KB),解压后拖进 MetaEditor 编译即可跑通前文逻辑。 想真正吃透这套聚类信号,建议先翻 MQL5 向导的相关使用说明,再对照代码改一次距离阈值参数看样本划分变化。外汇与贵金属杠杆高、滑点随机,任何历史回测优异都不代表实盘概率占优。 材料版权归原发布方,转载受限;文中策略观点属个人经验,实盘前务必自己跑一遍组合对称交叉验证,衡量过拟合程度再上资金。