#TickA_SineWavePeriods





//+------------------------------------------------------------------+
//|                          Instantaneous Trend Line by John Ehlers |
//|                               Copyright © JDP                    |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "JDP"
#property link      ""
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

//---- buffers
extern int Len=200;
double Periods[];
double Value1[],Value2,Value3,Value4,Value5[2],Value11[2];
double RealPart,ImagPart,DCPhase;
double Pi;
double Price[],InPhase[2],Quadrature[2],Phase[2],DeltaPhase[],InstPeriod[2],Period_;
double test[];
int LastTm;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
   IndicatorBuffers(4);
//---- indicator line
   SetIndexStyle(0,DRAW_LINE,EMPTY,2,Red);
   SetIndexBuffer(0,Periods);
   SetIndexBuffer(2,Value1);
   SetIndexBuffer(1,Price); 
   SetIndexBuffer(3,DeltaPhase);
   SetIndexEmptyValue(0,0);
//---- name for DataWindow and indicator subwindow label
   short_name="Sine Wave Periods";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//----
   SetIndexDrawBegin(0,30);
//----

   return(0);
  }

int deinit(){return(0);}
int start()
  {
   int i,shift,count;
   Pi = 4 * MathArctan(1);
   if (LastTm < Time[0]) {
      for (i = 0;i<1000;i++) {
         Periods[i] = Periods[i+1];
         Value1[i] = Value1[i+1];
         Price[i] = Price[i+1];
         DeltaPhase[i] = DeltaPhase[i+1];
      }
      LastTm = Time[0];   
   }
   for (i = 1001;i>0;i--) {
      Periods[i] = Periods[i-1];
      Value1[i] = Value1[i-1];
      Price[i] = Price[i-1];
      DeltaPhase[i] = DeltaPhase[i-1];
   }
i = 0;
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]=(Ask+Bid)/2;
//Price[shift]=iCustom(Symbol(),0,"Heiken_Ashi_Smoothed",6,shift);
//  {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])))*(180/Pi);
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<=Len;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]);///Period_ = IntPortion(Value5)
   Periods[shift]= Period_;

//----
}
return(0);
}







Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: