//+------------------------------------------------------------------+
//| solarik.mq4 
//+------------------------------------------------------------------+

//#include <hanover --- function header b600 (np).mqh>

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 C'255,153,0'
#property indicator_color2 C'254,0,0'
#property indicator_color3 C'0,203,254'
#property indicator_color4 C'0,204,0'
#property indicator_color5 C'0,51,254'
#property indicator_color6 C'152,101,0'
#property indicator_color7 C'102,0,255'
#property indicator_color8 C'255,43,203'
#property indicator_levelcolor DarkSlateGray
#property indicator_levelwidth 1
#property indicator_levelstyle 2

extern int      CountBars       = 300;
extern int      LineWidth       = 2;
extern color    ColorUSD        = C'255,153,0';
extern color    ColorEUR        = C'254,0,0';
extern color    ColorJPY        = C'0,203,254';
extern color    ColorGBP        = C'0,204,0';
extern color    ColorAUD        = C'0,51,254';
extern color    ColorCHF        = C'152,101,0';
extern color    ColorCAD        = C'102,0,255';
extern color    ColorNZD        = C'255,43,203';
extern string   FontName        = "Arial Black";
extern int      FontSize        = 12;
extern int      VertSpacing     = 5;
extern int      HorizSpacing    = 5;
extern bool     ConvergingPlot  = false;

//---- buffers
double usd[],eur[],jpy[],gbp[],aud[],chf[],cad[],nzd[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()  {
   
   string short_name = "solarik-";
//---- indicator line
   IndicatorBuffers(8);
   SetIndexStyle(0,DRAW_LINE,0,LineWidth,ColorUSD);
   SetIndexStyle(1,DRAW_LINE,0,LineWidth,ColorEUR);
   SetIndexStyle(2,DRAW_LINE,0,LineWidth,ColorJPY);
   SetIndexStyle(3,DRAW_LINE,0,LineWidth,ColorGBP);
   SetIndexStyle(4,DRAW_LINE,0,LineWidth,ColorAUD);
   SetIndexStyle(5,DRAW_LINE,0,LineWidth,ColorCHF);
   SetIndexStyle(6,DRAW_LINE,0,LineWidth,ColorCAD);
   SetIndexStyle(7,DRAW_LINE,0,LineWidth,ColorNZD);
   SetIndexBuffer(0,usd);
   SetIndexBuffer(1,eur);
   SetIndexBuffer(2,jpy);
   SetIndexBuffer(3,gbp);
   SetIndexBuffer(4,aud);
   SetIndexBuffer(5,chf);
   SetIndexBuffer(6,cad);
   SetIndexBuffer(7,nzd);
//----

   datetime plottime = TimeCurrent() + HorizSpacing*Period();
   if (DateToStr(TimeCurrent(),"H:I")=="23:59") plottime = TimeLocal();
   int stval = 26;
   PlotText(short_name+"1", true, 1, plottime, stval-1*VertSpacing, "USD", ColorUSD, FontSize, FontName, 0, false, 0);
   PlotText(short_name+"2", true, 1, plottime, stval-2*VertSpacing, "EUR", ColorEUR, FontSize, FontName, 0, false, 0);
   PlotText(short_name+"3", true, 1, plottime, stval-3*VertSpacing, "JPY", ColorJPY, FontSize, FontName, 0, false, 0);
   PlotText(short_name+"4", true, 1, plottime, stval-4*VertSpacing, "GBP", ColorGBP, FontSize, FontName, 0, false, 0);
   PlotText(short_name+"5", true, 1, plottime, stval-5*VertSpacing, "AUD", ColorAUD, FontSize, FontName, 0, false, 0);
   PlotText(short_name+"6", true, 1, plottime, stval-6*VertSpacing, "CHF", ColorCHF, FontSize, FontName, 0, false, 0);
   PlotText(short_name+"7", true, 1, plottime, stval-7*VertSpacing, "CAD", ColorCAD, FontSize, FontName, 0, false, 0);
   PlotText(short_name+"8", true, 1, plottime, stval-8*VertSpacing, "NZD", ColorNZD, FontSize, FontName, 0, false, 0);

   for (int i=1; i<=9; i++)  {
     SetLevelValue(i,125-i*25);
   }  

   return(0);
}
//+------------------------------------------------------------------+
//|                                                               |
//+------------------------------------------------------------------+
int deinit()  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                               |
//+------------------------------------------------------------------+
int start()  {
  
   if (CountBars>=Bars) CountBars=Bars;
// SetIndexDrawBegin(0,Bars-CountBars+x_prd+1);
   int i,counted_bars=IndicatorCounted();
//----

   if(Bars<=CountBars) return(0);
//---- initial zero

   for(i=1;i<=CountBars;i++) {
     usd[CountBars-i]=0.0;
     eur[CountBars-i]=0.0;
     jpy[CountBars-i]=0.0;
     gbp[CountBars-i]=0.0;
     aud[CountBars-i]=0.0;
     chf[CountBars-i]=0.0;
     cad[CountBars-i]=0.0;
     nzd[CountBars-i]=0.0;
   }
   
//----
//  i=CountBars-stp-1;
  i=CountBars;
  while (i>=0)  {
    double eurusd = GetVal(iClose("EURUSD",Period(),i),iClose("EURUSD",Period(),CountBars));
    double usdjpy = GetVal(iClose("USDJPY",Period(),i),iClose("USDJPY",Period(),CountBars));
    double usdchf = GetVal(iClose("USDCHF",Period(),i),iClose("USDCHF",Period(),CountBars));
    double gbpusd = GetVal(iClose("GBPUSD",Period(),i),iClose("GBPUSD",Period(),CountBars));
    double audusd = GetVal(iClose("AUDUSD",Period(),i),iClose("AUDUSD",Period(),CountBars));
    double usdcad = GetVal(iClose("USDCAD",Period(),i),iClose("USDCAD",Period(),CountBars));
    double nzdusd = GetVal(iClose("NZDUSD",Period(),i),iClose("NZDUSD",Period(),CountBars));
    double eurjpy = GetValM(eurusd,eurusd,usdjpy,usdjpy);
    double eurchf = GetValM(eurusd,eurusd,usdchf,usdchf);
    double eurgbp = GetValD(eurusd,eurusd,gbpusd,gbpusd);
    double chfjpy = GetValD(usdjpy,usdjpy,usdchf,usdchf);
    double gbpchf = GetValM(gbpusd,gbpusd,usdchf,usdchf);
    double gbpjpy = GetValM(gbpusd,gbpusd,usdjpy,usdjpy);
    double audchf = GetValM(audusd,audusd,usdchf,usdchf);
    double audjpy = GetValM(audusd,audusd,usdjpy,usdjpy);
    double audcad = GetValM(audusd,audusd,usdcad,usdcad);
    double eurcad = GetValM(eurusd,eurusd,usdcad,usdcad);
    double gbpcad = GetValM(gbpusd,gbpusd,usdcad,usdcad);
    double gbpaud = GetValD(gbpusd,gbpusd,audusd,audusd);
    double euraud = GetValD(eurusd,eurusd,audusd,audusd);
    double cadchf = GetValD(usdchf,usdchf,usdcad,usdcad);
    double cadjpy = GetValD(usdjpy,usdjpy,usdcad,usdcad);
    double audnzd = GetValD(audusd,audusd,nzdusd,nzdusd);
    double eurnzd = GetValD(eurusd,eurusd,nzdusd,nzdusd);
    double gbpnzd = GetValD(gbpusd,gbpusd,nzdusd,nzdusd);
    double nzdcad = GetValM(nzdusd,nzdusd,usdcad,usdcad);
    double nzdchf = GetValM(nzdusd,nzdusd,usdchf,usdchf);
    double nzdjpy = GetValM(nzdusd,nzdusd,usdjpy,usdjpy);
    eur[i] = ( eurusd+eurjpy+eurchf+eurgbp+euraud+eurcad+eurnzd)/7;
    usd[i] = (-eurusd+usdjpy+usdchf-gbpusd-audusd+usdcad-nzdusd)/7;
    jpy[i] = (-eurjpy-usdjpy-chfjpy-gbpjpy-audjpy-cadjpy-nzdjpy)/7;
    chf[i] = (-eurchf-usdchf+chfjpy-gbpchf-audchf-cadchf-nzdchf)/7;
    gbp[i] = (-eurgbp+gbpusd+gbpchf+gbpjpy+gbpaud+gbpcad+gbpnzd)/7;
    aud[i] = (-euraud+audusd+audjpy+audchf-gbpaud+audcad+audnzd)/7;
    cad[i] = (-eurcad-usdcad+cadjpy+cadchf-gbpcad-audcad-nzdcad)/7;
    nzd[i] = (-eurnzd+nzdusd+nzdjpy+nzdchf-gbpnzd+nzdcad-audnzd)/7;    
    i--;
  }
  if (ConvergingPlot) {
    i=CountBars;
    while (i>=0)  {
      usd[i] = usd[i] - usd[0];
      eur[i] = eur[i] - eur[0];
      jpy[i] = jpy[i] - jpy[0];
      gbp[i] = gbp[i] - gbp[0];
      aud[i] = aud[i] - aud[0];
      chf[i] = chf[i] - chf[0];
      cad[i] = cad[i] - cad[0];
      nzd[i] = nzd[i] - nzd[0];
      i--;
  } }
  return(0);
}
 
double GetVal(double v1, double v2)  {
  if (v2==0)
    return(0);
  else  
    return(MathLog(v1/v2)*10000);
}    

double GetValM(double v1, double v2, double v3, double v4)  {
  if (v2==0)
    return(0);
  else  
    return(MathLog((v1*v3)/(v2*v4))*10000);
}

double GetValD(double v1, double v2, double v3, double v4)  {
  if (v2==0 || v3==0 || v4==0)
    return(0);
  else  
    return(MathLog((v1/v3)/(v2/v4))*10000);
}
    
  
//+------------------------------------------------------------------+
#include <hanover --- extensible functions b600 (np).mqh>

