Homodyne Discriminator





//+------------------------------------------------------------------+
//|                                       Homodyne Discriminator.mq4 |
//|                                        Tantalus - from J. Ehlers |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Tantalus - from J. Ehlers"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Salmon

double dDomPeriod[];
double dSmoothDomPeriod[];
double dDeTrend[];
double Q1[];
double I1[];

double jQ, jI;
double I2, Q2, LastI2, LastQ2;
double Re, Im, LastRe, LastIm;

int init()
{
   IndicatorBuffers(5);
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, dDomPeriod);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexBuffer(1, dSmoothDomPeriod);
   SetIndexStyle(4, DRAW_NONE);
   SetIndexBuffer(4, dDeTrend);
   SetIndexStyle(2, DRAW_NONE);
   SetIndexBuffer(2, Q1);
   SetIndexStyle(3, DRAW_NONE);
   SetIndexBuffer(3, I1);
   int k;
   for (k = Bars; k >= 0; k --)
   {
      dDomPeriod[k] = 0.0;
      dDeTrend[k] = 0.0;
      Q1[k] = 0.0;
      I1[k] = 0.0;
   }   
   return(0);
}

int start()
{
   int k;
   for (k = Bars - 6; k >= 0; k --)
   {
      dDeTrend[k] = (0.0962 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k)
                   + 0.5769 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k + 2)
                   - 0.5769 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k + 4)
                   - 0.0962 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k + 6))
                   * (0.075 * dDomPeriod[k + 1] + 0.54);

      Q1[k] = (0.0962 *  dDeTrend[k] + 0.5769 * dDeTrend[k + 2]
             - 0.5769 * dDeTrend[k + 4] - 0.0962 *  dDeTrend[k + 6])
             * (0.075 * dDomPeriod[k + 1] + 0.54);
      I1[k] = dDeTrend[k + 3];
      
      jI = (0.0962 *  I1[k] + 0.5769 * I1[k + 2] - 0.5769 * I1[k + 4] - 0.0962 *  I1[k + 6])
         * (0.075 * dDomPeriod[k + 1] + 0.54);
      jQ = (0.0962 *  Q1[k] + 0.5769 * Q1[k + 2] - 0.5769 * Q1[k + 4] - 0.0962 *  Q1[k + 6])
         * (0.075 * dDomPeriod[k + 1] + 0.54);

      I2 = I1[k] - jQ;
      Q2 = Q1[k] + jI;
      I2 = 0.2 * I2 + 0.8 * LastI2;
      Q2 = 0.2 * Q2 + 0.8 * LastQ2;
      
      Re = I2 * LastI2 + Q2 * LastQ2;
      Im = I2 * LastQ2 - Q2 * LastI2;
      Re = 0.2 * Re + 0.8 * LastRe;
      Im = 0.2 * Im + 0.8 * LastIm;

      LastI2 = I2; LastQ2 = Q2;
      LastRe = Re; LastIm = Im;

      if (Im != 0 && Re != 0)
         dDomPeriod[k] = 6.28 / MathArctan(Im / Re);
      if (dDomPeriod[k] > 1.5 * dDomPeriod[k + 1])
         dDomPeriod[k] = 1.5 * dDomPeriod[k + 1];
      if (dDomPeriod[k] < 0.6667 * dDomPeriod[k + 1])
         dDomPeriod[k] = 0.6667 * dDomPeriod[k + 1];
      if (dDomPeriod[k] < 6.0) dDomPeriod[k] = 6.0;
      if (dDomPeriod[k] > 50.0) dDomPeriod[k] = 50.0;

      dDomPeriod[k] = 0.2 * dDomPeriod[k] + 0.8 * dDomPeriod[k + 1];
      dSmoothDomPeriod[k] = 0.33 * dDomPeriod[k] + 0.67 * dSmoothDomPeriod[k + 1];
   }
   return(0);
}






Sample





Analysis



Market Information Used:



Indicator Curves created:

Implements a curve of type DRAW_LINE

Implements a curve of type DRAW_NONE

Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:

Other Features: