创建综合性猫头鹰交易策略·综合运用
📘

创建综合性猫头鹰交易策略·综合运用

第 3/3 篇

「分形与之字折线的源码骨架」

早期基于走势原则的系统今天仍相对可靠,因为它们在个人电脑出现前就已成型,手工可算。全分形指标只依赖一个函数:传入柱形索引和分形方向(向上或向下),命中的话就把该烛最高/最低价写进缓冲区。 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]; // 更新最低记录

MQL5 / C++
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 分钟跑一遍看拐点重绘频率。

MQL5 / C++
         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 跑一遍,看风险回报比是否落在你容忍带内。

常见问题

先用iFractals取分形极点,再用iCustom加载之字转向指标,把两者极值对齐到同一根K线,骨架就出来了,具体可对照原文逐行拆解。
看之字折线的最后一段方向:上折被新低打断就切空,下折被新高打断就切多,用LastDir变量存状态即可。
小布可直接对指定品种跑分形+之字组合诊断,标出近期假突破和真实拐点,你省去手动回看历史。
只留分形极点和之字关键折点,去掉杂波后多空结构一眼可辨,避免过度交易。
贵金属波动大杠杆高,信号可能失效,务必先用模拟盘验证并控仓,属高风险品类。