Author: Vladradon
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
CorrStatE
ÿþ//+------------------------------------------------------------------+

//|                                                      ProjectName |

//|                                      Copyright 2018, CompanyName |

//|                                       http://www.companyname.net |

//+------------------------------------------------------------------+

#property copyright   "Vladradon"

#property link        "fxradon@gmail.com"

#property description "CorrStat"

#property version     "1.00"

#property strict



#property indicator_separate_window

#property indicator_buffers 3

#property indicator_plots   3

#property indicator_type1   DRAW_LINE

#property indicator_color1  clrYellow

#property indicator_type2   DRAW_LINE

#property indicator_color2  clrMagenta

#property indicator_type3   DRAW_LINE

#property indicator_color3  clrMagenta



input string Symm1="EURUSD";

input string Symm2="GBPUSD";

input int BarsHist=150;

input ENUM_TIMEFRAMES TFRecount=PERIOD_D1;

input int BarsCount=300;

input ENUM_TIMEFRAMES TFcount=PERIOD_CURRENT;

input color  ColCorr=clrYellow;

input color  ColMaxMin=clrMagenta;



double Corr[];

double CMax[],CMin[];

double BaseOpen[],BaseHigh[],BaseLow[],BaseClose[];

double HedgeOpen[],HedgeHigh[],HedgeLow[],HedgeClose[];

double CorrMax=0.0,CorrMin=0.0;

string Magic="", Name="";

bool print=true;

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

   IndicatorSetInteger(INDICATOR_DIGITS,0);

   IndicatorSetDouble(INDICATOR_LEVELVALUE,0);

//--- indicator buffers mapping

   SetIndexBuffer(0,Corr,INDICATOR_DATA);

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);

   SetIndexStyle(0,DRAW_LINE,EMPTY,1,ColCorr);

   PlotIndexSetString(0,PLOT_LABEL,Symm1+"-"+Symm2);



   SetIndexBuffer(1,CMax,INDICATOR_DATA);

   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);

   SetIndexStyle(1,DRAW_LINE,EMPTY,1,ColMaxMin);

   PlotIndexSetString(1,PLOT_LABEL,Symm1+"-"+Symm2);



   SetIndexBuffer(2,CMin,INDICATOR_DATA);

   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_LINE);

   SetIndexStyle(2,DRAW_LINE,EMPTY,1,ColMaxMin);

   PlotIndexSetString(2,PLOT_LABEL,Symm1+"-"+Symm2);



   PlotIndexSetString(0,PLOT_LABEL,Symm1+"-"+Symm2);

   PlotIndexSetString(1,PLOT_LABEL,"Max");

   PlotIndexSetString(2,PLOT_LABEL,"Min");



   if(ObjectFind(0,"CMax")>0)

      ObjectDelete(0,"CMax");

   if(ObjectFind(0,"CMin")>0)

      ObjectDelete(0,"CMin");

   if(ObjectFind(0,"CPer")>0)

      ObjectDelete(0,"CPer");

//---

   ArrayResize(BaseOpen,BarsCount,0);

   ArrayResize(BaseHigh,BarsCount,0);

   ArrayResize(BaseLow,BarsCount,0);

   ArrayResize(BaseClose,BarsCount,0);

   ArrayResize(HedgeOpen,BarsCount,0);

   ArrayResize(HedgeHigh,BarsCount,0);

   ArrayResize(HedgeLow,BarsCount,0);

   ArrayResize(HedgeClose,BarsCount,0);

//---

   ArraySetAsSeries(Corr,true);

   ArraySetAsSeries(CMax,true);

   ArraySetAsSeries(CMin,true);



   ArrayInitialize(Corr,0.0);

   ArrayInitialize(CMax,0.0);

   ArrayInitialize(CMin,0.0);

//---

   MathSrand(GetTickCount());

   Magic=IntegerToString((int)MathRand(),4,'1');

   Magic=StringSubstr(Magic,StringLen(Magic)-4,4);

   Name="Correlation "+Symm1+" & "+Symm2+" | "+PeriodCount(TFcount)+" | "+PeriodCount(TFRecount)+" | "+Magic;

   IndicatorSetString(INDICATOR_SHORTNAME,Name);

   print=true;

   return(INIT_SUCCEEDED);

  }

