MQL5酷客宝典 - 滑动通道编程·综合运用
◍ 中间柱数不足时极值点的取舍逻辑
分形识别里有个硬约束:两个极值之间必须夹够 m_bars_between 根柱,否则这个点大概率只是噪音。代码里先用 bars_between<m_bars_between 判门槛,不够就进入跳过或删除分支。 若前一点被标记为相关(RELEVANT_EXTREMUM_PREV),且系统已初始化(m_is_init 为真),直接 continue 忽略本轮;未初始化时则把当前点标为待删,并把记录时间切到 time1。日志会打出“当前点将会被忽略”加具体时间。 反过来,当最新点是相关点:已初始化则删掉前一点(to_delete_frac=true);未初始化则把待处理时间换成 time2。若 curr_frac_date 落到 time2 上,同样 continue 不入库。 真正执行删除只在 to_delete_frac 为真时触发,调用 this.Delete(curr_fractal_num-1);失败会打印“从集合中删除最新点出错”并返回 -1。外汇与贵金属波动快,这类中间柱阈值设太小,回测里容易把毛刺当结构,实盘高风险,建议开 MT5 把 m_bars_between 从 2 调到 3~5 对比分形密度。
if(bars_between<m_bars_between) { class="type">bool to_delete_frac=class="kw">false; if(m_to_log) Print("中间柱数不足,会跳过一个点。"); if(m_rel_frac==RELEVANT_EXTREMUM_PREV) { class="type">class="kw">datetime curr_frac_date=time2; if(m_is_init) { class="kw">continue; } else { to_delete_frac=true; curr_frac_date=time1; } if(m_to_log) { PrintFormat("当前点将会被忽略: %s", TimeToString(curr_frac_date)); } } else { class="type">class="kw">datetime curr_frac_date=time1; if(m_is_init) { to_delete_frac=true; } else { curr_frac_date=time2; } if(m_to_log) PrintFormat("之前点被跳过: %s", TimeToString(curr_frac_date)); if(curr_frac_date==time2) class="kw">continue; } if(to_delete_frac) { if(!this.Delete(curr_fractal_num-class="num">1)) { Print("从集合中删除最新点出错!"); class="kw">return -class="num">1; } } }
「用替换分形给通道降噪」
EA 名叫 ChannelsPlotter,纯为验证滑动通道绘制逻辑而生,跑出来的效果见图15:横盘没趋势时分形频繁触发,通道边缘会不停闪。 根源在于普通分形对邻近极值太敏感,柱数差一点就重画。直接从代码库借 X-bars 分形指标替掉原版,极值点间隔被强制拉大,闪烁明显收敛。 实测把分形窗口设成 23 根柱,通道形态如文内图16,干扰比默认分形少一大截。 结论很直接:判定分形时允许的邻近柱数越少,图表上通道毛刺越多;外汇和贵金属波动杂讯大,这类通道只适合辅助判区间,高风险品种别单独拿来猜突破。
文件落位与后续信号方向
等距通道的编程框架借用了 Victor Barishpoltz 的滑动通道思路,本篇只解决了通道绘制与分形锚点替换,交易信号留到后续文章再拆。 工程文件建议丢进项目目录 <data folder>\MQL5\Projects\ChannelsPlotter,分形指标 X-bars_Fractals 的源码必须放在 <data folder>\MQL5\Indicators 并先编译,否则通道取点会直接报错。 随附四个文件里有 channelsplotter.mq5(5.34 KB)和 x-bars_fractals.mq5(11.58 KB),在 MT5 里按上述路径放好就能加载验证通道重绘逻辑。外汇与贵金属波动剧烈,这类通道仅作概率参考,实盘前务必用历史数据自测。