//+------------------------------------------------------------------+
//|                                             Test Correlation.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009.02.12, SwingMan"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue

#property indicator_level1 0


//---- extern inputs
//+------------------------------------------------------------------+
extern string SecondPair = "USDJPY";
extern int Length_SpreadCalculation = 30;
extern string ____Prices____ = "0=C,4=Median,5=Typical,6=Weighted";
extern int Price = PRICE_CLOSE;
//+------------------------------------------------------------------+

#define IndicatorName "Test Correlation"

//---- buffers
double pairSpread[];

//---- variables
string sIndicatorName;
string symbolA, symbolB;
int oldBarShiftA, oldBarShiftB;
double oldHistoricalVolaA, oldHistoricalVolaB, oldHistoricalVolaAB;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//----
   symbolA = Symbol(); 
   symbolB = SecondPair;
   if (Symbol() == symbolB) symbolB = "USDJPY";
   if (Symbol() == symbolB) symbolB = "GBPJPY";
   oldBarShiftA = -1;
   oldBarShiftB = -1;
//----   
   sIndicatorName = IndicatorName + " (" + symbolA + "-" + symbolB + ", " + Length_SpreadCalculation + ") ";
   IndicatorShortName(sIndicatorName);   
   //---- indicators
   SetIndexBuffer(0,pairSpread); SetIndexStyle(0,DRAW_LINE); SetIndexLabel(0,"PairSpread");
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{   
   Comment("");
   return(0);
}

//####################################################################
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{  
int limit;

//----
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

limit = 500;   
//---- main loop
   for(int i=limit; i>=0; i--)   
   {
      //---- pair spread calculation --------------------------------
      double dCloseA0 = iClose(symbolA,Period(),i);
      double dCloseA1 = iClose(symbolA,Period(),i+1);
      if (dCloseA1 !=  0) double divA = dCloseA0 / dCloseA1;
      
      double dCloseB0 = iClose(symbolB,Period(),i);
      double dCloseB1 = iClose(symbolB,Period(),i+1);
      if (dCloseB1 !=  0) double divB = dCloseB0 / dCloseB1;
      
      pairSpread[i] = divA - divB;
   }
   double currentCorrelation = Get_Correlation(symbolA, symbolB, 0, Length_SpreadCalculation);
//----
   return(0);
}
//+------------------------------------------------------------------+


//###################################################################
//___________________________________________________________________
double Get_Correlation(string symbolAV, string symbolBV, int iBar, int length)
{
//-- formula: http://en.wikipedia.org/wiki/Correlation_and_dependence
//-- Pearson correlation formula from: http://davidmlane.com/hyperstat/A51911.html

double sumA, sumB, avgA, avgB;
double corr1, corr2;
int i, j;
double arrayA[], arrayB[];
ArrayResize(arrayA, 2*length);
ArrayResize(arrayB, 2*length);


// 1 = scooby original
// 2 = simple formula

   //################################################################
   //-- METHODE 1
   corr1 = Cor(symbolA, symbolB, length);

iBar=1;  //-- (like Mataf)
   //################################################################
   //-- METHODE 2      
   //###################################################################
   //    SWINGMAN TEST FORMULAS
   //###################################################################
   //---- initialize arrayA -----------------------------------------
   sumA = 0;
   int nI = 0;
   for (i=iBar; i<iBar+length; i++)
   {
      sumA += iClose(symbolA,Period(),i);
      nI++;
   }   
   avgA = sumA / length;   
     
   if (avgA != 0)
      for (i=iBar; i<iBar+length; i++)
         arrayA[i] = (iClose(symbolA,Period(),i) - avgA);
         //arrayA[i] = (closeA[i] - avgA) / avgA;
   
   double X2=0;
   for (i=iBar; i<iBar+length; i++)
      X2 += arrayA[i]*arrayA[i];
      
   //---- initialize arrayB -----------------------------------------
   sumB = 0;
   for (i=iBar; i<iBar+length; i++)
      sumB += iClose(symbolB,Period(),i);
   avgB = sumB / length;   
     
   if (avgB != 0)
      for (i=iBar; i<iBar+length; i++)
         arrayB[i] = (iClose(symbolB,Period(),i) - avgB);
         //arrayB[i] = (closeB[i] - avgB) / avgB;

   double Y2;
   for (i=iBar; i<iBar+length; i++)
      Y2 += arrayB[i]*arrayB[i];   
         
      
   //---- correlation -----------------------------------------------
   double sumXY=0;
   for (i=iBar; i<iBar+length; i++)
      sumXY += (arrayA[i]) * (arrayB[i]);

   double val5 = MathSqrt(X2 * Y2);
   if (val5 != 0)
      corr2 = sumXY / val5;


//Comment("Correlation ",symbolA,"-",symbolB," = ",DoubleToStr(corr,4),"  nI=",nI,"  Period=",Upper_Period); 

string st;
st = st + "Correlation " + symbolA + "-" + symbolB + "    length=" + length + "   iBar=" + iBar + "\n";
st = st + "KangGun formula: " + DoubleToStr(corr1,4) + "\n";
st = st + "SimpleMath formula: " + DoubleToStr(corr2,4) + "\n";
Comment(st); 
//----   
   return(0);    
}

//###################################################################
//    ROBOT FORMULAS
//###################################################################
//___________________________________________________________________
double Cor(string base, string hedge, int corperiod)
{
   double u1=0,l1=0,s1=0;
   for(int i = corperiod - 1; i >= 0; i--)
   {
      u1 += u(symboldif(base, i, corperiod), symboldif(hedge, i, corperiod));
      l1 += powdif(symboldif(base, i, corperiod));
      s1 += powdif(symboldif(hedge, i, corperiod));
   }//for(int i = corperiod - 1; i >= 0; i--)
   
   if(l1*s1 > 0) return(u1 / MathSqrt(l1*s1));
}//End double Cor(string base, string hedge, int corperiod)

//___________________________________________________________________
double symboldif(string symbol, int shift, int corperiod)
{
   return(iClose(symbol, 1440, shift) - iMA(symbol, 1440, corperiod, 0, MODE_SMA,PRICE_CLOSE, shift));
}//End double symboldif(string symbol, int shift, int corperiod)

//___________________________________________________________________
double powdif(double val)
{
   return(MathPow(val, 2));
}//End double powdif(double val)

//___________________________________________________________________
double u(double val1,double val2)
{
   return((val1*val2));
}//End double u(double val1,double val2)