#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