路路发智能交易研发中心

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

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

[复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

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

  5. #property indicator_chart_window
  6. #property indicator_buffers 1
  7. #property indicator_color1 Red
  8. //--- indicator parameters
  9. input int            InpMAPeriod=13;        // Period
  10. input int            InpMAShift=0;          // Shift
  11. input ENUM_MA_METHOD InpMAMethod=MODE_SMA;  // Method
  12. //--- indicator buffer
  13. double ExtLineBuffer[];
  14. //+------------------------------------------------------------------+
  15. //| Custom indicator initialization function                         |
  16. //+------------------------------------------------------------------+
  17. int OnInit(void)
  18.   {
  19.    string short_name;
  20.    int    draw_begin=InpMAPeriod-1;
  21. //--- indicator short name
  22.    switch(InpMAMethod)
  23.      {
  24.       case MODE_SMA  : short_name="SMA(";                break;
  25.       case MODE_EMA  : short_name="EMA(";  draw_begin=0; break;
  26.       case MODE_SMMA : short_name="SMMA(";               break;
  27.       case MODE_LWMA : short_name="LWMA(";               break;
  28.       default :        return(INIT_FAILED);
  29.      }
  30.    IndicatorShortName(short_name+string(InpMAPeriod)+")");
  31.    IndicatorDigits(Digits);
  32. //--- check for input
  33.    if(InpMAPeriod<2)
  34.       return(INIT_FAILED);
  35. //--- drawing settings
  36.    SetIndexStyle(0,DRAW_LINE);
  37.    SetIndexShift(0,InpMAShift);
  38.    SetIndexDrawBegin(0,draw_begin);
  39. //--- indicator buffers mapping
  40.    SetIndexBuffer(0,ExtLineBuffer);
  41. //--- initialization done
  42.    return(INIT_SUCCEEDED);
  43.   }
  44. //+------------------------------------------------------------------+
  45. //|  Moving Average                                                  |
  46. //+------------------------------------------------------------------+
  47. int OnCalculate(const int rates_total,
  48.                 const int prev_calculated,
  49.                 const datetime &time[],
  50.                 const double &open[],
  51.                 const double &high[],
  52.                 const double &low[],
  53.                 const double &close[],
  54.                 const long &tick_volume[],
  55.                 const long &volume[],
  56.                 const int &spread[])
  57.   {
  58. //--- check for bars count
  59.    if(rates_total<InpMAPeriod-1 || InpMAPeriod<2)
  60.       return(0);
  61. //--- counting from 0 to rates_total
  62.    ArraySetAsSeries(ExtLineBuffer,false);
  63.    ArraySetAsSeries(close,false);
  64. //--- first calculation or number of bars was changed
  65.    if(prev_calculated==0)
  66.       ArrayInitialize(ExtLineBuffer,0);
  67. //--- calculation
  68.    switch(InpMAMethod)
  69.      {
  70.       case MODE_EMA:  CalculateEMA(rates_total,prev_calculated,close);        break;
  71.       case MODE_LWMA: CalculateLWMA(rates_total,prev_calculated,close);       break;
  72.       case MODE_SMMA: CalculateSmoothedMA(rates_total,prev_calculated,close); break;
  73.       case MODE_SMA:  CalculateSimpleMA(rates_total,prev_calculated,close);   break;
  74.      }
  75. //--- return value of prev_calculated for next call
  76.    return(rates_total);
  77.   }
  78. //+------------------------------------------------------------------+
  79. //|   simple moving average                                          |
  80. //+------------------------------------------------------------------+
  81. void CalculateSimpleMA(int rates_total,int prev_calculated,const double &price[])
  82.   {
  83.    int i,limit;
  84. //--- first calculation or number of bars was changed
  85.    if(prev_calculated==0)
  86.    
  87.      {
  88.       limit=InpMAPeriod;
  89.       //--- calculate first visible value
  90.       double firstValue=0;
  91.       for(i=0; i<limit; i++)
  92.          firstValue+=price[i];
  93.       firstValue/=InpMAPeriod;
  94.       ExtLineBuffer[limit-1]=firstValue;
  95.      }
  96.    else
  97.       limit=prev_calculated-1;
  98. //--- main loop
  99.    for(i=limit; i<rates_total && !IsStopped(); i++)
  100.       ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
  101. //---
  102.   }
  103. //+------------------------------------------------------------------+
  104. //|  exponential moving average                                      |
  105. //+------------------------------------------------------------------+
  106. void CalculateEMA(int rates_total,int prev_calculated,const double &price[])
  107.   {
  108.    int    i,limit;
  109.    double SmoothFactor=2.0/(1.0+InpMAPeriod);
  110. //--- first calculation or number of bars was changed
  111.    if(prev_calculated==0)
  112.      {
  113.       limit=InpMAPeriod;
  114.       ExtLineBuffer[0]=price[0];
  115.       for(i=1; i<limit; i++)
  116.          ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
  117.      }
  118.    else
  119.       limit=prev_calculated-1;
  120. //--- main loop
  121.    for(i=limit; i<rates_total && !IsStopped(); i++)
  122.       ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
  123. //---
  124.   }
  125. //+------------------------------------------------------------------+
  126. //|  linear weighted moving average                                  |
  127. //+------------------------------------------------------------------+
  128. void CalculateLWMA(int rates_total,int prev_calculated,const double &price[])
  129.   {
  130.    int        i,limit;
  131.    static int weightsum;
  132.    double     sum;
  133. //--- first calculation or number of bars was changed
  134.    if(prev_calculated==0)
  135.      {
  136.       weightsum=0;
  137.       limit=InpMAPeriod;
  138.       //--- calculate first visible value
  139.       double firstValue=0;
  140.       for(i=0;i<limit;i++)
  141.         {
  142.          int k=i-1;
  143.          weightsum+=k;
  144.          firstValue+=k*price[i];
  145.         }
  146.       firstValue/=(double)weightsum;
  147.       ExtLineBuffer[limit-1]=firstValue;
  148.      }
  149.    else
  150.       limit=prev_calculated-1;
  151. //--- main loop
  152.    for(i=limit; i<rates_total && !IsStopped(); i++)
  153.      {
  154.       sum=0;
  155.       for(int j=0;j<InpMAPeriod;j++)
  156.          sum+=(InpMAPeriod-j)*price[i-j];
  157.       ExtLineBuffer[i]=sum/weightsum;
  158.      }
  159. //---
  160.   }
  161. //+------------------------------------------------------------------+
  162. //|  smoothed moving average                                         |
  163. //+------------------------------------------------------------------+
  164. void CalculateSmoothedMA(int rates_total,int prev_calculated,const double &price[])
  165.   {
  166.    int i,limit;
  167. //--- first calculation or number of bars was changed
  168.    if(prev_calculated==0)
  169.      {
  170.       limit=InpMAPeriod;
  171.       double firstValue=0;
  172.       for(i=0; i<limit; i++)
  173.          firstValue+=price[i];
  174.       firstValue/=InpMAPeriod;
  175.       ExtLineBuffer[limit-1]=firstValue;
  176.      }
  177.    else
  178.       limit=prev_calculated-1;
  179. //--- main loop
  180.    for(i=limit; i<rates_total && !IsStopped(); i++)
  181.       ExtLineBuffer[i]=(ExtLineBuffer[i-1]*(InpMAPeriod-1)+price[i])/InpMAPeriod;
  182. //---
  183.   }
  184. //+------------------------------------------------------------------+
复制代码



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

使用道具 举报

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

本版积分规则


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

GMT+8, 2024-12-22 11:31 , Processed in 0.149184 second(s), 26 queries .

© 2009-2022 520EA.com EA668.com

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