Author: Integer
0 Views
0 Downloads
0 Favorites
iSTDFast
#property copyright "Integer"
#property link      "https://www.mql5.com/ru/users/integer"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   1
//--- plot std
#property indicator_label1  "std"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input int period=20;

//--- indicator buffers
double         std[];
double         psum[];
double         p2sum[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){

   SetIndexBuffer(0,std,INDICATOR_DATA);
   
   SetIndexBuffer(1,psum,INDICATOR_CALCULATIONS);   
   SetIndexBuffer(2,p2sum,INDICATOR_CALCULATIONS);  
  
      
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

   static int VCNT=0;
   int start;
   if(prev_calculated==0){
      start=period-1;
      psum[start]=0;      
      p2sum[start]=0;
      for(int i=0;i<period;i++){
         psum[start]+=close[i];
         p2sum[start]+=close[i]*close[i];
      }
      start=period;
   }
   else{
      start=prev_calculated-1;
   }

   for(int i=start;i<rates_total;i++){
      p2sum[i]=p2sum[i-1]-close[i-period]*close[i-period]+close[i]*close[i];
      psum[i]=psum[i-1]-close[i-period]+close[i];      
      double avr=psum[i]/period;      
      std[i]=sqrt((p2sum[i]-2.0*avr*psum[i])/period+avr*avr);
   }

   return(rates_total);
  }
//+------------------------------------------------------------------+

Comments