JB Center of Gravity





//+------------------------------------------------------------------+
//|                                         JB Center of Gravity.mq4 |
//|                                                                  |
//| Original Code from NG3110@latchess.com                           |
//| Modification written by Jürgen Bouché                            |
//| This is the no repainting variant of the COG indicator.          |
//|                                                                  |
//|                                         http://juergen.bouche.de |
//+------------------------------------------------------------------+
#property  copyright "ANG3110@latchess.com and Jürgen Bouché"
#property link       "http://juergen.bouche.de"

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 RoyalBlue
#property indicator_color2 LimeGreen
#property indicator_color3 LimeGreen
#property indicator_color4 Goldenrod
#property indicator_color5 Goldenrod

extern int bars_back = 240;
extern int m = 4;
extern int i = 0;
extern double kstd = 1;

double fx[], sqh[], sql[], stdh[], stdl[];
double ai[10,10], b[10], x[10], sx[20];
double sum;
int    p, n, f;
double qq, mm, tt;
int    ii, jj, kk, ll, nn;
double sq, std;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   IndicatorShortName("JB Center of Gravity");
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, fx);
   SetIndexBuffer(1, sqh);
   SetIndexBuffer(2, sql);
   SetIndexBuffer(3, stdh);
   SetIndexBuffer(4, stdl);
   
   nn = m + 1;

   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   int mi;

   p = bars_back; 
   sx[1] = p + 1;
   
   int iBarsToCalculate = 0;
   int iCountedBars = IndicatorCounted();
   if(iCountedBars < 0) return(-1);
   if(iCountedBars > 0) iCountedBars--;

   iBarsToCalculate = Bars - iCountedBars;
   
   for(i = 0;i < iBarsToCalculate;i++)
   {
      // +-----+ SX +-----+
      for(mi = 1; mi <= nn * 2 - 2; mi++)
      {
         sum = 0;
         for(n = i; n <= i + p; n++)
         {
            sum += MathPow(n, mi);
         }
         sx[mi + 1] = sum;
      }
      // +-----+ SYX +-----+
      for(mi = 1; mi <= nn; mi++)
      {
         sum = 0.00000;
         for(n = i; n <= i + p; n++)
         {
            if(mi == 1)
               sum += Close[n];
            else
               sum += Close[n] * MathPow(n, mi - 1);
         }
         b[mi] = sum;
      }
      // +-----+ MATRIX +-----+
      for(jj = 1; jj <= nn; jj++)
      {
         for(ii = 1; ii <= nn; ii++)
         {
            kk = ii + jj - 1;
            ai[ii, jj] = sx[kk];
         }
      }  
      // +-----+ GAUSS +-----+
      for(kk = 1; kk <= nn - 1; kk++)
      {
         ll = 0; mm = 0;
         for(ii = kk; ii <= nn; ii++)
         {
            if(MathAbs(ai[ii, kk]) > mm)
            {
               mm = MathAbs(ai[ii, kk]);
               ll = ii;
            }
         }
         if(ll == 0)
            return(0);   

         if(ll != kk)
         {
            for(jj = 1; jj <= nn; jj++)
            {
               tt = ai[kk, jj];
               ai[kk, jj] = ai[ll, jj];
               ai[ll, jj] = tt;
            }
            tt = b[kk]; b[kk] = b[ll]; b[ll] = tt;
         }  
         for(ii = kk + 1; ii <= nn; ii++)
         {
            qq = ai[ii, kk] / ai[kk, kk];
            for(jj = 1; jj <= nn; jj++)
            {
               if(jj == kk)
                  ai[ii, jj] = 0;
               else
                  ai[ii, jj] = ai[ii, jj] - qq * ai[kk, jj];
            }
            b[ii] = b[ii] - qq * b[kk];
         }
      }  
      x[nn] = b[nn] / ai[nn, nn];
      for(ii = nn - 1; ii >= 1; ii--)
      {
         tt = 0;
         for(jj = 1; jj <= nn - ii; jj++)
         {
            tt = tt + ai[ii, ii + jj] * x[ii + jj];
            x[ii] = (1 / ai[ii, ii]) * (b[ii] - tt);
         }
      }

      /*for(n = i; n <= i + p; n++)
      {
         sum = 0;
         for(kk = 1; kk <= m; kk++)
         {
            sum += x[kk + 1] * MathPow(n, kk);
         }
         fx[n] = x[1] + sum;
      }*/
      sum = 0;
      for(kk = 1; kk <= m; kk++)
      {
         sum += x[kk + 1] * MathPow(i, kk);
      }
      fx[i] = x[1] + sum;

      sq = 0.0;
      /*for(n = i;n <= i + p;n++)
      {
         sq += MathPow(Close[n] - fx[n], 2);
      }*/
      for(n = i;n <= i + p;n++)
      {
         sum = 0;
         for(kk = 1; kk <= m; kk++)
         {
            sum += x[kk + 1] * MathPow(n, kk);
         }
         sq += MathPow(Close[n] - (x[1] + sum), 2);
      }
      sq = MathSqrt(sq / (p + 1)) * kstd;
      std = iStdDev(NULL,0,p,MODE_SMA,0,PRICE_CLOSE,i) * kstd;
      /*for(n = i; n <= i + p; n++)
      {
         sqh[n] = fx[n] + sq;
         sql[n] = fx[n] - sq;
         stdh[n] = fx[n] + std;
         stdl[n] = fx[n] - std;
      }*/
      sqh[i] = fx[i] + sq;
      sql[i] = fx[i] - sq;
      stdh[i] = fx[i] + std;
      stdl[i] = fx[i] - std;
   }

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





Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:

Standard Deviation indicator


Custom Indicators Used:

Order Management characteristics:

Other Features: