//+------------------------------------------------------------------+
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
#property link      "www.forex-tsd.com"
//------------------------------------------------------------------

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  DeepSkyBlue

//
//
//
//
//

extern string TimeFrame  = "Current time frame";
extern int    Kijun      = 26;
extern int    KijunShift = 3;

//
//
//
//
//

double kj[];

//
//
//
//
//

string indicatorFileName;
bool   calculateValue;
bool   returnBars;
int    timeFrame;

//
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//

int init()
{
   
     SetIndexBuffer(0,kj); SetIndexLabel(0,"Kijun Sen");
     
      //
      //
      //
      //
      //
   
         indicatorFileName = WindowExpertName();
         calculateValue    = TimeFrame=="calculateValue"; if (calculateValue) { return(0); }
         returnBars        = TimeFrame=="returnBars";     if (returnBars)     { return(0); }
         timeFrame         = stringToTimeFrame(TimeFrame);
         SetIndexShift(0,KijunShift * timeFrame/Period());  
   
      //
      //
      //
      //
      // 
       
     
     IndicatorShortName(timeFrameToString(timeFrame)+"  Kijun-Sen");
     
return(0);
}

int deinit() {  return(0);}

//
//
//
//                           
//
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//

int start()
{
   int counted_bars=IndicatorCounted();
   int i,k,limit;
   
   
   if(counted_bars < 0) return(-1);
   if(counted_bars > 0) counted_bars--;
           limit = MathMin(Bars-counted_bars,Bars-1);
           if (returnBars) { kj[0] = MathMin(limit+1,Bars-1); return(0); }

   //
   //
   //
   //
   //


   if (calculateValue || timeFrame==Period())
   { 
     for (i=limit; i>=0; i--)
     {
       
        double khi    = High[i];
        double klo    = Low[i];
        double kprice = 0;
        if  (i >= Bars - Kijun) continue;
        for (k = 1; k < Kijun; k++)
        {
           kprice = High[i+k];
           if(khi < kprice)  khi  = kprice;
         
           kprice = Low[i+k];
           if(klo  > kprice) klo  = kprice;
        }
        
        if ((khi+klo) > 0.0) 
             kj[i] = (khi + klo)/2; 
        else kj[i] = 0;
            
     }
     return(0);
     }
     
    //
    //
    //
    //
    //

    limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"returnBars",0,0)*timeFrame/Period()));
    for (i=limit; i>=0; i--)
    {
       int y = iBarShift(NULL,timeFrame,Time[i]);
          kj[i] = iCustom(NULL,timeFrame,indicatorFileName,"calculateValue",Kijun,KijunShift,0,y);
    }
 return(0);
}

//
//
//
//
//

string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int    iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

//
//
//
//
//

int stringToTimeFrame(string tfs)
{
   StringToUpper(tfs);
   for (int i=ArraySize(iTfTable)-1; i>=0; i--)
         if (tfs==sTfTable[i] || tfs==""+iTfTable[i]) return(MathMax(iTfTable[i],Period()));
                                                      return(Period());
}
string timeFrameToString(int tf)
{
   for (int i=ArraySize(iTfTable)-1; i>=0; i--) 
         if (tf==iTfTable[i]) return(sTfTable[i]);
                              return("");
}