多周期分形锯齿形指标实战解析
用自研MQL4指标规避标准锯齿形重绘坑
为什么交易者痴迷于锯齿形调整浪
锯齿形调整浪(ZigZag)是技术分析中极具辨识度的指标,它以折线形式连接市场的显著高点和低点,直观呈现价格的主要波动路径。大量社区讨论与各类版本的出现,证明交易者对它一直非常感兴趣。原因在于,它是少数能以图形方式鲜明展示市场核心变动的工具,甚至直接影响交易者的情绪,促使人们基于视觉信号立即行动。然而,绝大多数使用者忽略了一个事实:标准锯齿形并非为直接产生交易信号而设计,它只是结构描绘工具,但人们总试图把它和当前行情强行关联,从而陷入误用。
更隐蔽的问题是,标准锯齿形在右端会不断重绘——新的K线出现后,最近的拐点可能被撤销或平移。当你正盯着屏幕察觉到“预测裂缝”时,这种无限重绘并非优势,反而容易让交易决策建立在虚幻的确认之上。理解这一点,是我们讨论改进方案的前提。
标准锯齿形调整浪的核心缺陷
作者在开发自用指标前,曾尝试采用常规意义的锯齿形,但以下问题让他警惕并放弃:第一,算法一致性存疑,尽管网上版本繁多,但清晰解码的计算逻辑极少,大多数只是参数层面的修补;第二,缺乏“目标”概念,即指标究竟在寻找何种数学本质的极值并不明确;第三,重绘极其频繁且可预测性差,最近节点随价格跳动反复更改;第四,直接依赖时间周期或预设价格偏移,无法灵活适配非标准周期。最后一点尤其不可接受,因为交易工具不应被固定框架束缚隐私式偏好。
- 算法不透明:互联网多版本但少有严格解码
- 目标缺失:不知极值筛选的市场逻辑
- 重绘糟糕:频繁且不可预测地修改末端节点
- 周期依赖:强绑定TF与价格偏移,灵活性差
从肤浅工具到逻辑极值的认知转折
市场并不简单,初学者常选“最简单”而非“合适”的资料,把支撑阻力尺规、斐波那契、柱循环等肤浅东西装入工具库。更糟糕的是,有人简化Gann理论——一个尚未被完全理解的价格时间解决方案,这是本末倒置。当系统胜率略高于50%时,交易者又归咎专家骗人。实则他们忘了:极值不是最大最小值的同义词,而是内在本质的另一种表现。基于肤浅看法分析未来,却不去追溯“正确时间正确地点”的来源,必然失效。真正专家不会填鸭式倾囊相授,我们需要自己构建逻辑。
Demark的TD点、Williams的分形,都使用前后价格变动推理来识别初始极值,虽非完美但属同一思路。作者由此编写自己的简单分形指标,选点原则略不同,并通过iCustom多周期调用后,改为在当前工作TF统一计算更合理,最终形成多帧分形锯齿形。
多帧分形锯齿形指标的设计原理
该指标在工作时间范围上形成锯齿形节点,但在三个模拟较大TF(如1440、360、60分钟)上计算这些节点,并绘制于当前图表。它支持标准及非标准TF,代码内实行限制:较大TF必须能被工作TF整除,否则强制取最接近正确值;工作TF不大于最小较大TF;参数周期以分钟降序指定;最大TF周期不超43200分钟(一月)。每个TF仅用一个缓冲区,因合理组合下单个工作柱出现双向极值概率极小。
下图逻辑显示,H1图表上黑色线(60分钟)会拒绝部分分形点,仅保留符合更大周期推理的节点。这种“拒绝”正是消除奇数极值、形成正确锯齿形的关键。指标优点包括:节点重绘相对少,不同TF重合时90-95%不重绘;单图看三TF主次趋势;支持M5到MN1任意周期;计算高效、算法明确。
代码架构与关键片段解读
指标文件MF_Fractal_ZZ_3in1.mq4使用3个缓冲区对应大、中、小周期。init()中做周期校验与强制对齐:若TFSmall不能被CurPeriod整除则向上取整对齐,并检测工作周期不大于最小TF、TF降序且大TF不超43200,否则报警并设ErrorTF=1终止。start()仅调用FractalCalc,并在ErrorTF时退出。
#property indicator_buffers 3
extern int VolExt=50;
extern int TFLarge=1440;
extern int TFMidle=240;
extern int TFSmall=60;
double Large[],Midle[],Small[];
int init() {
IndicatorBuffers(3);
SetIndexBuffer(0,Large); SetIndexStyle(0,DRAW_SECTION);
if (MathCeil(TFSmall/CurPeriod)!=TFSmall/CurPeriod) TFSmall=MathCeil(TFSmall/CurPeriod)*CurPeriod;
if (CurPeriod > TFSmall) {Alert('The chart period must be less than or equal to ',TFSmall); ErrorTF=1;return;}
return;
}
FractalCalc()是核心:用Force 1-3优化——仅完全形成工作柱时算(PrevTimeCalc==Time[0]则退)、仅较大TF成形时算 fissure、从上次 fissure 继续算。它通过iHighest/iLowest在每5根较大TF对应工作柱找峰谷,若中间柱为最高/最低则记节点。随后清理奇数极值:连续两峰取大者留、两谷取小者留,等者取编号小,其余置0,形成规范锯齿。
void FractalCalc () {
if (PrevTimeCalc == Time[0]) return; else PrevTimeCalc=Time[0];
for (y=1; y<=3; y++) {
if (y==1) Per=TFLarge; if (y==2) Per=TFMidle; if (y==3) Per=TFSmall;
P60=Per*60; k=Per/CurPeriod;
i=MathCeil(Bars/k)-5;
for (x=1; x<=i; x++) {
up3=iHighest(NULL,0,MODE_HIGH,k,limit3);
if(High[up3]>High[up2] && High[up3]>High[up1] && High[up3]>=High[up4] && High[up3]>=High[up5]) {
if (y==3) Small[up3]=High[up3];
}
}
}
}
代码大量处理历史缺失、连接断开与柱缺失,保证鲁棒性。作者保留未正常工作的跨TF不一致消除注释块,以及if(NumberExt>VolExt) break加速结构待扩展。剩余5缓冲区可加模块或通过iCustom响应,具扩展性。
与其他方案的对比及适用场景
对比标准锯齿形:本指标重绘少、逻辑目标清晰、周期灵活;对比TD点/Williams分形:选点原则不同但同属推理极值,本指标多周期同图更直观。它不适合作为独立信号发生器,而是趋势结构透镜。当你需要判断H1主趋势又不想切图表时,调出三TF线即可。对于剥头皮者,小TF线可提供微结构;对于波段交易者,大TF线确认拐点有效性。
- 标准ZZ:重绘多、周期死板、算法黑箱
- TD分形:单周期推理、无多帧同图
- 本指标:三TF模拟、拒绝奇数极值、少重绘
常见坑与性能调优
坑一:工作TF大于Small参数,指标报错不画;坑二:参数未降序,init报警;坑三:历史数据不足导致Bars/k-5为负,需保证足够柱数。性能上,VolExt调至10-15可大幅提速;Force结构已避无谓循环;若用iCustom调用,注意传递周期参数一致性。代码未用IndicatorCounted因自有优化已够快,随意加反而乱。
该工具只是木头,你是杰佩托,用它雕匹诺曹还是凳子由你。剩余缓冲区可轻松加新模块,比如结合RSI过滤拐点。作者止步于此,因已完成高效核心,就像削铅笔不为削而为画。下一步,你可接iCustom写EA,或用大TF节点做趋势仓过滤。
总结与学习路径
我们剖析了标准锯齿形缺陷、自研分形逻辑、MQL4实现与多周期价值。中文交易者应先在策略测试器观察重绘行为,再加载实盘图表比对三TF线。进阶可改代码加缓冲区模块,或移植MQL5。记住:极值本质是内在表现,工具为辅,认知为主。原文及附件见 https://www.mql5.com/zh/articles/1531 。