Здравствуйте!
Прошу помощи. Есть функция, аналог iRSIOnArray(); с одинаковым успехом работает и в МТ4, и в МТ5:
//+------------------------------------------------------------------+ //| Relative Strength Index on array | //+------------------------------------------------------------------+ template<typename T> int RSIOnArray(const int rates_total, const int prev_calculated, const int begin, const int period, const T &price[], double &buffer_pos[], double &buffer_neg[], double &buffer_rsi[]) { int i; T diff; //--- check for rates count if(period<1 || rates_total-begin<period) return(0); //--- save as_series flags bool as_series_price=ArrayGetAsSeries(price); bool as_series_rsi =ArrayGetAsSeries(buffer_rsi); if(as_series_price) ArraySetAsSeries(price,false); if(as_series_rsi) { ArraySetAsSeries(buffer_rsi,false); ArraySetAsSeries(buffer_pos,false); ArraySetAsSeries(buffer_neg,false); } //--- preliminary calculations int pos=prev_calculated-1; if(pos<=period) { //--- first RSIPeriod values of the indicator are not calculated buffer_rsi[0]=0.0; buffer_pos[0]=0.0; buffer_neg[0]=0.0; T SumP=0.0; T SumN=0.0; //--- for(i=1; i<=period; i++) { buffer_rsi[i]=0.0; buffer_pos[i]=0.0; buffer_neg[i]=0.0; diff=price[i]-price[i-1]; SumP+=(diff>0 ? diff : 0); SumN+=(diff<0 ?-diff : 0); } //--- calculate first visible value buffer_pos[period]=double(SumP/period); buffer_neg[period]=double(SumN/period); buffer_rsi[period]=100.0-(100.0/(1.0+buffer_pos[period]/(buffer_neg[period]>0 ? buffer_neg[period] : DBL_MIN))); //--- prepare the position value for main calculation pos=period+1; } //--- the main loop of calculations for(i=pos;i<rates_total && !IsStopped();i++) { diff=price[i]-price[i-1]; buffer_pos[i]=(buffer_pos[i-1]*(period-1)+(diff>0.0 ? diff : 0.0))/period; buffer_neg[i]=(buffer_neg[i-1]*(period-1)+(diff<0.0 ?-diff : 0.0))/period; buffer_rsi[i]=100.0-100.0/(1+buffer_pos[i]/(buffer_neg[i]>0 ? buffer_neg[i] : DBL_MIN)); } //--- restore as_series flags if(as_series_price) ArraySetAsSeries(price,true); if(as_series_rsi) { ArraySetAsSeries(buffer_rsi,true); ArraySetAsSeries(buffer_pos,true); ArraySetAsSeries(buffer_neg,true); } //--- return(rates_total); } //+------------------------------------------------------------------+
Просьба написать функцию аналог iCCIOnArray(); в плане шефской помощи. Ну и как гимнастика для ума.
Заранее благодарен-






