Author: Written by Rosh
TDI-2_001

This script is designed as a technical analysis tool for the Forex market, specifically created to help traders visualize and identify current market trends. Instead of looking at raw price action alone, it processes historical data to smooth out "market noise," allowing for a clearer view of whether the price is moving upward or downward over a specific period.

Core Logic and Methodology

The tool operates by breaking down price movement into several layers of calculation:

1. Momentum Detection The logic begins by measuring the difference between the current closing price and the closing price from a set number of bars ago (defined by the user). This tells the script how much the price has moved in a specific timeframe. It then converts these movements into absolute values, meaning it tracks the "strength" of the move regardless of whether that move was positive or negative.

2. Trend Smoothing To ensure the data isn't jumping around too erratically, the script applies a Moving Average to these momentum figures. This stabilizes the information, creating a more reliable path for the trader to follow. It essentially "filters" out the minor fluctuations of the market to reveal the underlying direction.

3. Directional Calculation The script calculates two primary visual elements:

  • Trend Direction Index: This is the main line that represents the smoothed momentum. It helps traders see the overall "flow" of the market.
  • Directional Component: By comparing different averages of the absolute momentum values, the script determines the specific orientation of the trend.

How it Works for the Trader

The primary goal of this logic is to provide a visual representation of market "velocity."

  • When the values are increasing, it indicates strengthening momentum in a specific direction.
  • By comparing the calculated averages against a zero baseline, the indicator helps identify when a trend is gaining strength, losing steam, or potentially reversing.

In simple terms, rather than just showing you what the price is, this script shows you how fast and in what direction the market is moving. It takes complex history, strips away the distractions, and presents a smoothed curve that highlights the prevailing trend.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
15 Views
0 Downloads
0 Favorites
TDI-2_001
//+------------------------------------------------------------------+
//|                                                        TDI-2.mq4 |
//|  Trend Direction Index         Ñèñòåìíàÿ òîðãîâëÿ íà ðûíêå Forex |
//|                           http://forexsystems.ru/phpBB/index.php |
//+------------------------------------------------------------------+
// Èäåÿ èç ForexMagazin #58 , âòîðàÿ âåðñèÿ
#property copyright "Written by Rosh"
#property link      "http://forexsystems.ru/phpBB/index.php"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DarkBlue
#property indicator_color2 Red
#property indicator_level1 0.0
//---- input parameters
extern int PeriodTDI=20;
//---- buffers
double TDI_Buffer[];
double Direction_Buffer[];
// ---- temporary buffers
double MomBuffer[];
double MomAbsBuffer[];
double MomSumBuffer[];
double MomSumAbsBuffer[];
double MomAbsSumBuffer[];
double MomAbsSum2Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(8);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,TDI_Buffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Direction_Buffer);
   SetIndexLabel(0,"Trend Direction Index");
   SetIndexLabel(1,"Direction");
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MomBuffer);
   SetIndexBuffer(3,MomAbsBuffer);
   SetIndexBuffer(4,MomSumBuffer);
   SetIndexBuffer(5,MomSumAbsBuffer);
   SetIndexBuffer(6,MomAbsSumBuffer);   
   SetIndexBuffer(7,MomAbsSum2Buffer);  
   IndicatorShortName("TDI"+"("+PeriodTDI+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit,i;
   int    counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) limit=Bars-counted_bars;
   if (counted_bars==0) 
      {
      limit=Bars-PeriodTDI;
      for (i=Bars-1;i>limit;i--) {MomBuffer[i]=0.0;MomAbsBuffer[i]=0.0;}
      
      }


   limit--;


//---- TODO: add your code here
   for(i=limit; i>=0; i--)
      {
      MomBuffer[i]=Close[i]-Close[i+PeriodTDI];
      MomAbsBuffer[i]=MathAbs(MomBuffer[i]);
      }
   for(i=limit; i>=0; i--)
      {
      MomSumBuffer[i]=iMAOnArray(MomBuffer,0,PeriodTDI,0,MODE_SMA,i)*PeriodTDI;
      MomSumAbsBuffer[i]=MathAbs(MomSumBuffer[i]);
      Direction_Buffer[i]=MomSumBuffer[i];
      }

   for(int l=limit; l>=0; l--)
      {
      MomAbsSumBuffer[l]=iMAOnArray(MomAbsBuffer,0,PeriodTDI,0,MODE_SMA,l)*PeriodTDI;
      MomAbsSum2Buffer[l]=iMAOnArray(MomAbsBuffer,0,2*PeriodTDI,0,MODE_SMA,l)*2*PeriodTDI;
      TDI_Buffer[l]=MomSumAbsBuffer[l]-(MomAbsSum2Buffer[l]-MomAbsSumBuffer[l]);
      }
      
//---- done
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments