RSIOMA_v2HLS

Download script
Author: Copyright � 2004, MetaQuotes Software Corp.
RSIOMA_v2HLS

The RSIOMA v2HLS is a specialized technical analysis tool designed to help traders visualize momentum and potential trend reversals. It builds upon the standard Relative Strength Index (RSI) by adding several layers of visual data, including moving averages and dynamic "trigger" signals that highlight specific market conditions.

Here is a breakdown of how the logic works:

Core Momentum Tracking

At its heart, the script calculates the Relative Strength Index (RSI). This measures the speed and change of price movements to determine if an asset is overbought, oversold, or trending in a specific direction. Unlike a standard RSI, this version uses a smoothed moving average approach to calculate gains and losses, which helps filter out "market noise" and provides a cleaner view of the momentum.

Trend and Signal Layers

The indicator goes beyond a simple line by adding three distinct visual layers:

  • The Moving Average (marsioma): The script calculates a secondary moving average specifically based on the RSI values. This helps traders see the "average" momentum over time, allowing them to identify if the current momentum is accelerating or decelerating compared to recent history.
  • Main Trend Visualization: The logic monitors specific zones to highlight the broader market direction. It identifies "Long Trends" (upward momentum) and "Short Trends" (downward momentum). These are represented as visual histograms that change intensity based on how far the RSI moves into extreme territory.
  • Dynamic Trigger Signals: This is one of the script's most unique features. It looks for specific "crossover" moments at key levels:
    • Overbought/Oversold Triggers: The script watches for instances where the price momentum enters extreme zones (like the 20 or 80 levels) and then begins to turn back toward the center.
    • Visual Feedback: When these specific conditions are met—such as a momentum reversal at an extreme high or low—the script creates visible signal markers. These act as alerts to potential exhaustion in the current move.

Visual Reference Points

To make the data actionable, the script automatically plots several horizontal reference lines on your chart:

  • The 50 Level: Represents the equilibrium point (neutral territory).
  • The 80 and 20 Levels: Used to identify "overbought" and "oversold" conditions.
  • Trend Boundaries: Custom levels (like 70 and 30) are used to define the strength of the prevailing trend.

Summary for the User

Instead of just giving you a single line, this script provides a multi-layered "dashboard." It tells you:

  1. Where the price is going (via the RSI line).
  2. The average direction of that momentum (via the Moving Average).
  3. When the momentum is reaching an extreme point and potentially exhausting itself (via the Trigger histograms and visual signals).
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
RSIOMA_v2HLS
//+--------------------------------------------------------------------------------+
//|                         RSIOMAv2HLS                 Kalenzo    fxtsd.com       |
//|    HistLevel/Sig mod               Copyright © 2004, MetaQuotes Software Corp. |
//|  FXtsd.com                                    web: http://www.fxservice.eu     |
//|                                           email: bartlomiej.gorski@gmail.com   |
//+--------------------------------------------------------------------------------+
/*      The base for this indicator was orginal RSI attached with Metatrader.Hornet*/

#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_minimum -25
#property indicator_maximum 105
#property indicator_buffers 6
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Magenta
#property indicator_color5 DodgerBlue
#property indicator_color6 BlueViolet
#property indicator_width1 2   
#property indicator_width4 2
#property indicator_width5 2
#property indicator_level1 80
#property indicator_level2 50
#property indicator_level3 20
//---- input parameters
extern int RSIOMA          = 14;
extern int RSIOMA_MODE     = MODE_EMA;
extern int RSIOMA_PRICE    = PRICE_CLOSE;
extern color  RSIOMAColor = BlueViolet;

extern int Ma_RSIOMA       = 21,
           Ma_RSIOMA_MODE  = MODE_EMA;
extern color  Ma_RSIOMAColor = Blue;

extern int BuyTrigger      = 80;
extern int SellTrigger     = 20;

extern color BuyTriggerColor  = DodgerBlue;
extern color SellTriggerColor = Magenta;

extern int MainTrendLong   = 70;
extern int MainTrendShort  = 30;
extern color MainTrendLongColor     = Red;
extern color MainTrendShortColor    = Green;
extern double MajorTrend   = 50;

//---- buffers
double RSIBuffer[];
double PosBuffer[];
double NegBuffer[];

double bdn[],bup[];
double sdn[],sup[];

