The RSIOMA script is a technical analysis tool designed to help traders identify market momentum, trend directions, and potential reversal points by combining multiple layers of data. Instead of looking at price alone, it processes the relationship between moving averages and the Relative Strength Index (RSI) to provide a smoothed, more readable perspective on market activity.
Core Logic and Data Processing
The script operates through a three-step calculation process:
- Smoothing: It first applies a Moving Average to the price data. This filters out minor "noise" and fluctuations to reveal the underlying price movement.
- Momentum Calculation: It then takes that smoothed average and calculates an RSI (Relative Strength Index) on top of it. This measures the speed and change of price movements.
- Secondary Smoothing: Finally, it applies another Moving Average specifically to that RSI data. This "Moving Average of the RSI" (MaRsioma) creates a stable line that is easier to read than a standard, jagged RSI indicator.
Visual Signals and Trend Identification
The tool translates these calculations into several visual cues on your chart:
- Trend Monitoring: The script tracks where the momentum sits relative to specific levels. For example, it monitors whether the momentum is in "Overbought" (high) or "Oversold" (low) territory.
- Cross-overs: It identifies key moments when the primary momentum line crosses its own average. These crossovers are often used as signals for potential changes in trend direction.
- Signal Arrows: The script automatically places visual markers (arrows) on the chart to highlight significant events, such as when the momentum shifts from a bearish to a bullish state or vice versa.
Alerts and Notifications
To ensure traders don't have to watch the screen constantly, the script includes an automated notification system. It is programmed to trigger alerts based on three specific conditions:
- Moving Average Crosses: Notifies you when the momentum line crosses its average.
- Trigger Levels: Alerts you when the momentum hits predefined "trigger" zones (high or low extremes).
- Major Trend Shifts: Notifies you when the momentum breaks through major trend thresholds.
These alerts can be configured to provide various types of feedback, including on-screen pop-up boxes, sound effects, or even email notifications, depending on your personal preference.
//+--------------------------------------------------------------------------------+
//| RSIOMA_v3 by Mladen & fxbs Kalenzo fxtsd.com |
//| Hornet(RSIOnArray) 2007, FxTSD.com MetaQuotes Software Corp. |
//| Hist & Levels 20/80;30/70 CrossSig web: http://www.fxservice.eu |
//| Rsioma/MaRsioma X sig () +alertsD email: bartlomiej.gorski@gmail.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/ Kalenzo|bartlomiej.gorski@gmail.com "
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_minimum -20
#property indicator_maximum 110
#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_color7 Aqua //DeepSkyBlue
#property indicator_color8 DeepPink //Crimson
//
#property indicator_width1 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width7 1
#property indicator_width8 1
//
#property indicator_level1 100
#property indicator_level2 80 //76.4
#property indicator_level3 70 //61.8
#property indicator_level4 50
#property indicator_level5 30 //38.2
#property indicator_level6 20 //23.6
#property indicator_levelcolor DarkSlateGray
//------------------------------------------
//---- input parameters
extern int RSIOMA = 14;
extern int RSIOMA_MODE = MODE_EMA;
extern int RSIOMA_PRICE = PRICE_CLOSE;
extern int Ma_RSIOMA = 21;
extern int Ma_RSIOMA_MODE = MODE_EMA;
extern double SellTrigger_OBLevel = 80.00;
extern double BuyTrigger_OSLevel = 20.00;
extern color SellTriggerLevelColor = DodgerBlue;
extern color BuyTriggerLevelColor = Magenta;
extern double MainTrend_OBLevel = 70.00;
extern double MainTrend_OSLevel = 30.00;
extern color MainTrend_OBLevelColor = Green;
extern color MainTrend_OSLevelColor = Red;
extern double MajorTrend = 50;
extern color marsiomaXupSigColor = Aqua; //DeepSkyBlue
extern color marsiomaXdnSigColor = DeepPink; //Crimson
extern int BarsToCount = 1500;
extern bool SoundAlerts = false; //Alerts
extern int SoundAlertsDelay_Bars = 0;
extern bool BoxAlerts = true;
extern bool EmailAlerts = false;
extern int AlertsDelay_Bars = 1;
extern bool RSIOMA_MaRsiomaCross = true;
extern bool RSIOMA_TriggerLevelCross = true;
extern bool RSIOMA_MainTrendLevelCross = false;
extern string AlertsSoundFile = "alert2.wav";
datetime TimeStamp, TimeStamp1, TimeStamp2;
datetime TimeStampS, TimeStampS1, TimeStampS2;
//---- buffers
//
//
// "indexes"
//
double MABuffer1[];
double RSIBuffer1[];
//
//
// indexes
//
//
double RSIBuffer[];
double bdn[];
double bup[];
double sdn[];
double sup[];
double marsioma[];
double marsiomaXupSig[];
double marsiomaXdnSig[];
//
//
//
//
//
int correction;
datetime lastBarTime;
string short_name;
//+------------------------------------------------------------------+
int init()
{
short_name = StringConcatenate("RSIOMA [",RSIOMA,"] (",Ma_RSIOMA,")");
IndicatorShortName(short_name);
//
//
//
//
//
SetIndexBuffer(0,RSIBuffer);
SetIndexBuffer(2,bup);
SetIndexBuffer(1,bdn);
SetIndexBuffer(3,sdn);//Magneta
SetIndexBuffer(4,sup);//DodgerBlue
SetIndexBuffer(5,marsioma);
SetIndexBuffer(6,marsiomaXupSig);
SetIndexBuffer(7,marsiomaXdnSig);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexStyle(3,DRAW_HISTOGRAM);
SetIndexStyle(4,DRAW_HISTOGRAM);
SetIndexStyle(6,DRAW_ARROW);
SetIndexStyle(7,DRAW_ARROW);
SetIndexArrow(6,159);
SetIndexArrow(7,159);
SetIndexLabel(0,"Rsioma("+RSIOMA+")");
SetIndexLabel(5,"MaRsioma("+Ma_RSIOMA+")");
SetIndexLabel(1,"TrendDn");
SetIndexLabel(2,"TrendUp");
SetIndexLabel(6,"UpXsig");
SetIndexLabel(7,"DnXsig");
//
//
// additional buffer(s)
//
//
correction = RSIOMA+RSIOMA+Ma_RSIOMA;
BarsToCount = MathMin(Bars,MathMax(BarsToCount,300));
ArrayResize( MABuffer1 ,BarsToCount+correction);
ArrayResize( RSIBuffer1,BarsToCount+correction);
ArraySetAsSeries(MABuffer1 ,true);
ArraySetAsSeries(RSIBuffer1,true);
lastBarTime = EMPTY_VALUE;
//
//
//
//
//
return(0);
}
//+------------------------------------------------------------------+
int start()
{
static bool init=false;
int counted_bars=IndicatorCounted();
int limit,i=0;
//
//
//
//
//
if(!init) {
init=true;
drawLine(BuyTrigger_OSLevel,"BuyTrigger", BuyTriggerLevelColor);
drawLine(SellTrigger_OBLevel,"SellTrigger", SellTriggerLevelColor);
drawLine(MainTrend_OBLevel,"MainTrendLong", MainTrend_OBLevelColor);
drawLine(MainTrend_OSLevel,"MainTrendShort",MainTrend_OSLevelColor);
}
//
//
//
//
//
if(counted_bars<0) return(-1);
if(lastBarTime != Time[0]) {
lastBarTime = Time[0];
counted_bars = 0;
}
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
limit=MathMin(limit,BarsToCount+correction);
//
//
//
//
//
for(i=limit;i>=0;i--)
MABuffer1[i] = iMA(Symbol(),0,RSIOMA,0,RSIOMA_MODE,RSIOMA_PRICE,i);
for(i=limit;i>=0;i--)
RSIBuffer1[i] = iRSIOnArray(MABuffer1,0,RSIOMA,i);
for(i=limit;i>=0;i--)
{
RSIBuffer[i]= RSIBuffer1[i];
marsioma[i] = iMAOnArray(RSIBuffer1,0,Ma_RSIOMA,0,Ma_RSIOMA_MODE,i);
//
//
//
//
//
bup[i] = EMPTY_VALUE; bdn[i] = EMPTY_VALUE;
sup[i] = EMPTY_VALUE; sdn[i] = EMPTY_VALUE;
if(RSIBuffer[i] > 50) bup[i] = 6;
if(RSIBuffer[i] < 50) bdn[i] = -6;
if(RSIBuffer[i] > MainTrend_OBLevel) bup[i] = 12;
if(RSIBuffer[i] < MainTrend_OSLevel) bdn[i] = -12;
if(RSIBuffer[i]<20 && RSIBuffer[i]>RSIBuffer[i+1]) sup[i] = -3;
if(RSIBuffer[i]>80 && RSIBuffer[i]<RSIBuffer[i+1]) sdn[i] = 4;
if(RSIBuffer[i]>20 && RSIBuffer[i+1]<=20) sup[i] = 5;
if(RSIBuffer[i+1]>=80 && RSIBuffer[i]<80) sdn[i] = -5;
if(RSIBuffer[i+1]<=MainTrend_OSLevel && RSIBuffer[i]>MainTrend_OSLevel) sup[i] = 12;
if(RSIBuffer[i+1]>=MainTrend_OBLevel && RSIBuffer[i]<MainTrend_OBLevel ) sdn[i] = -12;
marsiomaXupSig[i] = EMPTY_VALUE;
marsiomaXdnSig[i] = EMPTY_VALUE;
if(RSIBuffer[i+1]<=marsioma[i+1] && RSIBuffer[i]>marsioma[i]) marsiomaXupSig[i] = -11;
if(RSIBuffer[i+1]>=marsioma[i+1] && RSIBuffer[i]<marsioma[i]) marsiomaXdnSig[i] = 11;
//-------------- Alerts -------------
// sound alerts
if (RSIBuffer[SoundAlertsDelay_Bars+1]<=marsioma[SoundAlertsDelay_Bars+1]
&& RSIBuffer[SoundAlertsDelay_Bars] > marsioma[SoundAlertsDelay_Bars]
&& TimeStampS != Time[0]&& Volume[0]>1)
{
if (SoundAlerts) PlaySound(AlertsSoundFile);
TimeStampS = Time[0];
}
if (RSIBuffer[SoundAlertsDelay_Bars+1]>=marsioma[SoundAlertsDelay_Bars+1]
&& RSIBuffer[SoundAlertsDelay_Bars] < marsioma[SoundAlertsDelay_Bars]
&& TimeStampS != Time[0]&& Volume[0]>1)
{
if (SoundAlerts) PlaySound(AlertsSoundFile);
TimeStampS = Time[0];
}
if (RSIBuffer[SoundAlertsDelay_Bars+1]>=SellTrigger_OBLevel
&& RSIBuffer[SoundAlertsDelay_Bars] < SellTrigger_OBLevel
&& TimeStampS1 != Time[0]&& Volume[0]>1)
{
if (SoundAlerts) PlaySound(AlertsSoundFile);
TimeStampS1 = Time[0];
}
if (RSIBuffer[SoundAlertsDelay_Bars+1]<=BuyTrigger_OSLevel
&& RSIBuffer[SoundAlertsDelay_Bars] > BuyTrigger_OSLevel
&& TimeStampS1 != Time[0]&& Volume[0]>1)
{
if (SoundAlerts) PlaySound(AlertsSoundFile);
TimeStampS1 = Time[0];
}
if (RSIBuffer[SoundAlertsDelay_Bars+1]>=MainTrend_OBLevel
&& RSIBuffer[SoundAlertsDelay_Bars] < MainTrend_OBLevel
&& TimeStampS2 != Time[0]&& Volume[0]>1)
{
if (SoundAlerts) PlaySound(AlertsSoundFile);
TimeStampS2 = Time[0];
}
if (RSIBuffer[SoundAlertsDelay_Bars+1]<=MainTrend_OSLevel
&& RSIBuffer[SoundAlertsDelay_Bars] > MainTrend_OSLevel
&& TimeStampS2 != Time[0]&& Volume[0]>1)
{
if (SoundAlerts) PlaySound(AlertsSoundFile);
TimeStampS2 = Time[0];
}
//-- Box with e-male
string alertmessage = "RSIOMA " +Symbol()+" chart M"+Period()+" Bid price "+DoubleToStr(Bid,4)+" " ;
if (RSIBuffer[AlertsDelay_Bars+1]<=marsioma[AlertsDelay_Bars+1]
&& RSIBuffer[AlertsDelay_Bars] > marsioma[AlertsDelay_Bars]
&& TimeStamp != Time[0]&& Volume[0]>1)
{
alertmessage = (alertmessage +" RSIOMA_Crossed_MaRsioma_Up");
if (BoxAlerts && RSIOMA_MaRsiomaCross) Alert (alertmessage);
if (EmailAlerts) SendMail (alertmessage,"");
TimeStamp = Time[0];
}
if (RSIBuffer[AlertsDelay_Bars+1]>=marsioma[AlertsDelay_Bars+1]
&& RSIBuffer[AlertsDelay_Bars] < marsioma[AlertsDelay_Bars]
&& TimeStamp != Time[0]&& Volume[0]>1)
{
alertmessage = (alertmessage +" RSIOMA_Crossed_MaRsioma_Dn");
if (BoxAlerts && RSIOMA_MaRsiomaCross) Alert (alertmessage);
if (EmailAlerts) SendMail (alertmessage,"");
TimeStamp = Time[0];
}
if (RSIBuffer[AlertsDelay_Bars+1]>=SellTrigger_OBLevel
&& RSIBuffer[AlertsDelay_Bars] < SellTrigger_OBLevel
&& TimeStamp1 != Time[0]&& Volume[0]>1)
{
alertmessage = (alertmessage +" RSIOMA_Crossed_SellTriggerOBLevel_Dn");
if (BoxAlerts && RSIOMA_TriggerLevelCross) Alert (alertmessage);
if (EmailAlerts) SendMail (alertmessage,"");
TimeStamp1 = Time[0];
}
if (RSIBuffer[AlertsDelay_Bars+1]<=BuyTrigger_OSLevel
&& RSIBuffer[AlertsDelay_Bars] > BuyTrigger_OSLevel
&& TimeStamp1 != Time[0]&& Volume[0]>1)
{
alertmessage = (alertmessage +" RSIOMA_Crossed_BuyTriggerOSLevel_Up");
if (BoxAlerts && RSIOMA_TriggerLevelCross) Alert (alertmessage);
if (EmailAlerts) SendMail (alertmessage,"");
TimeStamp1 = Time[0];
}
if (RSIBuffer[AlertsDelay_Bars+1]>=MainTrend_OBLevel
&& RSIBuffer[AlertsDelay_Bars] < MainTrend_OBLevel
&& TimeStamp2 != Time[0]&& Volume[0]>1)
{
alertmessage = (alertmessage +" RSIOMA_Crossed_MainTrend_OBLevel_Dn");
if (BoxAlerts && RSIOMA_MainTrendLevelCross) Alert (alertmessage);
if (EmailAlerts) SendMail (alertmessage,"");
TimeStamp2 = Time[0];
}
if (RSIBuffer[AlertsDelay_Bars+1]<=MainTrend_OSLevel
&& RSIBuffer[AlertsDelay_Bars] > MainTrend_OSLevel
&& TimeStamp2 != Time[0]&& Volume[0]>1)
{
alertmessage = (alertmessage +" RSIOMA_Crossed_MainTrend_OSLevel_Up");
if (BoxAlerts && RSIOMA_MainTrendLevelCross) Alert (alertmessage);
if (EmailAlerts) SendMail (alertmessage,"");
TimeStamp2 = Time[0];
}
//-----
//
//
//
//
//
}
for (i=0;i<indicator_buffers;i++) SetIndexDrawBegin(i,Bars-BarsToCount);
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