交易危机

 找回密码
 快捷注册(禁q号)

QQ登录

只需一步,快速开始

搜索
广告位
查看: 3511|回复: 17
打印 上一主题 下一主题

[Zigzag] 谁能帮我把这个ZigZag指标再加上2句代码?

[复制链接]

1106

主题

2万

积分

17

精华

操盘专家

金钱
24316 美元
权重
251
跳转到指定楼层
楼主
发表于 2017-12-17 13:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


加2句代码,分别把高点之间依次画线,低点之间依次画线。

下图是我手工画的





//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2006-2014, MetaQuotes Software Corp."
#property link      "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Red
//---- indicator parameters
input int InpDepth=12;     // Depth
input int InpDeviation=5;  // Deviation
input int InpBackstep=3;   // Backstep
//---- indicator buffers
double ExtZigzagBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];
//--- globals
int    ExtLevel=3; // recounting's depth of extremums
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(InpBackstep>=InpDepth)
     {
      Print("Backstep cannot be greater or equal to Depth");
      return(INIT_FAILED);
     }
//--- 2 additional buffers
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers
   SetIndexBuffer(0,ExtZigzagBuffer);
   SetIndexBuffer(1,ExtHighBuffer);
   SetIndexBuffer(2,ExtLowBuffer);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+string(InpDepth)+","+string(InpDeviation)+","+string(InpBackstep)+")");
//---- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int    i,limit,counterZ,whatlookfor=0;
   int    back,pos,lasthighpos=0,lastlowpos=0;
   double extremum;
   double curlow=0.0,curhigh=0.0,lasthigh=0.0,lastlow=0.0;
//--- check for history and inputs
   if(rates_total<InpDepth || InpBackstep>=InpDepth)
      return(0);
//--- first calculations
   if(prev_calculated==0)
      limit=InitializeAll();
   else
     {
      //--- find first extremum in the depth ExtLevel or 100 last bars
      i=counterZ=0;
      while(counterZ<ExtLevel && i<100)
        {
         if(ExtZigzagBuffer!=0.0)
            counterZ++;
         i++;
        }
      //--- no extremum found - recounting all from begin
      if(counterZ==0)
         limit=InitializeAll();
      else
        {
         //--- set start position to found extremum position
         limit=i-1;
         //--- what kind of extremum?
         if(ExtLowBuffer!=0.0)
           {
            //--- low extremum
            curlow=ExtLowBuffer;
            //--- will look for the next high extremum
            whatlookfor=1;
           }
         else
           {
            //--- high extremum
            curhigh=ExtHighBuffer;
            //--- will look for the next low extremum
            whatlookfor=-1;
           }
         //--- clear the rest data
         for(i=limit-1; i>=0; i--)  
           {
            ExtZigzagBuffer=0.0;  
            ExtLowBuffer=0.0;
            ExtHighBuffer=0.0;
           }
        }
     }
//--- main loop      
   for(i=limit; i>=0; i--)
     {
      //--- find lowest low in depth of bars
      extremum=low[iLowest(NULL,0,MODE_LOW,InpDepth,i)];
      //--- this lowest has been found previously
      if(extremum==lastlow)
         extremum=0.0;
      else
        {
         //--- new last low
         lastlow=extremum;
         //--- discard extremum if current low is too high
         if(low-extremum>InpDeviation*Point)
            extremum=0.0;
         else
           {
            //--- clear previous extremums in backstep bars
            for(back=1; back<=InpBackstep; back++)
              {
               pos=i+back;
               if(ExtLowBuffer[pos]!=0 && ExtLowBuffer[pos]>extremum)
                  ExtLowBuffer[pos]=0.0;
              }
           }
        }
      //--- found extremum is current low
      if(low==extremum)
         ExtLowBuffer=extremum;
      else
         ExtLowBuffer=0.0;
      //--- find highest high in depth of bars
      extremum=high[iHighest(NULL,0,MODE_HIGH,InpDepth,i)];
      //--- this highest has been found previously
      if(extremum==lasthigh)
         extremum=0.0;
      else
        {
         //--- new last high
         lasthigh=extremum;
         //--- discard extremum if current high is too low
         if(extremum-high>InpDeviation*Point)
            extremum=0.0;
         else
           {
            //--- clear previous extremums in backstep bars
            for(back=1; back<=InpBackstep; back++)
              {
               pos=i+back;
               if(ExtHighBuffer[pos]!=0 && ExtHighBuffer[pos]<extremum)
                  ExtHighBuffer[pos]=0.0;
              }
           }
        }
      //--- found extremum is current high
      if(high==extremum)
         ExtHighBuffer=extremum;
      else
         ExtHighBuffer=0.0;
     }
