This tool is a technical analysis indicator designed to help traders identify the strength and direction of market momentum. It operates by analyzing price changes over time and filtering out "market noise" to provide a clearer picture of whether an upward or downward trend is gaining power.
How the Logic Works
The script processes market data through a multi-step calculation sequence to arrive at its final visual output:
1. Measuring Raw Momentum The logic starts by calculating the immediate change in price between the current candle and the previous one. This gives the tool a "raw" look at whether the price is moving up or down.
2. Calculating Absolute Movement To understand the sheer magnitude of price movement regardless of direction, the script also calculates the absolute value of that momentum. This allows the tool to distinguish between a small move and a large, high-energy move.
3. Smoothing the Data (The "Filtering" Phase) Raw market data is often erratic. To make the information usable, the script applies several layers of Exponential Moving Averages (EMA).
- It smooths the raw momentum to identify the primary direction.
- It smooths the absolute movement to identify the overall volatility level.
- It performs a second round of smoothing on both sets of data to ensure the lines move fluidly rather than jumping around with every minor price tick.
4. Generating the TSI and Signal Lines The final core calculation takes the smoothed momentum and divides it by the smoothed absolute movement, then multiplies it by 100. This produces the TSI (True Strength Index) line.
- This result tells you how much of the total price movement is happening in one specific direction relative to the total volatility.
Finally, the script applies one last smoothing pass to create a Signal Line. By comparing the main TSI line against this Signal Line, traders can look for "crossovers"—points where the momentum shifts significantly enough to suggest a potential change in market trend.
Summary of Visual Output
The indicator provides two primary lines on a separate window:
- The Main Line (TSI): Shows the current strength of the trend.
- The Signal Line: Acts as a benchmark; when the main line crosses this signal, it often highlights potential shifts in momentum.
//+------------------------------------------------------------------+
//| TSI.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 White
#property indicator_color2 Red
#property indicator_maximum 100
#property indicator_minimum -100
#property indicator_level1 0
//---- input parameters
extern int First_R=8;
extern int Second_S=5;
extern int SignalPeriod=5;
extern int Mode_Smooth=1;
//---- buffers
double TSI_Buffer[];
double SignalBuffer[];
double MTM_Buffer[];
double EMA_MTM_Buffer[];
double EMA2_MTM_Buffer[];
double ABSMTM_Buffer[];
double EMA_ABSMTM_Buffer[];
double EMA2_ABSMTM_Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(8);
SetIndexBuffer(2, MTM_Buffer);
SetIndexBuffer(3, EMA_MTM_Buffer);
SetIndexBuffer(4, EMA2_MTM_Buffer);
SetIndexBuffer(5, ABSMTM_Buffer);
SetIndexBuffer(6, EMA_ABSMTM_Buffer);
SetIndexBuffer(7, EMA2_ABSMTM_Buffer);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,TSI_Buffer);
SetIndexLabel(0,"TSI");
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,SignalBuffer);
SetIndexLabel(1,"Signal");
IndicatorShortName("TSI"+"("+First_R+","+Second_S+","+SignalPeriod+")");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int limit,i;
limit=Bars-counted_bars-1;
for (i=Bars-1;i>=0;i--)
{
MTM_Buffer[i]=Close[i]-Close[i+1];//iMomentum(NULL,0,1,PRICE_CLOSE,i);
ABSMTM_Buffer[i]=MathAbs(MTM_Buffer[i]);
}
for (i=Bars-1;i>=0;i--)
{
EMA_MTM_Buffer[i]=iMAOnArray(MTM_Buffer,0,First_R,0,MODE_EMA,i);
EMA_ABSMTM_Buffer[i]=iMAOnArray(ABSMTM_Buffer,0,First_R,0,MODE_EMA,i);
}
for (i=Bars-1;i>=0;i--)
{
EMA2_MTM_Buffer[i]=iMAOnArray(EMA_MTM_Buffer,0,Second_S,0,MODE_EMA,i);
EMA2_ABSMTM_Buffer[i]=iMAOnArray(EMA_ABSMTM_Buffer,0,Second_S,0,MODE_EMA,i);
}
for (i=limit;i>=0;i--)
{
TSI_Buffer[i]=100.0*EMA2_MTM_Buffer[i]/EMA2_ABSMTM_Buffer[i];
}
for (i=limit;i>=0;i--)
{
SignalBuffer[i]=iMAOnArray(TSI_Buffer,0,SignalPeriod,0,Mode_Smooth,i);
}
//---- TODO: add your code here
//----
return(0);
}
//+------------------------------------------------------------------+
Comments