John Ehlers Instantaneous Trendline

Category: Indicators By: Horance Created: August 27, 2018, 3:37 PM
August 27, 2018, 3:37 PM
Indicators
3 Comments

This is an implementation of John Ehlers’ Instantaneous Trendline, as described in Market Mode Strategies (1999-10-19).

The code has been slightly enhanced to return a Zero Lag exponential moving average, like it was done here.

// Instantaneous Trendline
// Market Mode Strategies
// 1999-10-19 John F. Ehlers
// http://www.jamesgoulding.com/Research_II/Ehlers/Ehlers%20(Market%20Mode%20Strategies).doc

Price = (high+low)/2
Imult = .635
Qmult = .338

If BarIndex > 6 then

	// Detrend Price
	Value3 = Price - Price[7]

	// Compute InPhase and Quadrature components
 	Inphase = 1.25*(Value3[4] - Imult*Value3[2]) + Imult*InPhase[3]
	Quadrature = Value3[2] - Qmult*Value3 + Qmult*Quadrature[2]

	// Use ArcTangent to compute the current phase
	If ABS(InPhase + InPhase[1]) > 0 then
		a = ABS((Quadrature+Quadrature[1]) / (InPhase+InPhase[1]))
		Phase = ATAN(a)
	Endif

	// Resolve the ArcTangent ambiguity
	If InPhase < 0 and Quadrature > 0 then
		Phase = 180 - Phase
	Endif
	If InPhase < 0 and Quadrature < 0 then
		Phase = 180 + Phase
	Endif
	If InPhase > 0 and Quadrature < 0 then
		Phase = 360 - Phase
	Endif

	// Compute a differential phase, resolve phase wraparound, and limit delta phase errors
	DeltaPhase = Phase[1] - Phase
	If Phase[1] < 90 and Phase > 270 then
		DeltaPhase = 360 + Phase[1] - Phase
	Endif
	If DeltaPhase < 7 then
		DeltaPhase = 7
	Endif
	If DeltaPhase > 60 then
		DeltaPhase = 60
	Endif

	// Sum DeltaPhases to reach 360 degrees. The sum is the instantaneous period.
	InstPeriod = 0
	Value4 = 0
	For count = 0 to 40 do
		Value4 = Value4 + DeltaPhase[count]
		If Value4 > 360 and InstPeriod = 0 then
			InstPeriod = count
		Endif
	Next

	// Resolve Instantaneous Period errors and smooth
	If InstPeriod = 0 then
		InstPeriod = InstPeriod[1]
	Endif
	Value5 = .25*InstPeriod + .75*Value5[1]

	// Compute Trendline as simple average over the measured dominant cycle period
	Period = ROUND(Value5)
	Trendline = 0
	For count = 0 to Period + 1 do
		Trendline = Trendline + Price[count]
	Next
	If Period > 0 then
		Trendline = Trendline / (Period + 2)
	Endif

	Value11 = .33*(Price + .5*(Price - Price[3])) + .67*Value11[1]

	If barindex < 26 then
		Trendline = Price
		Value11 = Price
	Endif

Endif

Return Trendline as "TR", Value11 as "ZL"

A more recent formula of Hilbert Transform, described in Squelch those Whipsaws (2000-24-03), can be used, by replacing the beginning of the code with:

If BarIndex > 5 then
 
	// Compute InPhase and Quadrature components
	Value1 = Price - Price[6]
	Value2 = Value1[3]
	Value3 = .75*(Value1 - Value1[6]) + .25*(Value1[2] - Value1[4])
	InPhase = .33*Value2 + .67*InPhase[1]
	Quadrature = .2*Value3 + .8*Quadrature[1]

The attached screenshot shows the Instantaneous Trendline using original description (top) of and the alternative Hilbert Transform formula (bottom).

Download
Filename: Ehlers-Instantaneous-Trendline.itf
Downloads: 333
Horance Senior
This author is like an anonymous function, present but not directly identifiable. More details on this code architect as soon as they exit 'incognito' mode.
Author’s Profile

Comments

Logo Logo
Loading...