//--------------------------------------------------------------------

void OnDeinit(const int reason)

  {

   if(ObjectFind(0,"CMax"+Magic)>0)

      ObjectDelete(0,"CMax"+Magic);

   if(ObjectFind(0,"CMin"+Magic)>0)

      ObjectDelete(0,"CMin"+Magic);

   if(ObjectFind(0,"CPer"+Magic)>0)

      ObjectDelete(0,"CPer"+Magic);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

   if(!IsNewBar())

      return(rates_total);

//---

   ArrayInitialize(Corr,0.0);

   ArrayInitialize(CMax,0.0);

   ArrayInitialize(CMin,0.0);

//---

   CorrMax=0.0;

   CorrMin=0.0;

   int K=(int)(TimeCount(TFRecount)/TimeCount(TFcount));

   for(int i=BarsHist-1; i>=0; i--)

     {

      if((Corr[i]=Cor(Symm1,Symm2,i*K))>1.0)

        {

         if(print)

            Print("No history");

         print=false;

         Told=0;

         return(0);

        }

      if(CorrMax<Corr[i])

         CorrMax=Corr[i];

      if(CorrMin>Corr[i])

         CorrMin=Corr[i];

     }

//---

   ArrayInitialize(CMax,CorrMax);

   ArrayInitialize(CMin,CorrMin);

//---

   int win=ChartWindowFind(0,Name);

   if(ObjectFind(0,"CMax"+Magic)<=0)

     {

      ObjectCreate(0,"CMax"+Magic,OBJ_LABEL,win,TimeCurrent(),CorrMax);

      ObjectSetString(0,"CMax"+Magic,OBJPROP_TEXT," MAX "+DoubleToString(CorrMax,2));

      ObjectSetString(0,"CMax"+Magic,OBJPROP_FONT,"Arial Bold");

      ObjectSetInteger(0,"CMax"+Magic,OBJPROP_CORNER,CORNER_RIGHT_UPPER);

      ObjectSetInteger(0,"CMax"+Magic,OBJPROP_XDISTANCE,70);

      ObjectSetInteger(0,"CMax"+Magic,OBJPROP_YDISTANCE,5);

      ObjectSetInteger(0,"CMax"+Magic,OBJPROP_COLOR,ColMaxMin);

      ObjectSetInteger(0,"CMax"+Magic,OBJPROP_FONTSIZE,9);

     }

//---

   if(ObjectFind(0,"CMin"+Magic)<=0)

     {

      ObjectCreate(0,"CMin"+Magic,OBJ_LABEL,win,TimeCurrent(),CorrMin+(int)MathAbs(CorrMin/100*21));

      ObjectSetString(0,"CMin"+Magic,OBJPROP_TEXT," MIN "+DoubleToString(CorrMin,2));

      ObjectSetString(0,"CMin"+Magic,OBJPROP_FONT,"Arial Bold");

      ObjectSetInteger(0,"CMin"+Magic,OBJPROP_CORNER,CORNER_RIGHT_LOWER);

      ObjectSetInteger(0,"CMin"+Magic,OBJPROP_XDISTANCE,70);

      ObjectSetInteger(0,"CMin"+Magic,OBJPROP_YDISTANCE,19);

      ObjectSetInteger(0,"CMin"+Magic,OBJPROP_COLOR,ColMaxMin);

      ObjectSetInteger(0,"CMin"+Magic,OBJPROP_FONTSIZE,9);

     }

//---

   ObjectSetString(0,"CMax"+Magic,OBJPROP_TEXT," MAX "+DoubleToString(CorrMax,2));

   ObjectSetString(0,"CMin"+Magic,OBJPROP_TEXT," MIN "+DoubleToString(CorrMin,2));



   if(ObjectFind(0,"CPer"+Magic)>=0)

      ObjectDelete(0,"CPer"+Magic);

   ObjectCreate(0,"CPer"+Magic,OBJ_TEXT,win,TimeCurrent(),0);

   color Col=clrWhite;



   if(Corr[0]>0.0)

      Col=clrLime;

   if(Corr[0]<0.0)

      Col=clrOrangeRed;



   ObjectSetString(0,"CPer"+Magic,OBJPROP_TEXT,DoubleToString(Corr[0],2));

   ObjectSetInteger(0,"CPer"+Magic,OBJPROP_COLOR,Col);



   ChartRedraw();

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+

static datetime Told=0;

bool IsNewBar()

  {

   datetime Tnew[1];

   CopyTime(_Symbol,PERIOD_CURRENT,0,1,Tnew);

   if(Tnew[0]!=Told)

     {

      Told=Tnew[0];

      return(true);

     }

   return(false);

  }

//+------------------------------------------------------------------+

//|01>@ DC=:F89 4;O @0AG5B0 :>@@5;OF88                                                      |

//+------------------------------------------------------------------+

double AverageBase=0.0,AverageHedge=0.0;

//---

double symboldif(int symbol=0,int shift=0)

  {

   double res=0.0;

   if(symbol==1)

      res=(BaseOpen[shift]+BaseHigh[shift]+BaseLow[shift]+BaseClose[shift])/4-AverageBase;

   if(symbol==2)

      res=(HedgeOpen[shift]+HedgeHigh[shift]+HedgeLow[shift]+HedgeClose[shift])/4-AverageHedge;

   return (res);

  }

//+---

double Cor(string base,string hedge,int shift)

  {

   if(HistoryBuffers(base, hedge, shift)==0)

      return(2.0);

   double u=0.0,l=0.0,s=0.0;

   for(int i=BarsCount-1; i>=0; i--)

     {

      u += symboldif(1, i)*symboldif(2, i);

      l += MathPow(symboldif(1, i),2);

      s += MathPow(symboldif(2, i),2);

     }

   if(l*s>0)

      return(u/MathSqrt(l*s));

   return(2.0);

  }

//+------------------------------------------------------------------+

//| $C=:F8O :>?8@>20=8O 8AB>@88 8 2KG8A;5=8O A@54=59

//+------------------------------------------------------------------+

int HistoryBuffers(string base,string hedge,int shift)

  {

   AverageBase=0.0;

   AverageHedge=0.0;

   if(CopyOpen(base,TFcount,shift,BarsCount,BaseOpen)!=BarsCount)

      return(0);

   if(CopyHigh(base,TFcount,shift,BarsCount,BaseHigh)!=BarsCount)

      return(0);

   if(CopyLow(base,TFcount,shift,BarsCount,BaseLow)!=BarsCount)

      return(0);

   if(CopyClose(base,TFcount,shift,BarsCount,BaseClose)!=BarsCount)

      return(0);

   for(int i=BarsCount-1; i>=0; i--)

      AverageBase+=(BaseOpen[i]+BaseHigh[i]+BaseLow[i]+BaseClose[i])/4;



   AverageBase=AverageBase/BarsCount;



   if(AverageBase==0)

      return(0);



   if(CopyOpen(hedge,TFcount,shift,BarsCount,HedgeOpen)!=BarsCount)

      return(0);

   if(CopyHigh(hedge,TFcount,shift,BarsCount,HedgeHigh)!=BarsCount)

      return(0);

   if(CopyLow(hedge,TFcount,shift,BarsCount,HedgeLow)!=BarsCount)

      return(0);

   if(CopyClose(hedge,TFcount,shift,BarsCount,HedgeClose)!=BarsCount)

      return(0);

   for(int j=BarsCount-1; j>=0; j--)

      AverageHedge=AverageHedge+(HedgeOpen[j]+HedgeHigh[j]+HedgeLow[j]+HedgeClose[j])/4;



   AverageHedge=AverageHedge/BarsCount;

   if(AverageHedge==0)

      return(0);

   return (1);

  }

//+------------------------------------------------------------------+

int TimeCount(int per)

  {

   switch(per)

     {

      case PERIOD_M1:

         return(60);

      case PERIOD_M2:

         return(120);

      case PERIOD_M3:

         return(180);

      case PERIOD_M4:

         return(240);

      case PERIOD_M5:

         return(300);

      case PERIOD_M6:

         return(360);

      case PERIOD_M10:

         return(600);

      case PERIOD_M12:

         return(720);

      case PERIOD_M15:

         return(900);

      case PERIOD_M20:

         return(1200);

      case PERIOD_M30:

         return(1800);

      case PERIOD_H1:

         return(3600);

      case PERIOD_H2:

         return(7200);

      case PERIOD_H3:

         return(10800);

      case PERIOD_H4:

         return(14400);

      case PERIOD_H6:

         return(21600);

      case PERIOD_H8:

         return(28800);

      case PERIOD_H12:

         return(43200);

      case PERIOD_D1:

         return(86400);

      case PERIOD_W1:

         return(604800);

      case PERIOD_MN1:

         return(2592000);

      case PERIOD_CURRENT:

         switch(_Period)

           {

            case PERIOD_M1:

               return(60);

            case PERIOD_M2:

               return(120);

            case PERIOD_M3:

               return(180);

            case PERIOD_M4:

               return(240);

            case PERIOD_M5:

               return(300);

            case PERIOD_M6:

               return(360);

            case PERIOD_M10:

               return(600);

            case PERIOD_M12:

               return(720);

            case PERIOD_M15:

               return(900);

            case PERIOD_M20:

               return(1200);

            case PERIOD_M30:

               return(1800);

            case PERIOD_H1:

               return(3600);

            case PERIOD_H2:

               return(7200);

            case PERIOD_H3:

               return(10800);

            case PERIOD_H4:

               return(14400);

            case PERIOD_H6:

               return(21600);

            case PERIOD_H8:

               return(28800);

            case PERIOD_H12:

               return(43200);

            case PERIOD_D1:

               return(86400);

            case PERIOD_W1:

               return(604800);

            case PERIOD_MN1:

               return(2592000);

           }

     }

   return(60);

  }

//+------------------------------------------------------------------

string PeriodCount(int Per)

  {

   switch(Per)

     {

      case PERIOD_M1:

         return("M1");

      case PERIOD_M2:

         return("M2");

      case PERIOD_M3:

         return("M3");

      case PERIOD_M4:

         return("M4");

      case PERIOD_M5:

         return("M5");

      case PERIOD_M6:

         return("M6");

      case PERIOD_M10:

         return("M10");

      case PERIOD_M12:

         return("M12");

      case PERIOD_M15:

         return("M15");

      case PERIOD_M20:

         return("M20");

      case PERIOD_M30:

         return("M30");

      case PERIOD_H1:

         return("H1");

      case PERIOD_H2:

         return("H2");

      case PERIOD_H3:

         return("H3");

      case PERIOD_H4:

         return("H4");

      case PERIOD_H6:

         return("H6");

      case PERIOD_H8:

         return("H8");

      case PERIOD_H12:

         return("H12");

      case PERIOD_D1:

         return("D1");

      case PERIOD_W1:

         return("W1");

      case PERIOD_MN1:

         return("MN1");

      case PERIOD_CURRENT:

         switch(_Period)

           {

            case PERIOD_M1:

               return("M1");

            case PERIOD_M2:

               return("M2");

            case PERIOD_M3:

               return("M3");

            case PERIOD_M4:

               return("M4");

            case PERIOD_M5:

               return("M5");

            case PERIOD_M6:

               return("M6");

            case PERIOD_M10:

               return("M10");

            case PERIOD_M12:

               return("M12");

            case PERIOD_M15:

               return("M15");

            case PERIOD_M20:

               return("M20");

            case PERIOD_M30:

               return("M30");

            case PERIOD_H1:

               return("H1");

            case PERIOD_H2:

               return("H2");

            case PERIOD_H3:

               return("H3");

            case PERIOD_H4:

               return("H4");

            case PERIOD_H6:

               return("H6");

            case PERIOD_H8:

               return("H8");

            case PERIOD_H12:

               return("H12");

            case PERIOD_D1:

               return("D1");

            case PERIOD_W1:

               return("W1");

            case PERIOD_MN1:

               return("MN1");

           }

     }

   return("CURRENT");

  }

//+------------------------------------------------------------------+

Comments