//+------------------------------------------------------------------+
//|                                      Pair Difference In Pips.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red


extern string     OffChartSymbol       = "nzdusd";
extern bool       UseCorrelation       = false;
extern int        CorrelationTimeFrame = 1440;
extern int        CorrelationPeriods   = 50;
string m="",T="NotValid";
datetime once = 0;
double curr1;
double buffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
            if( OffChartSymbol=="audcad" )OffChartSymbol="AUDCAD" ;
            if( OffChartSymbol=="audchf" )OffChartSymbol="AUDCHF" ;
            if( OffChartSymbol=="audjpy" )OffChartSymbol="AUDJPY" ;
            if( OffChartSymbol=="audnzd" )OffChartSymbol="AUDNZD" ;
            if( OffChartSymbol=="audusd" )OffChartSymbol="AUDUSD" ;
            if( OffChartSymbol=="cadjpy" )OffChartSymbol="CADJPY" ;           
            if( OffChartSymbol=="chfjpy" )OffChartSymbol="CHFJPY" ;
            if( OffChartSymbol=="euraud" )OffChartSymbol="EURAUD" ;
            if( OffChartSymbol=="eurcad" )OffChartSymbol="EURCAD" ;
            if( OffChartSymbol=="eurchf" )OffChartSymbol="EURCHF" ;
            if( OffChartSymbol=="eurgbp" )OffChartSymbol="EURGBP" ;
            if( OffChartSymbol=="eurjpy" )OffChartSymbol="EURJPY" ;
            if( OffChartSymbol=="eurnzd" )OffChartSymbol="EURNZD" ;
            if( OffChartSymbol=="eurusd" )OffChartSymbol="EURUSD" ;
            if( OffChartSymbol=="gbpaud" )OffChartSymbol="GBPAUD" ;
            if( OffChartSymbol=="gbpcad" )OffChartSymbol="GBPCAD" ;
            if( OffChartSymbol=="gbpchf" )OffChartSymbol="GBPCHF" ;
            if( OffChartSymbol=="gbpjpy" )OffChartSymbol="GBPJPY" ;
            if( OffChartSymbol=="gbpnzd" )OffChartSymbol="GBPNZD" ;
            if( OffChartSymbol=="gbpusd" )OffChartSymbol="GBPUSD" ;
            if( OffChartSymbol=="nzdchf" )OffChartSymbol="NZDCHF" ;
            if( OffChartSymbol=="nzdjpy" )OffChartSymbol="NZDJPY" ;
            if( OffChartSymbol=="nzdusd" )OffChartSymbol="NZDUSD" ;
            if( OffChartSymbol=="usdcad" )OffChartSymbol="USDCAD" ;
            if( OffChartSymbol=="usdchf" )OffChartSymbol="USDCHF" ;
            if( OffChartSymbol=="usdjpy" )OffChartSymbol="USDJPY" ;
            if( OffChartSymbol=="eurdkk" )OffChartSymbol="EURDKK" ;
            if( OffChartSymbol=="usdczk" )OffChartSymbol="USDCZK" ;
            if( OffChartSymbol=="usddkk" )OffChartSymbol="USDDKK" ;
            if( OffChartSymbol=="usdmxn" )OffChartSymbol="USDMXN" ;
            if( OffChartSymbol=="usdpln" )OffChartSymbol="USDPLN" ;
   
   m = StringSubstr(Symbol(),6,StringLen(Symbol())-6);
      OffChartSymbol = OffChartSymbol+m;      
      
   if ( CorrelationTimeFrame == 1 ) T = "M1";
   if ( CorrelationTimeFrame == 5 ) T = "M5";
   if ( CorrelationTimeFrame == 15 ) T = "M15";
   if ( CorrelationTimeFrame == 30 ) T = "M30";
   if ( CorrelationTimeFrame == 60 ) T = "H1";
   if ( CorrelationTimeFrame == 240 ) T = "H4";
   if ( CorrelationTimeFrame == 1440 ) T = "D1";
   if ( CorrelationTimeFrame == 10080 ) T = "W1";
   if ( CorrelationTimeFrame == 43200 ) T = "MN";
   
