路路发智能交易研发中心

 找回密码
 立即注册
查看: 6342|回复: 0

MT4智能交易编程示例 ZIGZAG指标

    [复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

积分
6521
帖子
2771
主题
2761
QQ
发表于 2014-4-4 14:41:46 | 显示全部楼层 |阅读模式
MT4智能交易编程示例 ZIGZAG指标
  1. #property copyright   "路路发智能交易研发中心"
  2. #property link        "http://www.ea668.com"
  3. #property strict

  4. #property indicator_chart_window
  5. #property indicator_buffers 1
  6. #property indicator_color1  Red
  7. //---- indicator parameters
  8. input int InpDepth=12;     // Depth
  9. input int InpDeviation=5;  // Deviation
  10. input int InpBackstep=3;   // Backstep
  11. //---- indicator buffers
  12. double ExtZigzagBuffer[];
  13. double ExtHighBuffer[];
  14. double ExtLowBuffer[];
  15. //--- globals
  16. int    ExtLevel=3; // recounting's depth of extremums
  17. //+------------------------------------------------------------------+
  18. //| Custom indicator initialization function                         |
  19. //+------------------------------------------------------------------+
  20. int OnInit()
  21.   {
  22.    if(InpBackstep>=InpDepth)
  23.      {
  24.       Print("Backstep cannot be greater or equal to Depth");
  25.       return(INIT_FAILED);
  26.      }
  27. //--- 2 additional buffers
  28.    IndicatorBuffers(3);
  29. //---- drawing settings
  30.    SetIndexStyle(0,DRAW_SECTION);
  31. //---- indicator buffers
  32.    SetIndexBuffer(0,ExtZigzagBuffer);
  33.    SetIndexBuffer(1,ExtHighBuffer);
  34.    SetIndexBuffer(2,ExtLowBuffer);
  35.    SetIndexEmptyValue(0,0.0);
  36. //---- indicator short name
  37.    IndicatorShortName("ZigZag("+string(InpDepth)+","+string(InpDeviation)+","+string(InpBackstep)+")");
  38. //---- initialization done
  39.    return(INIT_SUCCEEDED);
  40.   }
  41. //+------------------------------------------------------------------+
  42. //|                                                                  |
  43. //+------------------------------------------------------------------+
  44. int OnCalculate(const int rates_total,
  45.                 const int prev_calculated,
  46.                 const datetime &time[],
  47.                 const double &open[],
  48.                 const double &high[],
  49.                 const double &low[],
  50.                 const double &close[],
  51.                 const long& tick_volume[],
  52.                 const long& volume[],
  53.                 const int& spread[])
  54.   {
  55.    int    i,limit,counterZ,whatlookfor=0;
  56.    int    back,pos,lasthighpos=0,lastlowpos=0;
  57.    double extremum;
  58.    double curlow=0.0,curhigh=0.0,lasthigh=0.0,lastlow=0.0;
  59. //--- check for history and inputs
  60.    if(rates_total<InpDepth || InpBackstep>=InpDepth)
  61.       return(0);
  62. //--- first calculations
  63.    if(prev_calculated==0)
  64.       limit=InitializeAll();
  65.    else
  66.      {
  67.       //--- find first extremum in the depth ExtLevel or 100 last bars
  68.       i=counterZ=0;
  69.       while(counterZ<ExtLevel && i<100)
  70.         {
  71.          if(ExtZigzagBuffer[i]!=0.0)
  72.             counterZ++;
  73.          i++;
  74.         }
  75.       //--- no extremum found - recounting all from begin
  76.       if(counterZ==0)
  77.          limit=InitializeAll();
  78.       else
  79.         {
  80.          //--- set start position to found extremum position
  81.          limit=i-1;
  82.          //--- what kind of extremum?
  83.          if(ExtLowBuffer[i]!=0.0)
  84.            {
  85.             //--- low extremum
  86.             curlow=ExtLowBuffer[i];
  87.             //--- will look for the next high extremum
  88.             whatlookfor=1;
  89.            }
  90.          else
  91.            {
  92.             //--- high extremum
  93.             curhigh=ExtHighBuffer[i];
  94.             //--- will look for the next low extremum
  95.             whatlookfor=-1;
  96.            }
  97.          //--- clear the rest data
  98.          for(i=limit-1; i>=0; i--)  
  99.            {
  100.             ExtZigzagBuffer[i]=0.0;  
  101.             ExtLowBuffer[i]=0.0;
  102.             ExtHighBuffer[i]=0.0;
  103.            }
  104.         }
  105.      }
  106. //--- main loop      
  107.    for(i=limit; i>=0; i--)
  108.      {
  109.       //--- find lowest low in depth of bars
  110.       extremum=low[iLowest(NULL,0,MODE_LOW,InpDepth,i)];
  111.       //--- this lowest has been found previously
  112.       if(extremum==lastlow)
  113.          extremum=0.0;
  114.       else
  115.         {
  116.          //--- new last low
  117.          lastlow=extremum;
  118.          //--- discard extremum if current low is too high
  119.          if(low[i]-extremum>InpDeviation*Point)
  120.             extremum=0.0;
  121.          else
  122.            {
  123.             //--- clear previous extremums in backstep bars
  124.             for(back=1; back<=InpBackstep; back++)
  125.               {
  126.                pos=i+back;
  127.                if(ExtLowBuffer[pos]!=0 && ExtLowBuffer[pos]>extremum)
  128.                   ExtLowBuffer[pos]=0.0;
  129.               }
  130.            }
  131.         }
  132.       //--- found extremum is current low
  133.       if(low[i]==extremum)
  134.          ExtLowBuffer[i]=extremum;
  135.       else
  136.          ExtLowBuffer[i]=0.0;
  137.       //--- find highest high in depth of bars
  138.       extremum=high[iHighest(NULL,0,MODE_HIGH,InpDepth,i)];
  139.       //--- this highest has been found previously
  140.       if(extremum==lasthigh)
  141.          extremum=0.0;
  142.       else
  143.         {
  144.          //--- new last high
  145.          lasthigh=extremum;
  146.          //--- discard extremum if current high is too low
  147.          if(extremum-high[i]>InpDeviation*Point)
  148.             extremum=0.0;
  149.          else
  150.            {
  151.             //--- clear previous extremums in backstep bars
  152.             for(back=1; back<=InpBackstep; back++)
  153.               {
  154.                pos=i+back;
  155.                if(ExtHighBuffer[pos]!=0 && ExtHighBuffer[pos]<extremum)
  156.                   ExtHighBuffer[pos]=0.0;
  157.               }
  158.            }
  159.         }
  160.       //--- found extremum is current high
  161.       if(high[i]==extremum)
  162.          ExtHighBuffer[i]=extremum;
  163.       else
  164.          ExtHighBuffer[i]=0.0;
  165.      }
  166. //--- final cutting
  167.    if(whatlookfor==0)
  168.      {
  169.       lastlow=0.0;
  170.       lasthigh=0.0;  
  171.      }
  172.    else
  173.      {
  174.       lastlow=curlow;
  175.       lasthigh=curhigh;
  176.      }
  177.    for(i=limit; i>=0; i--)
  178.      {
  179.       switch(whatlookfor)
  180.         {
  181.          case 0: // look for peak or lawn
  182.             if(lastlow==0.0 && lasthigh==0.0)
  183.               {
  184.                if(ExtHighBuffer[i]!=0.0)
  185.                  {
  186.                   lasthigh=High[i];
  187.                   lasthighpos=i;
  188.                   whatlookfor=-1;
  189.                   ExtZigzagBuffer[i]=lasthigh;
  190.                  }
  191.                if(ExtLowBuffer[i]!=0.0)
  192.                  {
  193.                   lastlow=Low[i];
  194.                   lastlowpos=i;
  195.                   whatlookfor=1;
  196.                   ExtZigzagBuffer[i]=lastlow;
  197.                  }
  198.               }
  199.              break;  
  200.          case 1: // look for peak
  201.             if(ExtLowBuffer[i]!=0.0 && ExtLowBuffer[i]<lastlow && ExtHighBuffer[i]==0.0)
  202.               {
  203.                ExtZigzagBuffer[lastlowpos]=0.0;
  204.                lastlowpos=i;
  205.                lastlow=ExtLowBuffer[i];
  206.                ExtZigzagBuffer[i]=lastlow;
  207.               }
  208.             if(ExtHighBuffer[i]!=0.0 && ExtLowBuffer[i]==0.0)
  209.               {
  210.                lasthigh=ExtHighBuffer[i];
  211.                lasthighpos=i;
  212.                ExtZigzagBuffer[i]=lasthigh;
  213.                whatlookfor=-1;
  214.               }   
  215.             break;               
  216.          case -1: // look for lawn
  217.             if(ExtHighBuffer[i]!=0.0 && ExtHighBuffer[i]>lasthigh && ExtLowBuffer[i]==0.0)
  218.               {
  219.                ExtZigzagBuffer[lasthighpos]=0.0;
  220.                lasthighpos=i;
  221.                lasthigh=ExtHighBuffer[i];
  222.                ExtZigzagBuffer[i]=lasthigh;
  223.               }
  224.             if(ExtLowBuffer[i]!=0.0 && ExtHighBuffer[i]==0.0)
  225.               {
  226.                lastlow=ExtLowBuffer[i];
  227.                lastlowpos=i;
  228.                ExtZigzagBuffer[i]=lastlow;
  229.                whatlookfor=1;
  230.               }   
  231.             break;               
  232.         }
  233.      }
  234. //--- done
  235.    return(rates_total);
  236.   }
  237. //+------------------------------------------------------------------+
  238. //|                                                                  |
  239. //+------------------------------------------------------------------+
  240. int InitializeAll()
  241.   {
  242.    ArrayInitialize(ExtZigzagBuffer,0.0);
  243.    ArrayInitialize(ExtHighBuffer,0.0);
  244.    ArrayInitialize(ExtLowBuffer,0.0);
  245. //--- first counting position
  246.    return(Bars-InpDepth);
  247.   }
  248. //+------------------------------------------------------------------+
复制代码



外汇智能交易,成就财富梦想!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


MT4编程培训|EA定制开发|QQ在线咨询|路路发智能交易研发中心

GMT+8, 2024-12-22 16:28 , Processed in 0.165656 second(s), 26 queries .

© 2009-2022 520EA.com EA668.com

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