//+------------------------------------------------------------------+ //| RSIImproved.mq4 | //| Fedor Igumnov | //| igumnovfedor@yandex.ru | //+------------------------------------------------------------------+ //За основу взят код оригинального RSI //Считает разность между первым RSI и перевернутым вторым RSI(100-RSI2), а также //скорость изменения этой разности. #property copyright "Fedor Igumnov" #property link "igumnovfedor@yandex.ru" #property indicator_separate_window #property indicator_minimum -100 #property indicator_maximum 100 #property indicator_level1 70 #property indicator_level2 30 #property indicator_level3 -30 #property indicator_level4 -70 #property indicator_buffers 4 #property indicator_color1 DodgerBlue //Оригинальный первый RSI #property indicator_color2 Red //Перевернутый второй RSI #property indicator_color3 Green //Разность #property indicator_color4 White //Производная от разности //---- input parameters extern int RSIPeriodOriginal=14; extern int RSIPeriodRotated=7; //---- buffers double RSIBufferOriginal[]; double PosBufferOriginal[]; double NegBufferOriginal[]; double RSIBufferRotated[]; double PosBufferRotated[]; double NegBufferRotated[]; double Delta[]; double DeltaSpeed[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; IndicatorBuffers(8); SetIndexBuffer(0,RSIBufferOriginal); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(1,RSIBufferRotated); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,Delta); SetIndexStyle(2,DRAW_HISTOGRAM); SetIndexBuffer(3,DeltaSpeed); SetIndexStyle(3,DRAW_LINE); SetIndexBuffer(4,PosBufferRotated); SetIndexBuffer(5,NegBufferRotated); SetIndexBuffer(6,PosBufferOriginal); SetIndexBuffer(7,NegBufferOriginal); short_name="RSI Improved(Original Period"+RSIPeriodOriginal+";Rotated Period" +RSIPeriodRotated+")"; IndicatorShortName(short_name); SetIndexLabel(0,"RSI Original "+RSIPeriodOriginal); SetIndexLabel(1,"RSI Rotated "+RSIPeriodRotated); SetIndexLabel(2,"Delta"); SetIndexLabel(3,"Delta Speed"); //---- SetIndexDrawBegin(0,RSIPeriodOriginal); SetIndexDrawBegin(1,RSIPeriodRotated); //---- return(0); } //+------------------------------------------------------------------+ //| Relative Strength Index | //+------------------------------------------------------------------+ int start() { int i,counted_bars=IndicatorCounted(); double rel,negative,positive,negativerot,positiverot; //---- if(Bars<=RSIPeriodOriginal) return(0); if(Bars<=RSIPeriodRotated) return(0); //---- initial zero if(counted_bars<1) { for(i=1;i<=RSIPeriodOriginal;i++) RSIBufferOriginal[Bars-i]=0.0; for(i=1;i<=RSIPeriodRotated;i++) RSIBufferRotated[Bars-i]=0.0; } //---- i=Bars-RSIPeriodOriginal-1; if(counted_bars>=RSIPeriodOriginal) i=Bars-counted_bars-1; while(i>=0) { double sumn=0.0,sump=0.0; if(i==Bars-RSIPeriodOriginal-1) { int k=Bars-2; //---- initial accumulation while(k>=i) { rel=Close[k]-Close[k+1]; if(rel>0) sump+=rel; else sumn-=rel; k--; } positive=sump/RSIPeriodOriginal; negative=sumn/RSIPeriodOriginal; positiverot=sump/RSIPeriodRotated; negativerot=sumn/RSIPeriodRotated; } else { //---- smoothed moving average rel=Close[i]-Close[i+1]; if(rel>0) sump=rel; else sumn=-rel; positive=(PosBufferOriginal[i+1]*(RSIPeriodOriginal-1)+sump)/RSIPeriodOriginal; negative=(NegBufferOriginal[i+1]*(RSIPeriodOriginal-1)+sumn)/RSIPeriodOriginal; positiverot=(PosBufferRotated[i+1]*(RSIPeriodRotated-1)+sump)/RSIPeriodRotated; negativerot=(NegBufferRotated[i+1]*(RSIPeriodRotated-1)+sumn)/RSIPeriodRotated; } PosBufferOriginal[i]=positive; NegBufferOriginal[i]=negative; PosBufferRotated[i]=positiverot; NegBufferRotated[i]=negativerot; if(negative==0.0) RSIBufferOriginal[i]=0.0; else RSIBufferOriginal[i]=100.0-100.0/(1+positive/negative); if(negativerot==0.0) RSIBufferRotated[i]=0.0; else RSIBufferRotated[i]=100- (100.0-100.0/(1+positiverot/negativerot)); Delta[i] = RSIBufferOriginal[i]-RSIBufferRotated[i]; DeltaSpeed[i]=Delta[i+1]-Delta[i]; i--; } //---- return(0); } //+------------------------------------------------------------------+