创建综合性猫头鹰交易策略·综合运用
「分形与之字折线的源码骨架」
早期基于走势原则的系统今天仍相对可靠,因为它们在个人电脑出现前就已成型,手工可算。全分形指标只依赖一个函数:传入柱形索引和分形方向(向上或向下),命中的话就把该烛最高/最低价写进缓冲区。 Valable ZigZag 是全分形的延续,核心在 Logic 函数,只收一个参数 i,从右往左扫历史。它先算分形填进 frUp / frDown 两个隐藏数组,再按 direction 分上行(0)与下行(1)两段处理。 逆转看收盘价穿越:下跌中收高于最后向上分形即翻多,收低于最后向下分形即翻空;趋势中靠 ClearTheExtraValue 剔除多余转折。外汇与贵金属波动剧烈,这套逻辑实战前请在 MT5 用历史数据验证信号密度。 下面这段是 IsFractal 与 Logic 的原文,逐行对应上面说的判定规则: bool IsFractal(int _i, bool _type) // 判断_i号柱是否分形,_type=true查底分形,false查顶分形 if(_type) // 底分形分支 double low = iLow(_Symbol,PERIOD_CURRENT,_i); // 取当前柱最低价 for(int j=1; j<=FrBarsLeft; j++) // 左邻FrBarsLeft根 if(iLow(_Symbol,PERIOD_CURRENT,_i+j) < low) return false; // 有更低则非底分形 for(int j=1; j<=FrBarsRight; j++) // 右邻FrBarsRight根 if(iLow(_Symbol,PERIOD_CURRENT,_i-j) < low) return false; // 有更低则非底分形 return true; // 左右均无更低,是底分形 else // 顶分形分支 double high = iHigh(_Symbol,PERIOD_CURRENT,_i); // 取当前柱最高价 for(int j=1; j<=FrBarsLeft; j++) // 左侧比对 if(iHigh(_Symbol,PERIOD_CURRENT,_i+j) > high) return false; // 有更高则非顶分形 for(int j=1; j<=FrBarsRight; j++) // 右侧比对 if(iHigh(_Symbol,PERIOD_CURRENT,_i-j) > high) return false; // 有更高则非顶分形 return true; // 左右均无更高,是顶分形 return false; // 默认返回 for(int i=start; i>FrBarsRight && !IsStopped(); i--) { // 从start往左扫 if (IsFractal(i,false)) frUp[i] = iHigh(_Symbol,PERIOD_CURRENT,i); // 顶分形写缓冲区 if (IsFractal(i,true)) frDown[i] = iLow(_Symbol,PERIOD_CURRENT,i); // 底分形写缓冲区 } void Logic(int i) // 之字折线主逻辑,i为当前柱 if(IsFractal(i,false)) // 是顶分形 frUp[i] = iHigh(_Symbol,PERIOD_CURRENT,i); // 记录高价 if(IsFractal(i,true)) // 是底分形 frDown[i] = iLow(_Symbol,PERIOD_CURRENT,i); // 记录低价 if(direction == 0) // 原处于上行段 if(l_level_down > 0 && iClose(_Symbol,PERIOD_CURRENT,i) < l_level_down) // 收低于下行位 gzz[i] = iLow(_Symbol,PERIOD_CURRENT,i); // 标记之字折线低点 l_zz_low = gzz[i]; // 更新最低记录
class="type">bool IsFractal(class="type">int _i, class="type">bool _type) { if(_type) { class="type">class="kw">double low = iLow(_Symbol,PERIOD_CURRENT,_i); for(class="type">int j=class="num">1; j<=FrBarsLeft; j++) if(iLow(_Symbol,PERIOD_CURRENT,_i+j) < low) class="kw">return false; for(class="type">int j=class="num">1; j<=FrBarsRight; j++) if(iLow(_Symbol,PERIOD_CURRENT,_i-j) < low) class="kw">return false; class="kw">return true; } else { class="type">class="kw">double high = iHigh(_Symbol,PERIOD_CURRENT,_i); for(class="type">int j=class="num">1; j<=FrBarsLeft; j++) if(iHigh(_Symbol,PERIOD_CURRENT,_i+j) > high) class="kw">return false; for(class="type">int j=class="num">1; j<=FrBarsRight; j++) if(iHigh(_Symbol,PERIOD_CURRENT,_i-j) > high) class="kw">return false; class="kw">return true; } class="kw">return false; } for(class="type">int i=start; i>FrBarsRight && !IsStopped(); i--) { if (IsFractal(i,false)) frUp[i] = iHigh(_Symbol,PERIOD_CURRENT,i); if (IsFractal(i,true)) frDown[i] = iLow(_Symbol,PERIOD_CURRENT,i); } class="type">void Logic(class="type">int i) { if(IsFractal(i,false)) { frUp[i] = iHigh(_Symbol,PERIOD_CURRENT,i); } if(IsFractal(i,true)) { frDown[i] = iLow(_Symbol,PERIOD_CURRENT,i); } if(direction == class="num">0) { if(l_level_down > class="num">0 && iClose(_Symbol,PERIOD_CURRENT,i) < l_level_down) { gzz[i] = iLow(_Symbol,PERIOD_CURRENT,i); l_zz_low = gzz[i];
之字转向里的多空切换逻辑
这段分支处理的是之字指标(ZigZag)在逐根 K 线回溯时的方向判定与极值更新。direction 变量记录当前趋势倾向:赋 1 表示处于向上腿,赋 0 表示转为向下腿,调用 ClearTheExtraValue 负责清掉反方向多余的拐点缓存。 当 direction 为 1 时,若收盘价跌破 l_level_down(前低参考线,需大于 0 才生效),就把当前 K 线低点写进 gzz[i] 并刷新 l_zz_low,同时把 direction 切到 0。另一路判断 frUp[i] 是否等于当前高点且高于已有 l_zz_high,满足则更新高点极值并清理额外值。 反向分支(direction 非 1)对称处理:收盘价突破 l_level_up 则转多,frDown[i] 等于低点且低于 l_zz_low 则刷新低值。最后两段独立 if 只做一件事——把 frUp/frDown 与当期高低价相等时的水平线存进 l_level_up / l_level_down,供下一根 K 线做穿越判断。 外汇与贵金属市场跳空频繁,这种基于收盘价穿越的拐点确认在重大数据行情中可能滞后 1~2 根,实盘前建议在 MT5 策略测试器用 EURUSD 5 分钟跑一遍看拐点重绘频率。
direction = class="num">1; } if(frUp[i] == iHigh(_Symbol,PERIOD_CURRENT,i) && l_zz_high < frUp[i]) { gzz[i] = iHigh(_Symbol,PERIOD_CURRENT,i); l_zz_high = gzz[i]; ClearTheExtraValue(i,direction); } } else { if(l_level_up > class="num">0 && iClose(_Symbol,PERIOD_CURRENT,i) > l_level_up) { gzz[i] = iHigh(_Symbol,PERIOD_CURRENT,i); l_zz_high = gzz[i]; direction = class="num">0; } if(frDown[i] == iLow(_Symbol,PERIOD_CURRENT,i) && l_zz_low > frDown[i]) { gzz[i] = iLow(_Symbol,PERIOD_CURRENT,i); l_zz_low = gzz[i]; ClearTheExtraValue(i,direction); } } if(frUp[i] == iHigh(_Symbol,PERIOD_CURRENT,i)) { l_level_up = frUp[i]; } if(frDown[i] == iLow(_Symbol,PERIOD_CURRENT,i)) { l_level_down = frDown[i]; } }
◍ 画得少,看得清
猫头鹰策略把比尔·威廉姆斯的碎片、艾略特波浪、斐波那契工具与埃尔德三重屏幕揉进一个框架,但核心改动不是重写经典,而是让指标随市况动态适配——标准烛条形态并非处处有效,滞后指标在现代盘面里常常掉价。 所有逻辑最终收进 Owl Smart Levels 这一个指标,它把多组组合信号的交互结果直接画成层级,省去交易者自己拼图形的步骤。附件里 Full_Fractals_Base.mq5(3.71 KB)与 Valable_ZigZag_Base.mq5(10.08 KB)是底层源码,可在 MT5 里打开看修订后的分形与之字折线怎么重算。 外汇与贵金属波动剧烈、杠杆风险高,这套系统只是把随机性压低、把规则固化,不承诺任何胜率。真要验证,下载 ZIP 挂进策略测试器,用去年任意季度 tick 跑一遍,看风险回报比是否落在你容忍带内。