//---- indicators
   SetIndexBuffer(0,buffer1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,OffChartSymbol);
   
   IndicatorDigits(MarketInfo(OffChartSymbol,MODE_DIGITS));
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
      Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   
   int    i,counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
      int limit=Bars-counted_bars;
      
            for(i=limit; i>=0; i--)
               {
                  
                  buffer1[i] = iClose(OffChartSymbol,0,i);//iMA(OffChartSymbol,0,1,0,0,4,i);
               }
           IndicatorShortName("OffChartPair "+StringSubstr(OffChartSymbol,0,6)
               +"   Spd: "+DoubleToStr(MarketInfo(OffChartSymbol,MODE_SPREAD),0)+"   ");
               
      if ( UseCorrelation )
           if ( once != iTime(Symbol(),CorrelationTimeFrame,0) )
               {
                  Comment(correlation2pair());
                  once = iTime(Symbol(),CorrelationTimeFrame,0);
               }     
           
   return(0);
  }
//+------------------------------------------------------------------+

string   correlation2pair()
{
	string   Symbol1     = Symbol(), Symbol2 = OffChartSymbol, cor; 
	int      TimeFrame   = CorrelationTimeFrame;
	datetime closeTime1	= iTime(Symbol1,TimeFrame,0),
				closeTime2	= iTime(Symbol2,TimeFrame,0),
				closeTime	= MathMin(closeTime1,closeTime2);
	int		shift1		= iBarShift(Symbol1,TimeFrame,closeTime),
				shift2		= iBarShift(Symbol2,TimeFrame,closeTime);
	double	close1[],
				close2[];

	ArrayCopySeries(close1,MODE_CLOSE,Symbol1,TimeFrame);
	ArrayCopySeries(close2,MODE_CLOSE,Symbol2,TimeFrame);

	int bars = MathMin(ArraySize(close1)-shift1,ArraySize(close2)-shift2);
	if ( CorrelationPeriods > 0 )
	     bars = CorrelationPeriods;
   double C = Correlation(close1,close2,shift1,shift2,bars);
   
   
	cor = "Correlation of "+Symbol1+" and "+Symbol2+" on "+T+" TimeFrame = "+DoubleToStr(100*C,1)+"\nBars analyzed = "+bars;
	return(cor);
}



//+------------------------------------------------------------------+
//| Correlation Coefficient R														|
//+------------------------------------------------------------------+
double Correlation(double x[], double y[], int x_shift = 0, int y_shift = 0, int count = -1)
{
	//Print(x_shift,"  ",y_shift,"  ",count);
	int n = MathMin(ArraySize(x)-x_shift,ArraySize(y)-y_shift);
	if(n>count && count>0)
		n=count;
	if(n<2)
		return(-2);

	double	sum_sq_x,
				sum_sq_y,
				sum_coproduct,
				mean_x = x[x_shift],
				mean_y = y[y_shift];

	for(int i = 0; i < n; i++)
	{
		double	sweep = i / (i+1.0),
					delta_x = x[i+x_shift] - mean_x,
					delta_y = y[i+y_shift] - mean_y;

		sum_sq_x += delta_x*delta_x * sweep;
		sum_sq_y += delta_y*delta_y * sweep;
    	sum_coproduct += delta_x*delta_y * sweep;
    	mean_x += delta_x / (i+1.0);
    	mean_y += delta_y / (i+1.0);
	}

	double	pop_sd_x = MathSqrt(sum_sq_x/n),
				pop_sd_y = MathSqrt(sum_sq_y/n),
				cov_x_y = sum_coproduct / n;

	if(pop_sd_x*pop_sd_y != 0.0)
		return(cov_x_y / (pop_sd_x*pop_sd_y));

	return(-3);
}

