+RSI-TC_v2

Overview

The RSI-TC is a specialized technical analysis tool designed for the MetaTrader platform. It combines three distinct market theories—Relative Strength Index (RSI), Bollinger Bands, and Keltner Channels—into a single visual interface. The primary goal of this script is to identify high-probability momentum shifts by detecting when market volatility "squeezes" and subsequently breaks out in a specific direction.

Core Logic Components

1. Two-Tone RSI Filtering

The script utilizes the Relative Strength Index (RSI) to measure price velocity. Unlike a standard RSI, this tool employs a "Two-tone" logic. It monitors the momentum to differentiate between bullish and bearish trends:

  • It tracks whether the market is currently in a state of downward pressure or upward movement based on predefined levels.
  • By filtering the RSI data this way, the tool helps visually separate distinct trends, making it easier for traders to see which direction the current momentum is favoring.

2. The "Squeeze" Detection

A significant portion of the logic is dedicated to identifying market consolidation (the "Squeeze"). To do this, the script compares two different types of volatility envelopes:

  • Bollinger Bands: These contract based on standard deviation.
  • Keltner Channels: These expand based on Average True Range (ATR).

When the Bollinger Bands move inside the Keltner Channels, the script identifies a "Squeeze." In market terms, this indicates that price volatility is extremely low and the market is "coiled" like a spring, preparing for an imminent explosive move.

3. Breakout Signal Generation

The most critical function of the script is determining the direction of the breakout once a Squeeze occurs. The logic looks for specific conditions to trigger visual signals (Arrows) and alerts:

  • Buy Signals: Triggered when a Squeeze is detected, the RSI shows strength (above 50), and the lower Bollinger Band begins to expand/contract in a way that suggests upward momentum.
  • Sell Signals: Triggered when a Squeeze is detected, the RSI shows weakness (below 50), and the upper Bollinger Band indicates a downward move.
  • Trend Continuation: The script also monitors previous bars to confirm if an existing breakout trend is continuing or if it has lost momentum.

User Experience and Alerts

To ensure traders do not have to watch the charts constantly, the script includes a notification system. When the logic confirms a valid Buy or Sell signal based on the combination of the Squeeze, RSI momentum, and Band expansion, the tool will trigger a pop-up alert.

This provides a comprehensive "all-in-one" view: it identifies the period of quiet preparation (the Squeeze), confirms the strength of the move (RSI), and highlights the exact moment of the breakout (the Signal).

15 Views
0 Downloads
0 Favorites
+RSI-TC_v2
//+------------------------------------------------------------------+
//|                 +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