RSI-TC
Download scriptTechnical Logic Overview: RSI with Trend Catcher
This script is a sophisticated technical analysis tool designed to identify high-probability trading opportunities by combining three distinct market indicators: the Relative Strength Index (RSI), Bollinger Bands, and Keltner Channels. By merging these methods, the script aims to filter out "market noise" and pinpoint specific moments where price momentum is about to break out of a period of consolidation.
Core Components and Behavior
1. Dynamic Momentum Tracking (Two-Tone RSI) The core of the tool utilizes a modified version of the Relative Strength Index (RSI). Instead of showing a standard line, it employs a "two-tone" logic. This means the indicator focuses on specific extremes:
- Bullish Sentiment: It tracks when the market moves into overbought or oversold territory, highlighting sustained momentum.
- Bearish Sentiment: It filters the data to clearly distinguish between upward and downward pressure, providing a clearer visual of which way the trend is leaning at any given moment.
2. Volatility Compression (The "Squeeze") One of the script's primary functions is identifying "Squeezes." It compares two different types of volatility bands: Bollinger Bands and Keltner Channels.
- When these bands contract and nest inside one another, it signals a Squeeze.
- In trading terms, a squeeze indicates that the market is becoming very quiet and compressed. Historically, these periods of low volatility are often followed by explosive price movements in either direction.
3. Breakout Signal Logic The script does not simply alert you when a squeeze happens; it waits for the "breakout." It looks for specific conditions to trigger a Buy or Sell signal:
- Buy Signals: Triggered when the market is coming out of a Squeeze, the RSI confirms bullish momentum (above the 50 midline), and the lower volatility band expands.
- Sell Signals: Triggered when the market comes out of a Squeeze, the RSI confirms bearish momentum (below the 50 midline), and the upper volatility band expands.
User Experience and Notifications
The tool is designed to be visually intuitive on a trading platform:
- Visual Cues: It plots specific arrows on the chart to indicate exactly where the script detects a trend shift.
- Real-Time Alerts: The script includes an automated alert system. When the logic confirms a breakout, it generates a pop-up notification in the trading terminal, ensuring that traders can react instantly even if they are not staring directly at the screen.
Summary of Strategy
The underlying logic follows a "Wait and Strike" philosophy: it identifies periods of extreme market quiet (Squeeze), monitors the internal strength of the price (RSI), and only provides a signal when both indicators align to show a definitive breakout from the previous consolidation.
/*
*********************************************************************
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 85
#property indicator_level2 50
#property indicator_level3 15
int BBPrd=20;
double BBDev=2.0;
int SBPrd=13;
int SBATRPrd=21;
double SBFactor=2;
int SBShift=1;
extern int RSIPeriod=4;
extern int BullLevel=15;
extern int BearLevel=85;
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(), " RSI Buy Alert");
}
else
if((SellNow ==os) && (SellPrevious ==EMPTY_VALUE) )
{
Alert(Symbol(), " M", Period(), " RSI Sell Alert");
}
IndicatorShortName("RSI("+RSIPeriod+") (Alert on)");
}
// ======= Alert Ends =========
return(0);
}
Comments