Author: Copyright (c) 2009,KurlFX
TASSKlT

This technical indicator is designed to analyze market trends by evaluating momentum and volatility across three different time horizons simultaneously. Rather than relying on a single data point, it synthesizes information from multiple cycles to provide a clearer picture of whether the market is in a sustained move or experiencing temporary fluctuations.

Core Methodology: Multi-Cycle Momentum Analysis

The logic begins by calculating three distinct Average Directional Index (ADX) values. Each of these represents a different "look-back" period (short, medium, and long). By monitoring all three at once, the script ensures that a trend is only considered valid if it is being supported by both immediate price action and broader market momentum.

Signal Validation Logic

The indicator filters market noise through a specific set of criteria:

  • Trend Confirmation: The script looks for "upward" movement in all three ADX cycles simultaneously. If the values from the previous candle are lower than the current candle across all periods, it identifies a strengthening momentum.
  • Strength Thresholds: Even if momentum is increasing, the script checks if these values have crossed specific intensity levels (defined as 35.0 and 30.0). This prevents the indicator from giving signals during "sideways" markets where there is little movement.
  • Directional Identification: Once a strong trend is confirmed, the tool calculates the difference between the positive and negative directional indicators. This determines whether the prevailing force is bullish (upward) or bearish (downward).

Visual Representation on Chart

The indicator translates these calculations into several visual elements to help the user navigate the price action:

  1. Trend Markers: It places specific symbols (arrows/markers) on the chart to highlight the exact point where a new trend begins, specifically at the opening price of a confirmed move.
  2. Price Boundaries: The logic identifies the high and low points of the current candle during a confirmed trend, essentially "framing" the price action to show the range of the move.
  3. Trend Continuity: It uses a tracking mechanism to identify when a trend has ended. If the conditions for a sustained move are no longer met, it marks the "exit" or end-point of that specific movement, helping traders see where a cycle might be concluding.

In summary, this script acts as a sophisticated filter that ignores minor price fluctuations and only highlights high-conviction trends that are backed by multiple layers of momentum data.

Indicators Used
Movement directional index
Miscellaneous
Implements a curve of type %1
10 Views
1 Downloads
0 Favorites
TASSKlT
//KurlFX 23/6/09
//+------------------------------------------------------------------+
//| TADX.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2009,KurlFX"
#define Alvl 35.0
#define Alvl2 30.0
#property  indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Red
#property indicator_color2 SteelBlue
#property indicator_width1 2
#property indicator_width2 2
#property indicator_color3 Indigo
#property indicator_color4 Indigo
#property indicator_color5 Indigo
#property indicator_width3 1
#property indicator_width4 1
//---- indicator parameters
extern int ADXperiod1 = 10;
extern int ADXperiod2 = 14;
extern int ADXperiod3 = 20;
//--
string Unq="TASSKlT",Label;
int MxP,MnP,MdP;
//---- buffers
double To[];
double Tc[];
double ADX1[];
double ADX2[];
double ADX3[];
double Up[];
double Dn[];
double Ex[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//---- name for DataWindow and indicator subwindow label
	MxP=MathMax(MathMax(ADXperiod1,ADXperiod2),ADXperiod3);
	MnP=MathMin(MathMin(ADXperiod1,ADXperiod2),ADXperiod3);
	if(MxP==ADXperiod1)MdP=MathMax(ADXperiod2,ADXperiod3);
	else if(MxP==ADXperiod2)MdP=MathMax(ADXperiod1,ADXperiod3);	
	else MdP=MathMax(ADXperiod2,ADXperiod1);
	Label=Unq+"("+MnP+"/"+MdP+"/"+MxP+")";
	IndicatorBuffers(8);
	SetIndexBuffer(0,To);
	SetIndexBuffer(1,Tc);
	SetIndexBuffer(2,Up);
	SetIndexBuffer(3,Dn);
	SetIndexBuffer(4,Ex);
	SetIndexBuffer(5,ADX1);
	SetIndexBuffer(6,ADX2);
	SetIndexBuffer(7,ADX3);
	SetIndexLabel(0,NULL);
	SetIndexLabel(1,NULL);
	SetIndexStyle(0,DRAW_HISTOGRAM);
	SetIndexStyle(1,DRAW_HISTOGRAM);	
	SetIndexLabel(2,"Up");
	SetIndexLabel(3,"Dn");
	SetIndexLabel(4,"end");
	SetIndexStyle(2,DRAW_ARROW);
	SetIndexStyle(3,DRAW_ARROW);
	SetIndexStyle(4,DRAW_LINE);
	SetIndexArrow(2,225);
	SetIndexArrow(3,226);
	Comment(Label);
//---- initialization done
	return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
	Comment("");
	return(0);
}
//+------------------------------------------------------------------+
//| main                                    |
//+------------------------------------------------------------------+
int start()
{
	int cntbar=IndicatorCounted();
	int limit=Bars-cntbar;
	if(cntbar==0)limit-=MxP;
	for(int i=limit-1;i>=0;i--)
	{
		ADX1[i]=iADX(NULL,0,MnP,PRICE_CLOSE,MODE_MAIN,i);
		ADX2[i]=iADX(NULL,0,MdP,PRICE_CLOSE,MODE_MAIN,i);
		ADX3[i]=iADX(NULL,0,MxP,PRICE_CLOSE,MODE_MAIN,i);
	}
	if(cntbar==0)limit--;
	for(i=limit-1; i>=0; i--)
	{
		bool f1=false,f2=false,f3=false;
		To[i]=EMPTY_VALUE;Tc[i]=EMPTY_VALUE;
		Up[i]=EMPTY_VALUE;Dn[i]=EMPTY_VALUE;Ex[i]=EMPTY_VALUE;
		if(ADX1[i+1]<ADX1[i])f1=true;
		if(ADX2[i+1]<ADX2[i])f2=true;
		if(ADX3[i+1]<ADX3[i])f3=true;
		if(f1&&f2&&f3&&ADX1[i]>Alvl&&ADX2[i]>Alvl2)
		{
			double di=iADX(NULL,0,MnP,PRICE_CLOSE,MODE_PLUSDI,i)
						-iADX(NULL,0,MnP,PRICE_CLOSE,MODE_MINUSDI,i);
			double hi=MathMax(Open[i],Close[i]);
			double lo=MathMin(Open[i],Close[i]);
			double op=Open[i];
			if(di>0)
			{
				To[i]=lo;Tc[i]=hi;
				if(To[i+1]==EMPTY_VALUE)Up[i]=op;
			}
			else
			{
				To[i]=hi;Tc[i]=lo;
				if(To[i+1]==EMPTY_VALUE)Dn[i]=op;
			}
		}
		else
		{
			if(To[i+1]!=EMPTY_VALUE)Ex[i]=Close[i+1];
			else Ex[i]=Ex[i+1];
		}
	}
	return(0);
}
//+------------------------------------------------------------------+

Comments