//+------------------------------------------------------------------+
//| Instantaneous Trend Line by John Ehlers |
//| Copyright © 2004, Poul_Trade_Forum |
//| Aborigen |
//| http://forex.kbpauk.ru/ |
//+------------------------------------------------------------------+
#property copyright "Poul Trade Forum"
#property link "http://forex.kbpauk.ru/"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- buffers
double TRBuffer[];
double ZLBuffer[];
double Value1[];
double Price[];
double DeltaPhase[];
//----
double Value2, Value3, Value4, Value5[2], Value11[2];
double InPhase[2], Quadrature[2], Phase[2];
double InstPeriod[2], Period_, Trendline;
double test[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//----
IndicatorBuffers(5);
//---- indicator line
SetIndexStyle(0, DRAW_LINE, EMPTY, 1, Red);
SetIndexStyle(1, DRAW_LINE, EMPTY, 1, Blue);
//----
SetIndexBuffer(0, TRBuffer);
SetIndexBuffer(1, ZLBuffer);
SetIndexBuffer(2, Value1);
SetIndexBuffer(3, Price);
SetIndexBuffer(4, DeltaPhase);
//----
SetIndexEmptyValue(0, 0);
SetIndexEmptyValue(1, 0);
//---- name for DataWindow and indicator subwindow label
short_name="InsTrend";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
//----
SetIndexDrawBegin(0, 30);
SetIndexDrawBegin(1, 30);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted(), i, shift, count;
//----
if(counted_bars == 0)
counted_bars = 100;
//----
i = (Bars - counted_bars) - 2;
for(shift = i; shift >= 0; shift--)
{
InPhase[1] = InPhase[0];
Quadrature[1] = Quadrature[0];
Phase[1] = Phase[0];
InstPeriod[1] = InstPeriod[0];
Value5[1] = Value5[0];
Value11[1] = Value11[0];
Price[shift] = (High[shift+1] + Low[shift+1]) / 2;
// {Compute InPhase and Quadrature components}
Value1[shift] = Price[shift] - Price[shift+6];
Value2 = Value1[shift+3];
Value3 =0.75*(Value1[shift] - Value1[shift+6]) +
0.25*(Value1[shift+2] - Value1[shift+4]);
InPhase[0] = 0.33*Value2 + 0.67*InPhase[1];
Quadrature[0] = 0.2*Value3 + 0.8*Quadrature[1];
// {Use ArcTangent to compute the current phase}
if(MathAbs(InPhase[0] + InPhase[1]) > 0)
Phase[0] = MathArctan(MathAbs((Quadrature[0] + Quadrature[1]) /
(InPhase[0] + InPhase[1])));
// {Resolve the ArcTangent ambiguity}
if(InPhase[0] < 0 && Quadrature[0] > 0)
Phase[0] = 180 - Phase[0];
if(InPhase[0] < 0 && Quadrature[0] < 0)
Phase[0] = 180 + Phase[0];
if(InPhase[0] > 0 && Quadrature[0] < 0)
Phase[0] = 360 - Phase[0];
// {Compute a differential phase, resolve phase wraparound, and limit delta phase errors}
DeltaPhase[shift] = Phase[1] - Phase[0];
if (Phase[1] < 90 && Phase[0] > 270)
DeltaPhase[shift] = 360 + Phase[1] - Phase[0];
if(DeltaPhase[shift] < 1)
DeltaPhase[shift] = 1;
if(DeltaPhase[shift] > 60)
DeltaPhase[shift] = 60;
// {Sum DeltaPhases to reach 360 degrees. The sum is the instantaneous period.}
InstPeriod[0] = 0;
Value4 = 0;
for(count = 0; count <= 40; count++)
{
Value4 = Value4 + DeltaPhase[shift+count];
if(Value4 > 360 && InstPeriod[0] == 0)
InstPeriod[0] = count;
}
// {Resolve Instantaneous Period errors and smooth}
if(InstPeriod[0] == 0)
InstPeriod[0] = InstPeriod[1];
Value5[0] = 0.25*(InstPeriod[0]) + 0.75*Value5[1];
// {Compute Trendline as simple average over the measured dominant cycle period}
Period_ = MathCeil(Value5[0]);
Trendline = 0; //Period_ = IntPortion(Value5)
//----
for(count = 0; count <= Period_ + 1; count++)
{
Trendline = Trendline + Price[shift+count];
}
if(Period_ > 0)
Trendline = Trendline / (Period_ + 2);
Value11[0] = 0.33*(Price[shift] + 0.5*(Price[shift] -
Price[shift+3])) + 0.67*Value11[1];
TRBuffer[shift]=Trendline;
ZLBuffer[shift]=Value11[0];
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments