- 注册时间
- 2013-9-23
- 在线时间
- 519 小时
- 最后登录
- 2022-4-4
- 阅读权限
- 200
管理员
MT4软件工程师
- 积分
- 6521
- 帖子
- 2771
- 主题
- 2761
|
MT4智能交易编程示例 BOLL指标- #property copyright "路路发智能交易研发中心"
- #property link "http://www.ea668.com"
- #property description "Bollinger Bands"
- #property strict
- #include <MovingAverages.mqh>
- #property indicator_chart_window
- #property indicator_buffers 3
- #property indicator_color1 LightSeaGreen
- #property indicator_color2 LightSeaGreen
- #property indicator_color3 LightSeaGreen
- //--- indicator parameters
- input int InpBandsPeriod=20; // Bands Period
- input int InpBandsShift=0; // Bands Shift
- input double InpBandsDeviations=2.0; // Bands Deviations
- //--- buffers
- double ExtMovingBuffer[];
- double ExtUpperBuffer[];
- double ExtLowerBuffer[];
- double ExtStdDevBuffer[];
- //+------------------------------------------------------------------+
- //| Custom indicator initialization function |
- //+------------------------------------------------------------------+
- int OnInit(void)
- {
- //--- 1 additional buffer used for counting.
- IndicatorBuffers(4);
- IndicatorDigits(Digits);
- //--- middle line
- SetIndexStyle(0,DRAW_LINE);
- SetIndexBuffer(0,ExtMovingBuffer);
- SetIndexShift(0,InpBandsShift);
- SetIndexLabel(0,"Bands SMA");
- //--- upper band
- SetIndexStyle(1,DRAW_LINE);
- SetIndexBuffer(1,ExtUpperBuffer);
- SetIndexShift(1,InpBandsShift);
- SetIndexLabel(1,"Bands Upper");
- //--- lower band
- SetIndexStyle(2,DRAW_LINE);
- SetIndexBuffer(2,ExtLowerBuffer);
- SetIndexShift(2,InpBandsShift);
- SetIndexLabel(2,"Bands Lower");
- //--- work buffer
- SetIndexBuffer(3,ExtStdDevBuffer);
- //--- check for input parameter
- if(InpBandsPeriod<=0)
- {
- Print("Wrong input parameter Bands Period=",InpBandsPeriod);
- return(INIT_FAILED);
- }
- //---
- SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift);
- SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift);
- SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift);
- //--- initialization done
- return(INIT_SUCCEEDED);
- }
- //+------------------------------------------------------------------+
- //| Bollinger Bands |
- //+------------------------------------------------------------------+
- int OnCalculate(const int rates_total,
- const int prev_calculated,
- const datetime &time[],
- const double &open[],
- const double &high[],
- const double &low[],
- const double &close[],
- const long &tick_volume[],
- const long &volume[],
- const int &spread[])
- {
- int i,pos;
- //---
- if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)
- return(0);
- //--- counting from 0 to rates_total
- ArraySetAsSeries(ExtMovingBuffer,false);
- ArraySetAsSeries(ExtUpperBuffer,false);
- ArraySetAsSeries(ExtLowerBuffer,false);
- ArraySetAsSeries(ExtStdDevBuffer,false);
- ArraySetAsSeries(close,false);
- //--- initial zero
- if(prev_calculated<1)
- {
- for(i=0; i<InpBandsPeriod; i++)
- {
- ExtMovingBuffer[i]=EMPTY_VALUE;
- ExtUpperBuffer[i]=EMPTY_VALUE;
- ExtLowerBuffer[i]=EMPTY_VALUE;
- }
- }
- //--- starting calculation
- if(prev_calculated>1)
- pos=prev_calculated-1;
- else
- pos=0;
- //--- main cycle
- for(i=pos; i<rates_total && !IsStopped(); i++)
- {
- //--- middle line
- ExtMovingBuffer[i]=SimpleMA(i,InpBandsPeriod,close);
- //--- calculate and write down StdDev
- ExtStdDevBuffer[i]=StdDev_Func(i,close,ExtMovingBuffer,InpBandsPeriod);
- //--- upper line
- ExtUpperBuffer[i]=ExtMovingBuffer[i]+InpBandsDeviations*ExtStdDevBuffer[i];
- //--- lower line
- ExtLowerBuffer[i]=ExtMovingBuffer[i]-InpBandsDeviations*ExtStdDevBuffer[i];
- //---
- }
- //---- OnCalculate done. Return new prev_calculated.
- return(rates_total);
- }
- //+------------------------------------------------------------------+
- //| Calculate Standard Deviation |
- //+------------------------------------------------------------------+
- double StdDev_Func(int position,const double &price[],const double &MAprice[],int period)
- {
- //--- variables
- double StdDev_dTmp=0.0;
- //--- check for position
- if(position>=period)
- {
- //--- calcualte StdDev
- for(int i=0; i<period; i++)
- StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);
- StdDev_dTmp=MathSqrt(StdDev_dTmp/period);
- }
- //--- return calculated value
- return(StdDev_dTmp);
- }
- //+------------------------------------------------------------------+
复制代码
|
|