//--- final cutting
   if(whatlookfor==0)
     {
      lastlow=0.0;
      lasthigh=0.0;  
     }
   else
     {
      lastlow=curlow;
      lasthigh=curhigh;
     }
   for(i=limit; i>=0; i--)
     {
      switch(whatlookfor)
        {
         case 0: // look for peak or lawn
            if(lastlow==0.0 && lasthigh==0.0)
              {
               if(ExtHighBuffer!=0.0)
                 {
                  lasthigh=High;
                  lasthighpos=i;
                  whatlookfor=-1;
                  ExtZigzagBuffer=lasthigh;
                 }
               if(ExtLowBuffer!=0.0)
                 {
                  lastlow=Low;
                  lastlowpos=i;
                  whatlookfor=1;
                  ExtZigzagBuffer=lastlow;
                 }
              }
             break;  
         case 1: // look for peak
            if(ExtLowBuffer!=0.0 && ExtLowBuffer<lastlow && ExtHighBuffer==0.0)
              {
               ExtZigzagBuffer[lastlowpos]=0.0;
               lastlowpos=i;
               lastlow=ExtLowBuffer;
               ExtZigzagBuffer=lastlow;
              }
            if(ExtHighBuffer!=0.0 && ExtLowBuffer==0.0)
              {
               lasthigh=ExtHighBuffer;
               lasthighpos=i;
               ExtZigzagBuffer=lasthigh;
               whatlookfor=-1;
              }   
            break;               
         case -1: // look for lawn
            if(ExtHighBuffer!=0.0 && ExtHighBuffer>lasthigh && ExtLowBuffer==0.0)
              {
               ExtZigzagBuffer[lasthighpos]=0.0;
               lasthighpos=i;
               lasthigh=ExtHighBuffer;
               ExtZigzagBuffer=lasthigh;
              }
            if(ExtLowBuffer!=0.0 && ExtHighBuffer==0.0)
              {
               lastlow=ExtLowBuffer;
               lastlowpos=i;
               ExtZigzagBuffer=lastlow;
               whatlookfor=1;
              }   
            break;               
        }
     }
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int InitializeAll()
  {
   ArrayInitialize(ExtZigzagBuffer,0.0);
   ArrayInitialize(ExtHighBuffer,0.0);
   ArrayInitialize(ExtLowBuffer,0.0);
//--- first counting position
   return(Bars-InpDepth);
  }
//+------------------------------------------------------------------+
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播 分享分享 分享淘帖 支持支持 保留保留
太阳每天升起,每天都是新的一天。

52

主题

1万

积分

4

精华

操盘专家

金钱
15549 美元
权重
22
推荐
发表于 2017-12-17 15:39 | 只看该作者
电脑上没装压缩程序。下载的文件,务必将Rar扩展名修改为   ex4。即可使用。
Zigzag_ws_Chanel_R.Rar (27.85 KB, 下载次数: 27)

评分

参与人数 1金钱 +80 收起 理由
admin + 80 感谢楼主分享

查看全部评分

新手,膇醺 $  的娇巭
回复 支持 1 反对 0

使用道具 举报

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
板凳
发表于 2017-12-17 13:40 | 只看该作者
加两条线,2句代码搞不定。这事看起来惊天动地

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
地板
发表于 2017-12-17 13:43 | 只看该作者
小明倒是忽然想起来曲线办法。
用2个zig。你绞尽脑汁改一改原来的画法方法,把原来的变成踩着顶点跑。
然后加载2个zig,妥了。

52

主题

2371

积分

0

精华

中级操盘手

金钱
2371 美元
权重
0
5
发表于 2017-12-17 14:15 | 只看该作者
像布林带

52

主题

1万

积分

4

精华

操盘专家

