This tool is a technical analysis indicator designed to help traders identify the strength and direction of market trends by calculating a specialized momentum oscillator. It operates by analyzing price movements over time and filtering out "noise" to provide a clearer picture of whether a market is trending up, down, or moving sideways.
Core Logic Overview
The indicator functions through a multi-layered calculation process that moves from raw price data to a smoothed, final visual output. Here is the step-by-step breakdown of how it processes information:
1. Measuring Movement (Momentum) The script begins by looking at the difference between the current closing price and the previous closing price. This tells the tool how much the price moved in a single step. It also calculates the "Absolute Momentum," which measures the size of that move regardless of whether it was up or down (the raw magnitude of the change).
2. Smoothing the Data Raw market data can be very jagged and erratic. To make the information more readable, the script applies two layers of Exponential Moving Averages (EMA) to both the standard momentum and the absolute momentum. By applying these averages, the tool creates a smoother "flow" of the data, reacting more predictably to sustained trends rather than sudden, minor price spikes.
3. The TSI Calculation Once the data is smoothed, the script calculates the primary indicator line (TSI). It does this by dividing the smoothed momentum by the smoothed absolute momentum and scaling it to a percentage-based system.
- This allows the tool to show not just the direction of the price, but the relative strength of that direction compared to the overall volatility of the market.
4. The Signal Line Finally, the script applies one last smoothing layer to the TSI result to create a "Signal" line. This secondary line acts as a reference point. When the main indicator moves significantly away from or toward this signal line, it provides traders with visual cues regarding potential trend shifts or momentum exhaustion.
Visual Representation
The resulting output is displayed in a separate window on your chart, scaled between -100 and 100:
- TSI Line: Represents the primary momentum flow.
- Signal Line: Acts as the baseline for the TSI, helping to identify crossovers or divergences.
- Reference Levels: The tool includes horizontal levels (at 0, 50, and -50) to help you quickly identify overbought, oversold, or neutral market conditions.
//+------------------------------------------------------------------+
//| TSI-Osc.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 Blue
#property indicator_color2 Red
#property indicator_maximum 100
#property indicator_minimum -100
#property indicator_level1 0
#property indicator_level2 50
#property indicator_level3 -50
//---- input parameters
// M5 and M15 , 8,8,8
// M30 7,7,7
// H1 and H4 6,6,6
extern int First_R = 7;
extern int Second_S = 7;
extern int SignalPeriod = 7;
//---- 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("TSIOsc" + "(" + First_R + "," + Second_S + "," + SignalPeriod + ")");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
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]);
//MTM_Buffer[i]=((High[i]+Low[i])/2)-((High[i+1]+Low[i+1])/2);
//MTM_Buffer[i]=(((Close[i]-Close[i+1])/Close[i+1])+Point);
//MTM_Buffer[i]=iMomentum(NULL,0,1,PRICE_CLOSE,i)-iMomentum(NULL,0,1,PRICE_CLOSE,i+1);
//MTM_Buffer[i]=iMomentum(NULL,0,1,PRICE_CLOSE,i)-iMomentum(NULL,0,1,PRICE_CLOSE,i+1);
//MTM_Buffer[i]=iMomentum(NULL,0,1,PRICE_CLOSE,i)-iMomentum(NULL,0,1,PRICE_CLOSE,i+1);
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_EMA, i);
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments