路路发智能交易研发中心

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

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

[复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

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

  5. #include <MovingAverages.mqh>

  6. #property indicator_chart_window
  7. #property indicator_buffers 3
  8. #property indicator_color1 LightSeaGreen
  9. #property indicator_color2 LightSeaGreen
  10. #property indicator_color3 LightSeaGreen
  11. //--- indicator parameters
  12. input int    InpBandsPeriod=20;      // Bands Period
  13. input int    InpBandsShift=0;        // Bands Shift
  14. input double InpBandsDeviations=2.0; // Bands Deviations
  15. //--- buffers
  16. double ExtMovingBuffer[];
  17. double ExtUpperBuffer[];
  18. double ExtLowerBuffer[];
  19. double ExtStdDevBuffer[];
  20. //+------------------------------------------------------------------+
  21. //| Custom indicator initialization function                         |
  22. //+------------------------------------------------------------------+
  23. int OnInit(void)
  24.   {
  25. //--- 1 additional buffer used for counting.
  26.    IndicatorBuffers(4);
  27.    IndicatorDigits(Digits);
  28. //--- middle line
  29.    SetIndexStyle(0,DRAW_LINE);
  30.    SetIndexBuffer(0,ExtMovingBuffer);
  31.    SetIndexShift(0,InpBandsShift);
  32.    SetIndexLabel(0,"Bands SMA");
  33. //--- upper band
  34.    SetIndexStyle(1,DRAW_LINE);
  35.    SetIndexBuffer(1,ExtUpperBuffer);
  36.    SetIndexShift(1,InpBandsShift);
  37.    SetIndexLabel(1,"Bands Upper");
  38. //--- lower band
  39.    SetIndexStyle(2,DRAW_LINE);
  40.    SetIndexBuffer(2,ExtLowerBuffer);
  41.    SetIndexShift(2,InpBandsShift);
  42.    SetIndexLabel(2,"Bands Lower");
  43. //--- work buffer
  44.    SetIndexBuffer(3,ExtStdDevBuffer);
  45. //--- check for input parameter
  46.    if(InpBandsPeriod<=0)
  47.      {
  48.       Print("Wrong input parameter Bands Period=",InpBandsPeriod);
  49.       return(INIT_FAILED);
  50.      }
  51. //---
  52.    SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift);
  53.    SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift);
  54.    SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift);
  55. //--- initialization done
  56.    return(INIT_SUCCEEDED);
  57.   }
  58. //+------------------------------------------------------------------+
  59. //| Bollinger Bands                                                  |
  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.    int i,pos;
  73. //---
  74.    if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)
  75.       return(0);
  76. //--- counting from 0 to rates_total
  77.    ArraySetAsSeries(ExtMovingBuffer,false);
  78.    ArraySetAsSeries(ExtUpperBuffer,false);
  79.    ArraySetAsSeries(ExtLowerBuffer,false);
  80.    ArraySetAsSeries(ExtStdDevBuffer,false);
  81.    ArraySetAsSeries(close,false);
  82. //--- initial zero
  83.    if(prev_calculated<1)
  84.      {
  85.       for(i=0; i<InpBandsPeriod; i++)
  86.         {
  87.          ExtMovingBuffer[i]=EMPTY_VALUE;
  88.          ExtUpperBuffer[i]=EMPTY_VALUE;
  89.          ExtLowerBuffer[i]=EMPTY_VALUE;
  90.         }
  91.      }
  92. //--- starting calculation
  93.    if(prev_calculated>1)
  94.       pos=prev_calculated-1;
  95.    else
  96.       pos=0;
  97. //--- main cycle
  98.    for(i=pos; i<rates_total && !IsStopped(); i++)
  99.      {
  100.       //--- middle line
  101.       ExtMovingBuffer[i]=SimpleMA(i,InpBandsPeriod,close);
  102.       //--- calculate and write down StdDev
  103.       ExtStdDevBuffer[i]=StdDev_Func(i,close,ExtMovingBuffer,InpBandsPeriod);
  104.       //--- upper line
  105.       ExtUpperBuffer[i]=ExtMovingBuffer[i]+InpBandsDeviations*ExtStdDevBuffer[i];
  106.       //--- lower line
  107.       ExtLowerBuffer[i]=ExtMovingBuffer[i]-InpBandsDeviations*ExtStdDevBuffer[i];
  108.       //---
  109.      }
  110. //---- OnCalculate done. Return new prev_calculated.
  111.    return(rates_total);
  112.   }
  113. //+------------------------------------------------------------------+
  114. //| Calculate Standard Deviation                                     |
  115. //+------------------------------------------------------------------+
  116. double StdDev_Func(int position,const double &price[],const double &MAprice[],int period)
  117.   {
  118. //--- variables
  119.    double StdDev_dTmp=0.0;
  120. //--- check for position
  121.    if(position>=period)
  122.      {
  123.       //--- calcualte StdDev
  124.       for(int i=0; i<period; i++)
  125.          StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);
  126.       StdDev_dTmp=MathSqrt(StdDev_dTmp/period);
  127.      }
  128. //--- return calculated value
  129.    return(StdDev_dTmp);
  130.   }
  131. //+------------------------------------------------------------------+
复制代码



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

使用道具 举报

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

本版积分规则


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

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

© 2009-2022 520EA.com EA668.com

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