+RSI-TC

This indicator is designed to help traders identify potential entry points by combining three distinct technical analysis concepts: Momentum (RSI), Volatility (Bollinger Bands and Keltner Channels), and Trend Direction. By weaving these together, the tool seeks to filter out "false" signals and highlight moments where price action is gaining significant strength or breaking out of a period of consolidation.

Core Components of the Logic

1. Momentum Tracking (The Two-Tone RSI) At its foundation, the script uses the Relative Strength Index (RSI) to measure the speed and change of price movements. However, it applies a "Two-tone" logic to this data. Instead of just showing a single line, it identifies specific zones where the momentum shifts from bearish to bullish (or vice versa). This helps in visualizing whether the current price movement has enough "velocity" to sustain a trend.

2. The Squeeze Detection (Volatility Analysis) One of the most sophisticated parts of this script is its ability to detect a "Squeeze." It does this by comparing two different volatility envelopes: Bollinger Bands and Keltner Channels.

  • When the Bollinger Bands contract inside the Keltner Channels, it indicates that market volatility is extremely low—essentially, the market is "coiled" like a spring.
  • The script identifies these moments as high-probability zones for an upcoming explosive move in either direction.

3. The Breakout Signal (Execution Logic) The indicator does not simply tell you when the market is quiet; it looks for the moment that quiet period ends. It generates specific Buy and Sell signals based on a combination of factors:

  • The Squeeze Release: It monitors for a breakout immediately following a "Squeeze" state.
  • Momentum Confirmation: It checks if the RSI is positioned above or below the 50-level to ensure the move aligns with the prevailing momentum.
  • Band Expansion: It looks for specific behaviors in the Bollinger Bands to confirm that the price is moving aggressively enough to be considered a valid breakout rather than just a minor fluctuation.

Visual and Alert System

To make this data actionable for the user, the script provides:

  • Dynamic Visuals: It plots distinct arrows on the chart to signal potential Buy and Sell opportunities.
  • Trend Highlighting: By using different colors/lines for RSI variations, it helps the trader quickly identify the "tone" of the current market.
  • Real-time Notifications: When the specific criteria for a breakout are met (Squeeze release + Momentum + Band Expansion), the script can trigger an audible alert and a pop-up notification, allowing traders to react instantly without having to watch the screen constantly.

Summary for the Trader

In simple terms, this tool looks for markets that are "holding their breath" (the Squeeze), then watches for the moment they "exhale" (the Breakout). It uses momentum to ensure you aren't catching a dying move, aiming to provide clear, actionable signals on when price is most likely to transition from sideways movement into a strong trend.

Indicators Used
Relative strength indexMoving average indicatorBollinger bands indicatorIndicator of the average true range
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
16 Views
2 Downloads
0 Favorites
+RSI-TC
/*

*********************************************************************
          
                 RSI with Trend Catcher signal
                      
                              
                          by Matsu
              based on codes from various sources
                  
*********************************************************************

*/


#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Black
#property indicator_color4 Black
#property indicator_color5 Black

#property indicator_level1 70
#property indicator_level2 50
#property indicator_level3 30

int       BBPrd=20;
double    BBDev=2.0;
int       SBPrd=13;
int       SBATRPrd=21;
double    SBFactor=2;
int       SBShift=1;
extern int       RSIPeriod=21;
extern int       BullLevel=50;
extern int       BearLevel=50;
extern bool      AlertOn = true;

double RSI[];
double DnRSI[];
double Buy[];
double Sell[];
double Squeeze[];



int init() 
{

   IndicatorBuffers(5);
   
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,RSI);
   
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,DnRSI);
   
   SetIndexStyle(2,DRAW_ARROW,STYLE_SOLID);
   SetIndexArrow(2,159);
   SetIndexBuffer(2,Buy);
   
   SetIndexStyle(3,DRAW_ARROW,STYLE_SOLID);
   SetIndexArrow(3,159);
   SetIndexBuffer(3,Sell);
   
   SetIndexStyle(4,DRAW_ARROW,STYLE_SOLID);
   SetIndexArrow(4,159);
   SetIndexBuffer(4,Squeeze);
      
   IndicatorShortName("RSI("+RSIPeriod+")");
   IndicatorDigits(2);
   
   return(0);
   
}



