//+------------------------------------------------------------------+
//|                                                        Index.mq4 |
//|                                         KG_modified_by_wiedstone |
//+------------------------------------------------------------------+
#property copyright "KG_modified_by_wiedstone"
#property link  ""

#property indicator_separate_window
#property indicator_buffers 4

#property indicator_levelcolor C'20,30,30'
#property indicator_level1 75
#property indicator_level2 50
#property indicator_level3 25

extern string Readme1	= "#--- Periode Input",
				  Readme2	= "5M 15M 30M 1H 4H 8H 16H",
				  Readme3	= "1D 1W 2W 1MH 4MH 6MH 1Y",						
				  Readme4	= "R4H R8H RD RW RM R4M", 
				  Periode	= "RD";
                	
extern int    MA_Period = 1,               
              All_Bars  = 500,            
              Width     = 2;    
              
extern bool ShowAllCurrency = false;               
              
int Stoch_Period,CBar,MA_Method = MODE_SMA,wIndex;
//---- buffers
double AUD_idx[],CAD_idx[],CHF_idx[],NZD_idx[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   if(GlobalVariableCheck("CBar"))
		CBar = GlobalVariableGet("CBar");
	else	
		GlobalVariableSet("CBar",0);	

   if(Periode == "1Y")			{Stoch_Period = MathCeil(345600/Period());}
	else if(Periode == "6MH")	{Stoch_Period = MathCeil(172800/Period());}
	else if(Periode == "4MH")	{Stoch_Period = MathCeil(115200/Period());}
	else if(Periode == "1MH")	{Stoch_Period = MathCeil(28800/Period());}
	else if(Periode == "2W")	{Stoch_Period = MathCeil(14400/Period());}
	else if(Periode == "1W")	{Stoch_Period = MathCeil(7200/Period());}
	else if(Periode == "1D")	{Stoch_Period = MathCeil(1440/Period());}
	else if(Periode == "16H")	{Stoch_Period = MathCeil(960/Period());}
	else if(Periode == "8H")	{Stoch_Period = MathCeil(480/Period());}
	else if(Periode == "4H")	{Stoch_Period = MathCeil(240/Period());}
	else if(Periode == "1H")	{Stoch_Period = MathCeil(60/Period());}
	else if(Periode == "30M")	{Stoch_Period = MathCeil(30/Period());}
	else if(Periode == "15M")	{Stoch_Period = MathCeil(15/Period());}
	else if(Periode == "5M")	{Stoch_Period = MathCeil(5/Period());}
	else if(Periode == "1M")	{Stoch_Period = MathCeil(1/Period());}	
	else if(Periode == "R4H")  {Stoch_Period = MathCeil(getrenkodailyavg()/6); }
   else if(Periode == "R8H")	{Stoch_Period = MathCeil(getrenkodailyavg()/3); }
   else if(Periode == "RD")	{Stoch_Period = MathCeil(getrenkodailyavg()); }
   else if(Periode == "RW")	{Stoch_Period = MathCeil(getrenkoweeklyavg()); }
   else if(Periode == "RM")	{Stoch_Period = MathCeil(getrenkomonthlyavg()); }
   else if(Periode == "R4M")  {Stoch_Period = MathCeil(getrenkomonthlyavg()*4); }
	else{
		Alert("Periode Salah");
		return(0);
	}      
//---- indicators   
   SetIndexBuffer(0,AUD_idx);
   SetIndexLabel(0,"AUD "+Periode);   
   SetIndexBuffer(1,CAD_idx);
   SetIndexLabel(1,"CAD "+Periode);
   SetIndexBuffer(2,CHF_idx);
   SetIndexLabel(2,"CHF "+Periode);
   SetIndexBuffer(3,NZD_idx);
   SetIndexLabel(3,"NZD "+Periode);

   if (StringFind(Symbol(), "AUD", 0) > -1) SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,Width,DarkOrange);
   else {
      if (ShowAllCurrency) SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,Width,DarkOrange);
      else SetIndexStyle(0,DRAW_NONE);
   }
   if (StringFind(Symbol(), "CAD", 0) > -1) SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,Width,Purple);
   else {
      if (ShowAllCurrency) SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,Width,Purple);
      else SetIndexStyle(1,DRAW_NONE);
   }
   if (StringFind(Symbol(), "CHF", 0) > -1) SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,Width,Blue);
   else {
      if (ShowAllCurrency) SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,Width,Blue);
      else SetIndexStyle(2,DRAW_NONE);
   }
   if (StringFind(Symbol(), "NZD", 0) > -1) SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,Width,Teal);
   else {
      if (ShowAllCurrency) SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,Width,Teal);
      else SetIndexStyle(3,DRAW_NONE);
   }
   
   IndicatorShortName("ACa X ChN ("+Periode+") :");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i,counted_bars=IndicatorCounted();
   int limit=All_Bars;
