// RSI on Buffer int RsiOnBuffer(const int rates_total,const int prev_calculated,const int begin, const int period,const double& price[],double& rsiBuffer[], double &posBuffer[], double &negBuffer[]) { int i, pos; double diff; //--- check for data if(period<=1 || rates_total-begin0) sump+=diff; else sumn-=diff; } //--- calculate first visible value posBuffer[period]=sump/period; negBuffer[period]=sumn/period; if(negBuffer[period]!=0.0) rsiBuffer[period]=100.0-(100.0/(1.0+posBuffer[period]/negBuffer[period])); else { if(posBuffer[period]!=0.0) rsiBuffer[period]=100.0; else rsiBuffer[period]=50.0; } //--- prepare the position value for main calculation pos=period+1; } //--- the main loop of calculations for(i=pos; i0.0?diff:0.0))/period; negBuffer[i]=(negBuffer[i-1]*(period-1)+(diff<0.0?-diff:0.0))/period; if(negBuffer[i]!=0.0) rsiBuffer[i]=100.0-100.0/(1+posBuffer[i]/negBuffer[i]); else { if(posBuffer[i]!=0.0) rsiBuffer[i]=100.0; else rsiBuffer[i]=50.0; } } //--- restore as_series flags if(as_series_price) ArraySetAsSeries(price,true); if(as_series_rsibuffer) ArraySetAsSeries(rsiBuffer,true); if(as_series_posbuffer) ArraySetAsSeries(posBuffer,true); if(as_series_negbuffer) ArraySetAsSeries(negBuffer,true); //--- return(rates_total); } //+------------------------------------------------------------------+