RSIOMA_v3_alertsD_002

Author: Copyright � 2007, MetaQuotes Software Corp.
RSIOMA_v3_alertsD_002

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:

  1. Smoothing: It first applies a Moving Average to the price data. This filters out minor "noise" and fluctuations to reveal the underlying price movement.
  2. 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.
  3. 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.

Indicators Used
Moving average indicatorRelative strength indexMoving average indicator
Miscellaneous
Implements a curve of type %1It plays sound alerts
13 Views
0 Downloads
0 Favorites
RSIOMA_v3_alertsD_002
//+--------------------------------------------------------------------------------+
//|      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