//----
   limit=Bars-counted_bars;
   
   if((CBar!=0) && (limit>=CBar))
		limit=CBar;
   
   for(i=0;i<limit;i++)
     {
      AUD_idx[i]   = GetSTOCHbasket_AUD(Stoch_Period,MA_Period,i);
      CAD_idx[i]   = GetSTOCHbasket_CAD(Stoch_Period,MA_Period,i); 
      CHF_idx[i]   = GetSTOCHbasket_CHF(Stoch_Period,MA_Period,i);
      NZD_idx[i]   = GetSTOCHbasket_NZD(Stoch_Period,MA_Period,i);
     }   
     
   SetLabel("Index4", "AUD", 8, "Arial Bold", DarkOrange, wIndex, 875, 10);
   SetLabel("Index5", "CAD", 8, "Arial Bold", Purple, wIndex, 900, 10);
   SetLabel("Index6", "CHF", 8, "Arial Bold", Blue, wIndex, 925, 10);
   SetLabel("Index7", "NZD", 8, "Arial Bold", Teal, wIndex, 950, 10);  
//----
   return(0);
  }
//+------------------------------------------------------------------+
double GetSTOCHbasket_AUD(int K_Period,int S_Period,int pos)
{
   double STOCHbasket;
   double r1, r2, r3, r4, r5, r6, r7;
   
   int suffix_size = StringLen(Symbol()) - 6;
   string suffix = StringSubstr(Symbol(),6,suffix_size); 
   
   r1 = iStochastic("AUDCAD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r2 = iStochastic("AUDUSD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r3 = iStochastic("AUDJPY"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r4 = iStochastic("AUDCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r5 = iStochastic("AUDNZD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r6 = 100-iStochastic("GBPAUD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r7 = 100-iStochastic("EURAUD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   
   STOCHbasket = r1 + r2 + r3 + r4 + r5 + r6 + r7;   
   STOCHbasket = STOCHbasket / 7.0;
   
   return(STOCHbasket);
}

double GetSTOCHbasket_CAD(int K_Period,int S_Period,int pos)
{
   double STOCHbasket;
   double r1, r2, r3, r4, r5, r6, r7;
   
   int suffix_size = StringLen(Symbol()) - 6;
   string suffix = StringSubstr(Symbol(),6,suffix_size); 
   
   r1 = 100-iStochastic("AUDCAD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r2 = 100-iStochastic("GBPCAD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r3 = 100-iStochastic("EURCAD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r4 = 100-iStochastic("NZDCAD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r5 = 100-iStochastic("USDCAD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r6 = iStochastic("CADJPY"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r7 = iStochastic("CADCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   
   STOCHbasket = r1 + r2 + r3 + r4 + r5 + r6 + r7;   
   STOCHbasket = STOCHbasket / 7.0;
   
   return(STOCHbasket);
}

double GetSTOCHbasket_CHF(int K_Period,int S_Period,int pos)
{
   double STOCHbasket;
   double r1, r2, r3, r4, r5, r6, r7;
   
   int suffix_size = StringLen(Symbol()) - 6;
   string suffix = StringSubstr(Symbol(),6,suffix_size); 
   
   r1 = 100-iStochastic("USDCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r2 = 100-iStochastic("EURCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r3 = 100-iStochastic("GBPCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r4 = 100-iStochastic("NZDCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r5 = 100-iStochastic("AUDCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r6 = iStochastic("CHFJPY"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r7 = 100-iStochastic("CADCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos); 
   
   STOCHbasket = r1 + r2 + r3 + r4 + r5 + r6 + r7;   
   STOCHbasket = STOCHbasket / 7.0;
   
   return(STOCHbasket);
}

double GetSTOCHbasket_NZD(int K_Period,int S_Period,int pos)
{
   double STOCHbasket;
   double r1, r2, r3, r4, r5, r6, r7;
   
   int suffix_size = StringLen(Symbol()) - 6;
   string suffix = StringSubstr(Symbol(),6,suffix_size); 
   
   r1 = iStochastic("NZDCAD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r2 = iStochastic("NZDUSD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r3 = iStochastic("NZDJPY"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r4 = iStochastic("NZDCHF"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r5 = iStochastic("AUDNZD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r6 = 100-iStochastic("GBPNZD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   r7 = 100-iStochastic("EURNZD"+suffix,0,K_Period,1,S_Period,MA_Method,0,MODE_MAIN,pos);
   
   STOCHbasket = r1 + r2 + r3 + r4 + r5 + r6 + r7;   
   STOCHbasket = STOCHbasket / 7.0;
   
   return(STOCHbasket);
}

int getrenkodailyavg()
{
   int temp;
   int hasil=0;
   int hari=20;
   for(int i=0;i<hari;i++)
   {
      if(TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))==0 || TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))==6)hari=hari+1;
      if(TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))!=0 && TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))!=6)
      {
         if(i==0)
         {
            temp=iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i))),false);
         }
         else
         {
            temp=iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i))),false)-iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i-1))),false);
         }
         hasil=hasil+temp;
      }
   }
   return(MathCeil(hasil/20));

}

