欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

理想之字折线 - MetaTrader 5脚本

author emer | 932 人阅读 | 0 人评论 |

Ideal ZigZag - indicator for MetaTrader 5

这是一个简单但非常快的之字形。

没有暂停或错误的峰值。峰值检索已进行时间优化。

Ideal ZigZag - indicator for MetaTrader 5

ZigZag 是根据通道原理绘制的。通道宽度可以以点 (IdealZZ) 或百分比 (IdealZZP) 为单位定义

峰值检索:

输入 整数通道宽度=100;#property Indicator_chart_window

日期时间最后一次;整数ZZ手柄;//+------------------------------------------------------------------+
//|自定义指标初始化函数                         |
//+------------------------------------------------------------------+
空白 初始化时()
  {
   上次时间=0;
   ZZ 手柄 =定制_象征,时期(),《理想ZZ》,通道宽度);
  }//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
布尔值获取值(双倍的目录,整数酒吧,整数上一篇吧,双倍的&顶峰,整数&peakBar,日期时间高峰时间&高峰时间,常量 日期时间&T[])
  {
  如果(目录<0)
     {
      双倍的t[1];
      如果0>=复制缓冲区(ZZ手柄,2,酒吧,1,t))返回 错误的;
      整数我=数组B搜索(T,(日期时间)t[0]);

      如果(i==上一个栏)
        {
        如果0>=复制缓冲区(ZZ手柄,2,酒吧+1,1,t))返回 错误的;
         我=数组B搜索(T,(日期时间)t[0]);
        }

      双倍的v[1];
      如果0>=复制缓冲区(ZZ手柄,1,我,1,v))返回 错误的;

      如果(v[0]==空_VALUE)
        {
        如果0>=复制缓冲区(ZZ手柄,2,酒吧+1,1,t))返回 错误的;
         我=数组B搜索(T,(日期时间)t[0]);
        如果0>=复制缓冲区(ZZ手柄,1,我,1,v))返回 错误的;
        }

      峰值=v[0];
      峰值栏=i;
      高峰时间=(日期时间)t[0];
     }
  别的 如果(目录>0)
     {
      双倍的t[1];
      如果0>=复制缓冲区(ZZ手柄,3,酒吧,1,t))返回 错误的;
      整数我=数组B搜索(T,(日期时间)t[0]);

      如果(i==上一个栏)
        {
        如果0>=复制缓冲区(ZZ手柄,3,酒吧+1,1,t))返回 错误的;
         我=数组B搜索(T,(日期时间)t[0]);
        }

      双倍的v[1];
      如果0>=复制缓冲区(ZZ手柄,0,我,1,v))返回 错误的;

      如果(v[0]==空_VALUE)
        {
        如果0>=复制缓冲区(ZZ手柄,3,酒吧+1,1,t))返回 错误的;
         我=数组B搜索(T,(日期时间)t[0]);
        如果0>=复制缓冲区(ZZ手柄,0,我,1,v))返回 错误的;
        }

      峰值=v[0];
      峰值栏=i;
      高峰时间=(日期时间)t[0];
     }
  别的     {
      返回错误的);
     }

  返回真的);
  }//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
空白设置点(细绳姓名,双倍的价格,日期时间时间)
  {
  对象创建0,姓名,OBJ_箭头,0、时间、价格);
  对象集整数0,姓名,OBJPROP_ARROWCODE,108);
  对象集双精度0,姓名,OBJPROP_PRICE,价格);
  对象集整数0,姓名,OBJPROP_TIME,时间);
  }//+------------------------------------------------------------------+
//|自定义指标迭代函数                              |
//+------------------------------------------------------------------+
整数 计算时常量 整数费率_总计,
                常量 整数先前计算的,
                常量 日期时间&T[],
                常量 双倍的&打开[],
                常量 双倍的&高的[],
                常量 双倍的&低的[],
                常量 双倍的&关闭[],
                常量 长的&tick_volume[],
                常量 长的&体积[],
                常量 整数&传播[])
  {
  如果(上次时间==T[0])返回(费率_总计);
   最后时间=T[0];

  数组集为系列(T,真的);

  双倍的目录_[1];
  如果0>=复制缓冲区(ZZ手柄,4,1,1,dir_))返回费率_总计;
  双倍的目录=目录_[0];
  双倍的rdir=-dir;

  如果(目录==空_VALUE返回(费率_总计);

  双倍的v1,v2,v3,v4,v5;
  整数    i1,i2,i3,i4,i5;
  日期时间t1,t2,t3,t4,t5;

  如果(
      获取值(目录,1,0,v1,i1,t1,T) && 
      获取值(rdir,i1,0,v2,i2,t2,T) && 
      GetValue(dir,i2,i1,v3,i3,t3,T) && 
      GetValue(rdir,i3,i2,v4,i4,t4,T) && 
      获取值(目录,i4,i3,v5,i5,t5,T)
      )
     {
      设置点(“1”,v1,t1);
      设置点(“2”,v2,t2);
      设置点(“3”,v3,t3);
      设置点(“4”,v4,t4);
      设置点(“5”,v5,t5);
      打印(v1,“   ”,v2,“  ”,v3,“  ”,v4,” “,v5,” “,i1,“  ”,i2,“  ”,i3,” “,i4,” “,i5);
     }
  别的     {
      打印“似乎有错误......”);
     }

  返回(费率_总计);
  }//+------------------------------------------------------------------+

此示例是一个标记(每条柱一次)前五个峰值(包括当前形成的峰值)的指标。

注意力!如果启用零条模式,代码可能无法正常工作

该模式可以在 DrawZeroBar 变量代码中启用。默认情况下它是禁用的。不建议启用它,特别是当该指标在 Expert Advisor 中使用时。

享受使用它的乐趣。请告诉我任何暴露的缺点。


附件下载

📎 idealzz.mq5 (7.33 KB)

📎 idealzzp.mq5 (7.33 KB)

Source: MQL5 #925

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录