RSIOMA_v2HLS
Download scriptThe 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:
- Where the price is going (via the RSI line).
- The average direction of that momentum (via the Moving Average).
- When the momentum is reaching an extreme point and potentially exhausting itself (via the Trigger histograms and visual signals).
//+--------------------------------------------------------------------------------+
//| 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