int getrenkoweeklyavg()
{
   int temp;
   int hasil=0;
   int hari=80;
   for(int i=0;i<hari;i++)
   {
      if(TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))==0 || TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))==6)hari=hari+1;
      if(TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))!=0 && TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))!=6)
      {
         if(i==0)
         {
            temp=iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i))),false);
         }
         else
         {
            temp=iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i))),false)-iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i-1))),false);
         }
         hasil=hasil+temp;
      }
   }
   return(MathCeil(hasil/16));

}

int getrenkomonthlyavg()
{
   int temp;
   int hasil=0;
   int hari=240;
   for(int i=0;i<hari;i++)
   {
      if(TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))==0 || TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))==6)hari=hari+1;
      if(TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))!=0 && TimeDayOfWeek(iTime(NULL,PERIOD_D1,i))!=6)
      {
         if(i==0)
         {
            temp=iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i))),false);
         }
         else
         {
            temp=iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i))),false)-iBarShift(NULL,0,StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,i-1))),false);
         }
         hasil=hasil+temp;
      }
   }
   return(MathCeil(hasil/12));
   
}

void SetLabel(string label_, string text_, int size_, string font_, color color_, int Corner_, int x_, int y_)
{
   int wIndex = WindowFind("ACa X ChN ("+Periode+") :");
      
   ObjectDelete(label_);
   ObjectCreate( label_, OBJ_LABEL, wIndex, 0, 0 );
   ObjectSetText(label_, text_, size_, font_, color_);
   ObjectSet( label_, OBJPROP_CORNER, 0 );
   ObjectSet( label_, OBJPROP_XDISTANCE, x_ );
   ObjectSet( label_, OBJPROP_YDISTANCE, y_ );   
}