//------------------------------------------------------------------ #property copyright "www.forex-tsd.com" #property link "www.forex-tsd.com" //------------------------------------------------------------------ #property indicator_separate_window #property indicator_buffers 6 #property indicator_plots 5 #property indicator_label1 "rsi OB/OS zone" #property indicator_type1 DRAW_FILLING #property indicator_color1 C'221,247,221',clrMistyRose #property indicator_label2 "rsi up level" #property indicator_type2 DRAW_LINE #property indicator_color2 clrLimeGreen #property indicator_style2 STYLE_DOT #property indicator_label3 "rsi middle level" #property indicator_type3 DRAW_LINE #property indicator_color3 DimGray #property indicator_style3 STYLE_DOT #property indicator_label4 "rsi down level" #property indicator_type4 DRAW_LINE #property indicator_color4 clrPaleVioletRed #property indicator_style4 STYLE_DOT #property indicator_label5 "rsi" #property indicator_type5 DRAW_LINE #property indicator_color5 DarkGray #property indicator_width5 2 // // // // // enum rsiMethods { _rsi, // rsi _wil, // Wilder's rsi _rsx, // rsx _cut // Cuttler's rsi }; input int RsiPeriod = 14; // Rsi period input rsiMethods RsiMethod = _rsi; // Rsi method input int MinMaxPeriod = 100; // Floating levels period input double LevelUp = 80.0; // Up level % input double LevelDown = 20.0; // Down level % input double SmoothPeriod = 8; // Smoothing period input double SmoothPhase = 0; // Smoothing phase double rsi[]; double fill1[]; double fill2[]; double levelUp[]; double levelMi[]; double levelDn[]; //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // int OnInit() { SetIndexBuffer(0,fill1 ,INDICATOR_DATA); SetIndexBuffer(1,fill2 ,INDICATOR_DATA); SetIndexBuffer(2,levelUp,INDICATOR_DATA); SetIndexBuffer(3,levelMi,INDICATOR_DATA); SetIndexBuffer(4,levelDn,INDICATOR_DATA); SetIndexBuffer(5,rsi ,INDICATOR_DATA); IndicatorSetString(INDICATOR_SHORTNAME," RSI floating levels ("+(string)RsiPeriod+","+(string)MinMaxPeriod+")"); return(0); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[] ) { // // // // // for (int i=(int)MathMax(prev_calculated-1,0); i=0; k++) { min = rsi[i-k]< min ? rsi[i-k]: min; max = rsi[i-k]> max ? rsi[i-k]: max; } double range = max-min; levelDn[i] = min+range*LevelDown/100.0; levelMi[i] = min+range*0.5; levelUp[i] = min+range*LevelUp/100.0; fill1[i] = rsi[i]; fill2[i] = rsi[i]; if (rsi[i]>levelUp[i]) fill2[i] = levelUp[i]; if (rsi[i]=0; k++) sum += MathAbs(workRsi[r-k][z+_price]-workRsi[r-k-1][z+_price]); workRsi[r][z+_change] = (workRsi[r][z+_price]-workRsi[0][z+_price])/MathMax(k,1); workRsi[r][z+_changa] = sum/MathMax(k,1); } else { double alpha = 1.0/period; double change = workRsi[r][z+_price]-workRsi[r-1][z+_price]; workRsi[r][z+_change] = workRsi[r-1][z+_change] + alpha*( change - workRsi[r-1][z+_change]); workRsi[r][z+_changa] = workRsi[r-1][z+_changa] + alpha*(MathAbs(change) - workRsi[r-1][z+_changa]); } if (workRsi[r][z+_changa] != 0) return(50.0*(workRsi[r][z+_change]/workRsi[r][z+_changa]+1)); else return(50.0); // // // // // case _wil : if (r>0) { workRsi[r][z+1] = iSmma(0.5*(MathAbs(workRsi[r][z+_price]-workRsi[r-1][z+_price])+(workRsi[r][z+_price]-workRsi[r-1][z+_price])),0.5*(period-1),r,bars,instanceNo*2+0); workRsi[r][z+2] = iSmma(0.5*(MathAbs(workRsi[r][z+_price]-workRsi[r-1][z+_price])-(workRsi[r][z+_price]-workRsi[r-1][z+_price])),0.5*(period-1),r,bars,instanceNo*2+1); if((workRsi[r][z+1] + workRsi[r][z+2]) != 0) return(100.0 * workRsi[r][z+1]/(workRsi[r][z+1] + workRsi[r][z+2])); else return(50); } else return(50); // // // // // case _rsx : if (r=0; k++) { double diff = workRsi[r-k][z+_price]-workRsi[r-k-1][z+_price]; if (diff > 0) sump += diff; if (diff < 0) sumn -= diff; } if (sumn > 0) return(100.0-100.0/(1.0+sump/sumn)); else return(50); } } return(price); } // // // // // // double workSmma[][2]; double iSmma(double price, double period, int r, int bars, int instanceNo=0) { if (ArrayRange(workSmma,0)!= bars) ArrayResize(workSmma,bars); // // // // // if (r MathAbs(del2)) wrk[r][volty+s] = MathAbs(del1); if(MathAbs(del1) < MathAbs(del2)) wrk[r][volty+s] = MathAbs(del2); wrk[r][vsum+s] = wrk[r-1][vsum+s] + (wrk[r][volty+s]-wrk[r-forBar][volty+s])*div; // // // // // wrk[r][avolty+s] = wrk[r-1][avolty+s]+(2.0/(MathMax(4.0*length,30)+1.0))*(wrk[r][vsum+s]-wrk[r-1][avolty+s]); double dVolty = 0; if (wrk[r][avolty+s] > 0) dVolty = wrk[r][volty+s]/wrk[r][avolty+s]; if (dVolty > MathPow(len1,1.0/pow1)) dVolty = MathPow(len1,1.0/pow1); if (dVolty < 1) dVolty = 1.0; // // // // // double pow2 = MathPow(dVolty, pow1); double len2 = MathSqrt(0.5*(length-1))*len1; double Kv = MathPow(len2/(len2+1), MathSqrt(pow2)); if (del1 > 0) wrk[r][bsmax+s] = price; else wrk[r][bsmax+s] = price - Kv*del1; if (del2 < 0) wrk[r][bsmin+s] = price; else wrk[r][bsmin+s] = price - Kv*del2; // // // // // double R = MathMax(MathMin(phase,100),-100)/100.0 + 1.5; double beta = 0.45*(length-1)/(0.45*(length-1)+2); double alpha = MathPow(beta,pow2); wrk[r][0+s] = price + alpha*(wrk[r-1][0+s]-price); wrk[r][1+s] = (price - wrk[r][0+s])*(1-beta) + beta*wrk[r-1][1+s]; wrk[r][2+s] = (wrk[r][0+s] + R*wrk[r][1+s]); wrk[r][3+s] = (wrk[r][2+s] - wrk[r-1][4+s])*MathPow((1-alpha),2) + MathPow(alpha,2)*wrk[r-1][3+s]; wrk[r][4+s] = (wrk[r-1][4+s] + wrk[r][3+s]); // // // // // return(wrk[r][4+s]); }