以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  公式改编为金字塔格式  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=9361)

--  作者:海绵
--  发布时间:2011/12/13 12:43:35
--  公式改编为金字塔格式

以下是MT4公式,请帮忙改编为金字塔格式(超过16240字符,请看一二楼)

 

 

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 White
#property indicator_color2 Red
#property indicator_color3 White

double Bi[],Highxiu[],Lowxiu[];

 int i=0,j=0;//j为上一拐点以后的包含合并次数
 int mark=0,xiangbao=0;//mark 为分笔方向变量,xiangbao 为K线包含关系方向变量
 int Suo,Bisuo;//Suo为上一拐点的索引,Bisuo为上一线段端点的索引
 int Shift,last;
 double HighMid,LowMid;//HighMid为上溯第一个高点暂存,LowMid为上溯第一个低点暂存

int init()
  {
   SetIndexBuffer(0,Bi);
   SetIndexBuffer(1,Highxiu);
   SetIndexBuffer(2,Lowxiu);

  
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexStyle(1,DRAW_NONE);
   SetIndexStyle(2,DRAW_NONE);

  
   SetIndexEmptyValue(0,0.0);
   IndicatorDigits(Digits);
   SetIndexLabel(0,"笔");
   return(0);
  }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
 
  int counted_bars=IndicatorCounted();
  int Limit=Bars-counted_bars; 
    if(counted_bars==0 )     
     {
      ArrayInitialize(Bi,0.0);
  
     }

  for(Shift=Limit;Shift>=0;Shift--)
     {
       Highxiu[Shift]=High[Shift];
       Lowxiu[Shift]=Low[Shift];
       switch(xiangbao)
        {
       case 0:
          if(Highxiu[Shift]>Highxiu[Shift+1] && Lowxiu[Shift]>Lowxiu[Shift+1])
           {
            xiangbao=1;
           }
          if(Highxiu[Shift]<Highxiu[Shift+1] && Lowxiu[Shift]<Lowxiu[Shift+1])
           {
            xiangbao=-1;
           }
          break;
      case 1:

          if(Highxiu[Shift]<Highxiu[Shift+1] && Lowxiu[Shift]>=Lowxiu[Shift+1])
            {
             Highxiu[Shift]=Highxiu[Shift+1];
            }
          if(Highxiu[Shift]<Highxiu[Shift+1] && Lowxiu[Shift]<Lowxiu[Shift+1])
            {
              xiangbao=-1;
            }
          break;
      case -1:

          if(Highxiu[Shift]<=Highxiu[Shift+1] && Lowxiu[Shift]>Lowxiu[Shift+1])
            {
             Lowxiu[Shift]=Lowxiu[Shift+1];
            }
          if(Highxiu[Shift]>Highxiu[Shift+1] && Lowxiu[Shift]>Lowxiu[Shift+1])
            {
              xiangbao=1;
            }
          break;
       default: return;
       }
     }

  for(Shift=Limit;Shift>=0;Shift--)
     {
      switch(mark)
        {
       case 0:
              j=0;
          int x=iHighest(NULL,0,MODE_HIGH,counted_bars,Shift);
          int y=iLowest(NULL,0,MODE_LOW,counted_bars,Shift);
          if(x-y>=4)  //如果高点在前且比低点超前4根K线
           {

            for(i=x-1;i>=y;i--)
              {
               if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
              }
            if(x-y-j>=4)  //如果高点在前且合并包含K线后比低点超前4根K线
              {
               Bi[x]=High[x];        //登记第一个顶的价格并传递给指标
               HighMid=High[x];       //记录第一个顶的价格
               Suo=x;                 //记录第一个顶的索引
               mark=-1;               //向上的笔结束,向下的一笔确认出现,把分笔的目标改为寻找底 

              }
           }
          if(y-x>4)   //如果低点在前且比高点超前4根K线
           {

            for(i=y-1;i>=x;i--)
              {
               if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
              }
            if(y-x-j>=4)               //如果低点在前且合并K线后比高点超前4根K线
             {
               Bi[y]=Low[y];          //登记第一个底的价格并传递给指标
               LowMid=Low[y];         //记录第一个底的价格
               Suo=y;                 //记录第一个底的索引
               mark=1;                //向下的笔结束,向上的笔确认出现,把分笔的目标改为寻找顶
             }
            }
        break;
       case 1:
          j=0;
          x=iHighest(NULL,0,MODE_HIGH,Suo-Shift,Shift);  //计算上一个底以来最高价所在K线的索引
          y=iLowest(NULL,0,MODE_LOW,x-Shift,Shift);      //计算上一个高点以来最低价所在K线的索引

           if(x-y>=4)
            {
             for(i=x-1;i>=y;i--)
              {
               if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
              }
             if(x-y-j>=4 && High[y]<Low[x])
              {
               Bi[x]=High[x];       //登记新一个顶的价格并传递给指标
               HighMid=High[x];     //记录新一个顶的价格
               Suo=x;               //记录新一个顶的索引
               mark=-1;             //向上的笔结束,向下的一笔确认出现,把分笔的目标改为寻找底
               last=y;
              }
            }
          

[此贴子已经被作者于2011-12-13 12:46:10编辑过]

--  作者:海绵
--  发布时间:2011/12/13 12:43:48
--  
 if(x-y>=3 && Low[y]<LowMid)  //至少第4根K线后过底
            {
             Bi[x]=High[x];       //登记新一个顶的价格并传递给指标
             HighMid=High[x];     //记录新一个顶的价格
             Suo=x;               //记录新一个顶的索引
             mark=-1;             //向上的笔结束,向下的一笔确认出现,把分笔的目标改为寻找底
             last=y;
            }
           if(Shift==0 && mark==1)
             {
              Bi[x]=High[x];
              if(last!=x)
                {
                  Bi[last]=0;
                  last=x;
                }
             }
        break;
       case -1:
          j=0;
          y=iLowest(NULL,0,MODE_LOW,Suo-Shift,Shift);      //计算上一个顶以来最低价所在K线的索引
          x=iHighest(NULL,0,MODE_HIGH,y-Shift,Shift);  //计算上一个低点以来最高价所在K线的索引

          if(y-x>=4)
            {
             for(i=y-1;i>=x;i--)
              {
               if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
              }
             if(y-x-j>=4 && High[y]<Low[x])
              {
               Bi[y]=Low[y];      //登记新一个底的价格并传递给指标
               LowMid=Low[y];     //记录新一个底的价格
               Suo=y;               //记录新一个底的索引
               mark=1;             //向下的笔结束,向上的一笔确认出现,把分笔的目标改为寻找顶
               last=x;
              }
            }
          if(y-x>=3 && High[x]>HighMid)  //至少第4根K线后过顶
           {
             Bi[y]=Low[y];      //登记新一个底的价格并传递给指标
             LowMid=Low[y];     //记录新一个底的价格
             Suo=y;               //记录新一个底的索引
             mark=1;             //向下的笔结束,向上的一笔确认出现,把分笔的目标改为寻找顶
             last=x;
           }
           if(Shift==0 && mark==-1)
             {
              Bi[y]=Low[y];
              if(last!=y)
                {
                  Bi[last]=0;
                  last=y;
                }
             }
        break;   
      default: return;
        }
     }

//----
   return(0);
  }
//+------------------------------------------------------------------+

  

 

 

{以上1、2楼为一个完整的公式源码}

[此贴子已经被作者于2011-12-13 12:45:36编辑过]

--  作者:董小球
--  发布时间:2011/12/13 13:03:47
--  

神啊 楼主你这么长的代码 恐怕很难让人免费给你写出来啊

如果你会一些金字塔代码,来询问某个功能模块怎么实现  这样比较好

 


--  作者:海绵
--  发布时间:2011/12/13 14:18:09
--  
其实我电脑盲,会一点点我就会自力更生了
--  作者:阿火
--  发布时间:2011/12/13 14:31:38
--  

一点点都不会。那说出你的代码思路总可以吧

你的代码看不懂,亲