double marsioma[];
string short_name;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   short_name = StringConcatenate("RSIOMA(",RSIOMA,")");   
   IndicatorBuffers(8);
   
   SetIndexBuffer(0,RSIBuffer);
   SetIndexBuffer(2,bup);  //trend lev up
   SetIndexBuffer(1,bdn); //trend lev dn
   SetIndexBuffer(3,sdn);  
   SetIndexBuffer(4,sup);
   SetIndexBuffer(5,marsioma);
   
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,0,RSIOMAColor);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,0,Ma_RSIOMAColor);
   
   SetIndexBuffer(6,PosBuffer);
   SetIndexBuffer(7,NegBuffer);
 
    SetIndexLabel(0,"RSIOMA("+RSIOMA+")");
    SetIndexLabel(1,"MainTrandDn");
    SetIndexLabel(2,"MainTrandUp");
    SetIndexLabel(3,"SigDn");
    SetIndexLabel(4,"SigUp");   
    SetIndexLabel(5,"marsioma("+Ma_RSIOMA+")");   
     
   IndicatorShortName(short_name);

   SetIndexDrawBegin(0,RSIOMA);
   SetIndexDrawBegin(1,RSIOMA);
   SetIndexDrawBegin(2,RSIOMA);
   SetIndexDrawBegin(3,RSIOMA);
   SetIndexDrawBegin(4,RSIOMA);
   SetIndexDrawBegin(5,RSIOMA);
   SetIndexDrawBegin(6,RSIOMA);
   SetIndexDrawBegin(7,RSIOMA);
//----

 drawLine(BuyTrigger,"BuyTrigger", BuyTriggerColor);
   drawLine(SellTrigger,"SellTrigger", SellTriggerColor );
   drawLine(MainTrendLong,"MainTrendLong", MainTrendLongColor );
   drawLine(MainTrendShort,"MainTrendShort",MainTrendShortColor );

   return(0);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   
  
   
   int    i,counted_bars=IndicatorCounted();
   double rel,negative,positive;
//----
   if(Bars<=RSIOMA) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=RSIOMA;i++) RSIBuffer[Bars-i]=0.0;
//----
   i=Bars-RSIOMA-1;
   int ma = i;
   if(counted_bars>=RSIOMA) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumn=0.0,sump=0.0;
      if(i==Bars-RSIOMA-1)
        {
         int k=Bars-2;
         //---- initial accumulation
         while(k>=i)
           {
            
            double cma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,k);
            double pma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,k+1);
            
            rel=cma-pma;
            
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            k--;
           }
         positive=sump/RSIOMA;
         negative=sumn/RSIOMA;
        }
      else
        {
         //---- smoothed moving average
         double ccma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,i);
         double ppma = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,i+1);
            
         rel=ccma-ppma;
         
         if(rel>0) sump=rel;
         else      sumn=-rel;
         positive=(PosBuffer[i+1]*(RSIOMA-1)+sump)/RSIOMA;
         negative=(NegBuffer[i+1]*(RSIOMA-1)+sumn)/RSIOMA;
        }
      PosBuffer[i]=positive;
      NegBuffer[i]=negative;
      if(negative==0.0) RSIBuffer[i]=0.0;
      else
      {
          RSIBuffer[i]=100.0-100.0/(1+positive/negative);
          
          bdn[i] = 0;
          bup[i] = 0;
          sdn[i] = 0;
          sup[i] = 0;
          
           if(RSIBuffer[i]>50)
          bup[i] = 5;
          if(RSIBuffer[i]>MainTrendLong)
          bup[i] = 12;
  
   if(RSIBuffer[i]<50)
          bdn[i] = -5;         
          if(RSIBuffer[i]<MainTrendShort)
          bdn[i] = -12;
 
           
          if(RSIBuffer[i]<20 && RSIBuffer[i]>RSIBuffer[i+1])
          sup[i] = -5;
           if(RSIBuffer[i]>20 && RSIBuffer[i+1]<=20)
          sup[i] = 10;

          
          if(RSIBuffer[i]>80 && RSIBuffer[i]<RSIBuffer[i+1])
          sdn[i] = 5;
            if(RSIBuffer[i+1]>=80 && RSIBuffer[i]<80)
          sdn[i] = -10;
          
          
      }    
      i--;
     }
     
     while(ma>=0)
     {
         marsioma[ma] = iMAOnArray(RSIBuffer,0,Ma_RSIOMA,0,Ma_RSIOMA_MODE,ma); 
         ma--;
     }    
     
//----
   return(0);
  }
//+------------------------------------------------------------------+
void drawLine(double lvl,string name, color Col )
{
       
            ObjectDelete(name);
            ObjectCreate(name, OBJ_HLINE, WindowFind(short_name), Time[0], lvl,Time[0],lvl);
            
            
            ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
            
            ObjectSet(name, OBJPROP_COLOR, Col);        
            ObjectSet(name,OBJPROP_WIDTH,1);
          
       
}

Comments