int start() 
{

   int counted_bars=IndicatorCounted();
   int shift,limit,ob,os;
   double BBMA, SBMA, TopBBand, BotBBand, TopBBandPrev, BotBBandPrev, TopSBand, BotSBand;
   bool dn = false;
   double BuyNow, BuyPrevious, SellNow, SellPrevious;
   static datetime prevtime = 0;
   
      
   if (counted_bars<0) return(-1);
   if (counted_bars>0) counted_bars--;
   limit=Bars-31;
   if(counted_bars>=31) limit=Bars-counted_bars-1;

   for (shift=limit;shift>=0;shift--)   
   {
            
      RSI[shift]=iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,shift);
      ob = indicator_level1;
      os = indicator_level3;
      
      // ========= Two-tone RSI
      
      if (dn==true)
      {
         if (RSI[shift]>BullLevel) 
         {
            dn=false;
            DnRSI[shift]=EMPTY_VALUE;
         }
         else
         {
            dn=true;
            DnRSI[shift]=RSI[shift];
         }

      }
      else
      {
         if (RSI[shift]<BearLevel) 
         {
            dn=true;
            DnRSI[shift]=RSI[shift];
         }
         else
         {
            dn=false;
            DnRSI[shift]=EMPTY_VALUE;
         }
           
      }
      
      // ========= Two-tone RSI Ends
      
      // ========= Squeeze Signals
      
      BBMA     = iMA(NULL,0,BBPrd,0,MODE_SMA,PRICE_CLOSE,shift);
      SBMA     = iMA(NULL,0,SBPrd,0,MODE_EMA,PRICE_CLOSE,shift+SBShift);
      TopBBand = iBands(NULL,0,BBPrd,BBDev,0,PRICE_CLOSE,MODE_UPPER,shift);
	   BotBBand = iBands(NULL,0,BBPrd,BBDev,0,PRICE_CLOSE,MODE_LOWER,shift);
      TopSBand = SBMA + (SBFactor * iATR(NULL,0,SBATRPrd,shift+SBShift));
      BotSBand = SBMA - (SBFactor * iATR(NULL,0,SBATRPrd,shift+SBShift));
      TopBBandPrev = iBands(NULL,0,BBPrd,BBDev,0,PRICE_CLOSE,MODE_UPPER,shift+1);
	   BotBBandPrev = iBands(NULL,0,BBPrd,BBDev,0,PRICE_CLOSE,MODE_LOWER,shift+1);
      
      if (TopBBand<TopSBand && BotBBand>BotSBand) Squeeze[shift]=50;
      
      // ========= Squeeze Signals Ends
      
      // ========= BB Breakout Signals
      
      //if(Squeeze[shift+2]==50 && RSI[shift]>50 && BotBBand<BotSBand) 
      if((Squeeze[shift+2]==50 || Squeeze[shift+1]==50) && RSI[shift]>50 && BotBBand<BotSBand) 
      {
         Buy[shift]=ob;
         Sell[shift]=EMPTY_VALUE;
      } 
      else 
      //if(Squeeze[shift+2]==50 && RSI[shift]<50 && TopBBand>TopSBand) 
      if((Squeeze[shift+2]==50 || Squeeze[shift+1]==50) && RSI[shift]<50 && TopBBand>TopSBand) 
      {
         Buy[shift]=EMPTY_VALUE;
         Sell[shift]=os;
      }
      else
      if(Buy[shift+1]==ob && BotBBand<BotBBandPrev && RSI[shift]>50)
      {
         Buy[shift]=ob;
         Sell[shift]=EMPTY_VALUE;
      } 
      else
      if(Sell[shift+1]==os && TopBBand>TopBBandPrev && RSI[shift]<50)
      {
         Buy[shift]=EMPTY_VALUE;
         Sell[shift]=os;
      }
      else
      {
         Buy[shift]=EMPTY_VALUE;
         Sell[shift]=EMPTY_VALUE;
      }
      
      // ========= BB Breakout Signals Ends
      
   }      
         

   // ======= Alert =========

   if(AlertOn)
   {
      if(prevtime == Time[0]) 
      {
         return(0);
      }
      prevtime = Time[0];
   
      BuyNow = Buy[0];
      BuyPrevious = Buy[1];
      SellNow = Sell[0];
      SellPrevious = Sell[1];
   
      if((BuyNow ==ob) && (BuyPrevious ==EMPTY_VALUE) )
      {
         Alert(Symbol(), " M", Period(), " Buy Alert");
      }
      else   
      if((SellNow ==os) && (SellPrevious ==EMPTY_VALUE) )
      {
         Alert(Symbol(), " M", Period(), " Sell Alert");
      }
         
      IndicatorShortName("RSI("+RSIPeriod+") (Alert on)");

   }

   // ======= Alert Ends =========


   
   return(0);
   
}



Comments