路路发智能交易研发中心

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

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

[复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

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

  5. //--- indicator settings
  6. #property indicator_chart_window
  7. #property indicator_buffers 1
  8. #property indicator_color1  Lime
  9. //--- input parameters
  10. input double InpSARStep=0.02;    // Step
  11. input double InpSARMaximum=0.2;  // Maximum
  12. //---- buffers
  13. double       ExtSARBuffer[];
  14. //--- global variables
  15. double       ExtSarStep;
  16. double       ExtSarMaximum;
  17. int          ExtLastReverse;
  18. bool         ExtDirectionLong;
  19. double       ExtLastStep,ExtLastEP,ExtLastSAR;
  20. double       ExtLastHigh,ExtLastLow;
  21. //+------------------------------------------------------------------+
  22. //| Custom indicator initialization function                         |
  23. //+------------------------------------------------------------------+
  24. void OnInit()
  25.   {
  26. //--- checking input data
  27.    if(InpSARStep<0.0)
  28.      {
  29.       ExtSarStep=0.02;
  30.       Print("Input parametr InpSARStep has incorrect value. Indicator will use value ",
  31.             ExtSarStep," for calculations.");
  32.      }
  33.    else
  34.       ExtSarStep=InpSARStep;
  35.    if(InpSARMaximum<0.0)
  36.      {
  37.       ExtSarMaximum=0.2;
  38.       Print("Input parametr InpSARMaximum has incorrect value. Indicator will use value ",
  39.             ExtSarMaximum," for calculations.");
  40.      }
  41.    else
  42.       ExtSarMaximum=InpSARMaximum;
  43. //--- drawing settings
  44.    IndicatorDigits(Digits);
  45.    SetIndexStyle(0,DRAW_ARROW);
  46.    SetIndexArrow(0,159);
  47. //---- indicator buffers
  48.    SetIndexBuffer(0,ExtSARBuffer);
  49. //--- set short name
  50.    IndicatorShortName("SAR("+DoubleToString(ExtSarStep,2)+","+DoubleToString(ExtSarMaximum,2)+")");
  51. //--- set global variables
  52.    ExtLastReverse=0;
  53.    ExtDirectionLong=false;
  54.    ExtLastStep=ExtLastEP=ExtLastSAR=0.0;
  55.    ExtLastHigh=ExtLastLow=0.0;
  56. //----
  57.   }
  58. //+------------------------------------------------------------------+
  59. //| Parabolic SAR                                                    |
  60. //+------------------------------------------------------------------+
  61. int OnCalculate(const int rates_total,
  62.                 const int prev_calculated,
  63.                 const datetime &time[],
  64.                 const double &open[],
  65.                 const double &high[],
  66.                 const double &low[],
  67.                 const double &close[],
  68.                 const long& tick_volume[],
  69.                 const long& volume[],
  70.                 const int& spread[])
  71.   {
  72.    bool   dir_long;
  73.    double last_high,last_low,ep,sar,step;
  74.    int    i;
  75. //--- check for minimum rates count
  76.    if(rates_total<3)
  77.       return(0);
  78. //--- counting from 0 to rates_total
  79.    ArraySetAsSeries(ExtSARBuffer,false);
  80.    ArraySetAsSeries(high,false);
  81.    ArraySetAsSeries(low,false);
  82. //--- detect current position for calculations
  83.    i=prev_calculated-1;
  84. //--- calculations from start?
  85.    if(i<1)
  86.      {
  87.       ExtLastReverse=0;
  88.       dir_long=true;
  89.       step=ExtSarStep;
  90.       last_high=-10000000.0;
  91.       last_low=10000000.0;
  92.       sar=0;
  93.       i=1;
  94.       while(i<rates_total-1)
  95.         {
  96.          ExtLastReverse=i;
  97.          if(last_low>low[i])
  98.             last_low=low[i];
  99.          if(last_high<high[i])
  100.             last_high=high[i];
  101.          if(high[i]>high[i-1] && low[i]>low[i-1])
  102.             break;
  103.          if(high[i]<high[i-1] && low[i]<low[i-1])
  104.            {
  105.             dir_long=false;
  106.             break;
  107.            }
  108.          i++;
  109.         }
  110.       //--- initialize with zero
  111.       ArrayInitialize(ExtSARBuffer,0.0);
  112.       //--- go check
  113.       if(dir_long)
  114.         {
  115.          ExtSARBuffer[i]=low[i-1];
  116.          ep=high[i];
  117.         }
  118.       else
  119.         {
  120.          ExtSARBuffer[i]=high[i-1];
  121.          ep=low[i];
  122.         }
  123.       i++;
  124.      }
  125.    else
  126.      {
  127.       //--- calculations to be continued. restore last values
  128.       i=ExtLastReverse;
  129.       step=ExtLastStep;
  130.       dir_long=ExtDirectionLong;
  131.       last_high=ExtLastHigh;
  132.       last_low=ExtLastLow;
  133.       ep=ExtLastEP;
  134.       sar=ExtLastSAR;
  135.      }
  136. //---main cycle
  137.    while(i<rates_total)
  138.      {
  139.       //--- check for reverse
  140.       if(dir_long && low[i]<ExtSARBuffer[i-1])
  141.         {
  142.          SaveLastReverse(i,true,step,low[i],last_high,ep,sar);
  143.          step=ExtSarStep;
  144.          dir_long=false;
  145.          ep=low[i];
  146.          last_low=low[i];
  147.          ExtSARBuffer[i++]=last_high;
  148.          continue;
  149.         }
  150.       if(!dir_long && high[i]>ExtSARBuffer[i-1])
  151.         {
  152.          SaveLastReverse(i,false,step,last_low,high[i],ep,sar);
  153.          step=ExtSarStep;
  154.          dir_long=true;
  155.          ep=high[i];
  156.          last_high=high[i];
  157.          ExtSARBuffer[i++]=last_low;
  158.          continue;
  159.         }
  160.       //---
  161.       sar=ExtSARBuffer[i-1]+step*(ep-ExtSARBuffer[i-1]);
  162.       //--- LONG?
  163.       if(dir_long)
  164.         {
  165.          if(ep<high[i])
  166.            {
  167.             if((step+ExtSarStep)<=ExtSarMaximum)
  168.                step+=ExtSarStep;
  169.            }
  170.          if(high[i]<high[i-1] && i==2)
  171.             sar=ExtSARBuffer[i-1];
  172.          if(sar>low[i-1])
  173.             sar=low[i-1];
  174.          if(sar>low[i-2])
  175.             sar=low[i-2];
  176.          if(sar>low[i])
  177.            {
  178.             SaveLastReverse(i,true,step,low[i],last_high,ep,sar);
  179.             step=ExtSarStep; dir_long=false; ep=low[i];
  180.             last_low=low[i];
  181.             ExtSARBuffer[i++]=last_high;
  182.             continue;
  183.            }
  184.          if(ep<high[i])
  185.             ep=last_high=high[i];
  186.         }
  187.       else // SHORT
  188.         {
  189.          if(ep>low[i])
  190.            {
  191.             if((step+ExtSarStep)<=ExtSarMaximum)
  192.                step+=ExtSarStep;
  193.            }
  194.          if(low[i]<low[i-1] && i==2)
  195.             sar=ExtSARBuffer[i-1];
  196.          if(sar<high[i-1])
  197.             sar=high[i-1];
  198.          if(sar<high[i-2])
  199.             sar=high[i-2];
  200.          if(sar<high[i])
  201.            {
  202.             SaveLastReverse(i,false,step,last_low,high[i],ep,sar);
  203.             step=ExtSarStep;
  204.             dir_long=true;
  205.             ep=high[i];
  206.             last_high=high[i];
  207.             ExtSARBuffer[i++]=last_low;
  208.             continue;
  209.            }
  210.          if(ep>low[i])
  211.             ep=last_low=low[i];
  212.         }
  213.       ExtSARBuffer[i++]=sar;
  214.      }
  215. //---- OnCalculate done. Return new prev_calculated.
  216.    return(rates_total);
  217.   }
  218. //+------------------------------------------------------------------+
  219. //|  save last values to continue further calculations               |
  220. //+------------------------------------------------------------------+
  221. void SaveLastReverse(int reverse,bool dir,double step,double last_low,double last_high,double ep,double sar)
  222.   {
  223.    ExtLastReverse=reverse;
  224.    if(ExtLastReverse<2)
  225.       ExtLastReverse=2;
  226.    ExtDirectionLong=dir;
  227.    ExtLastStep=step;
  228.    ExtLastLow=last_low;
  229.    ExtLastHigh=last_high;
  230.    ExtLastEP=ep;
  231.    ExtLastSAR=sar;
  232.   }
  233. //+------------------------------------------------------------------+
复制代码




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

使用道具 举报

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

本版积分规则


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

GMT+8, 2024-12-22 11:03 , Processed in 0.159531 second(s), 27 queries .

© 2009-2022 520EA.com EA668.com

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