RSI_Improved

Author: Fedor Igumnov
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
RSI_Improved
//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---