金钱
15549 美元
权重
22
6
发表于 2017-12-17 15:41 | 只看该作者
效果如下:

评分

参与人数 1金钱 +66 收起 理由
573 + 66 感谢分享

查看全部评分

新手,膇醺 $  的娇巭

1106

主题

2万

积分

17

精华

操盘专家

金钱
24316 美元
权重
251
7
 楼主| 发表于 2017-12-17 16:46 | 只看该作者

感谢分享.
很方便,再不用手工画了。
太阳每天升起,每天都是新的一天。

1106

主题

2万

积分

17

精华

操盘专家

金钱
24316 美元
权重
251
8
 楼主| 发表于 2017-12-17 16:55 | 只看该作者
中间一根调成黑色隐藏起来,完全适合我用。

太阳每天升起,每天都是新的一天。

14

主题

367

积分

0

精华

见习操盘手

金钱
367 美元
权重
0
9
发表于 2017-12-17 20:26 | 只看该作者
573 发表于 2017-12-17 16:55
中间一根调成黑色隐藏起来,完全适合我用。

嗨,在吗?麻烦你能告诉我你这个图,就是高点与高点之间用红色线连接起来,低点与低点位用红色线连起来,在实际操作中有什么用嘛?是通道还是?谢谢你。

30

主题

1万

积分

0

精华

操盘专家

金钱
13838 美元
权重
1
10
发表于 2017-12-17 20:58 | 只看该作者
573 发表于 2017-12-17 16:55
中间一根调成黑色隐藏起来,完全适合我用。

黑色有时会影响K线图,可以直接点最上面的NONE

1106

主题

2万

积分

17

精华

操盘专家

金钱
24316 美元
权重
251
11
 楼主| 发表于 2017-12-17 21:11 | 只看该作者
liuchang1989 发表于 2017-12-17 20:26
嗨,在吗?麻烦你能告诉我你这个图,就是高点与高点之间用红色线连接起来,低点与低点位用红色线连起来, ...

暂时说不清楚有什么用,好像也没什么用,
太阳每天升起,每天都是新的一天。

1106

主题

2万

积分

17

精华

操盘专家

金钱
24316 美元
权重
251
12
 楼主| 发表于 2017-12-17 21:15 | 只看该作者
过去了 发表于 2017-12-17 20:58
黑色有时会影响K线图,可以直接点最上面的NONE

一直不知道最上面有个NONE
太阳每天升起,每天都是新的一天。

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
13
发表于 2017-12-17 21:21 | 只看该作者
573 发表于 2017-12-17 21:15
一直不知道最上面有个NONE

我去找了好一大会,没看到NONE

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
14
发表于 2017-12-17 21:23 | 只看该作者
frlin2003 发表于 2017-12-17 21:21
我去找了好一大会,没看到NONE

1106

主题

2万

积分

17

精华

操盘专家

金钱
24316 美元
权重
251
15
 楼主| 发表于 2017-12-17 21:28 | 只看该作者
frlin2003 发表于 2017-12-17 21:21
我去找了好一大会,没看到NONE

颜射选择中,各种颜射的最上面就是NONE
太阳每天升起,每天都是新的一天。

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
16
发表于 2017-12-17 21:30 | 只看该作者
573 发表于 2017-12-17 21:28
颜射选择中,各种颜射的最上面就是NONE

秒领悟

30

主题

1万

积分

0

精华

操盘专家

金钱
13838 美元
权重
1
17
发表于 2017-12-17 21:37 | 只看该作者
有图有真相

30

主题

1万

积分

0

精华

操盘专家

金钱
13838 美元
权重
1
18
发表于 2017-12-17 21:38 | 只看该作者

老大,这有源码吗???这样可以从码上修改……
您需要登录后才可以回帖 登录 | 快捷注册(禁q号)

本版积分规则

QQ|黄金吧|黄金论坛|手机版|指标下载|非农|目录|交易危机

版权所有: ©2014-2021 fx3q.com Powered by Discuz! X3
皖ICP备: 2024050410号-2

风险提示:杠杆风险高,交易要谨慎 声明:坛友发言和回复均为个人观点,不代表论坛立场。
若有侵权请联系fx3q@qq.com删除

快速回复 返回顶部 返回列表