RSI-TC_NEW[1]

Download script
RSI-TC_NEW[1]

This technical indicator is designed to help traders identify high-probability market entries by combining three distinct types of market analysis: momentum, volatility compression, and trend breakouts. Instead of relying on a single metric, it synchronizes these three elements to filter out "market noise" and highlight significant price movements.

Core Components of the Logic

1. Momentum Analysis (Two-Tone RSI) The script utilizes the Relative Strength Index (RSI) to measure the speed and change of price movements. To make this more readable, it employs a "Two-Tone" logic:

  • It tracks whether the market is currently in a bullish or bearish state based on pre-defined levels.
  • The visual output distinguishes between these states, helping traders see at a glance whether the current momentum is trending upward or downward rather than just looking at a generic line.

2. Volatility Compression (The Squeeze) One of the most sophisticated parts of this script is its ability to detect a "Squeeze." It compares two different volatility indicators: Bollinger Bands and Keltner Channels.

  • When the Bollinger Bands contract inside the Keltner Channels, it signals that market volatility is extremely low.
  • In trading terms, this represents a "coiled spring" effect—a period of consolidation where the market is preparing for a significant explosive move in either direction.

3. Trend Breakout Signals The script doesn't just signal when a squeeze happens; it waits for the breakout. It looks for specific conditions where the price "breaks out" of the compressed zone. It identifies these opportunities by checking:

  • If a squeeze was recently active.
  • If the RSI momentum confirms the direction (above or below the 50 midline).
  • If the price bands have actually expanded in the direction of that momentum.

Visual Signals and Alerts

The indicator communicates its findings directly on your chart using specific visual cues:

  • Arrows: The script places distinct arrows on the chart to highlight confirmed Buy and Sell opportunities. These appear when a volatility squeeze is followed by a momentum-confirmed breakout.
  • Alert System: To ensure you don't have to watch the screen constantly, the script includes an automated alert system. It monitors the price action in real-time and triggers a notification (popup/sound) the moment a new Buy or Sell signal is generated, specifically designed to notify you of the very first arrow of a trend shift.

Summary for the Trader

In simple terms, this script acts as a filter. It ignores sideways markets where there is no clear direction and instead focuses on the moments when the market has been "quiet" (Squeeze) and suddenly "explodes" (Breakout) with significant strength (RSI). This provides a more disciplined approach to entering trades by ensuring that momentum and volatility are moving in the same direction at the same time.

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
14 Views
1 Downloads
0 Favorites
RSI-TC_NEW[1]
/*

*********************************************************************
          
                 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 Lime
#property indicator_color4 Red
#property indicator_color5 Gold

#property indicator_level1 60
#property indicator_level2 50
#property indicator_level3 40

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[1];
      BuyPrevious = Buy[2];
      SellNow = Sell[1];
      SellPrevious = Sell[2];
   
      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