//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "www.forex-station.com"
#property link      "www.forex-station.com"

#property indicator_chart_window
#property indicator_buffers    2
#property indicator_color1     clrRed
#property indicator_color2     clrBlue
#property indicator_width1     2
#property indicator_width2     2
#property strict

//
//
//
//
//

extern ENUM_TIMEFRAMES TimeFrame        = PERIOD_CURRENT;   // Time frame
extern int             Tenkan           = 12;               // Tenkan period
extern int             Kijun            = 26;               // Kijun period
extern int             TenkanShift      = 3;                // Tenkan shift
extern int             KijunShift       = 9;                // Kijun shift
extern bool            Interpolate      = true;             // Interpolate in multi time frame mode?
//
//
//
//
//

double ks[],ts[],tsksmacd[],count[];

string indicatorFileName;
#define _mtfCall(_buff,_ind) iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,Tenkan,Kijun,TenkanShift,KijunShift,_buff,_ind)

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int init()
{
     IndicatorBuffers(3);
     SetIndexBuffer(0, ts);
     SetIndexBuffer(1, ks);  
     SetIndexBuffer(2, count); 
     
     indicatorFileName = WindowExpertName();
     TimeFrame         = MathMax(TimeFrame,_Period);
     SetIndexShift(0,TenkanShift * TimeFrame/Period()); 
     SetIndexShift(1,KijunShift  * TimeFrame/Period());
        
    IndicatorShortName(timeFrameToString(TimeFrame)+"  Tenkan Sen - Kijun Sen");
return(0);
}
int deinit() {  return(0);}

//
//
//
//                           
//
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//

int start()
{
   int counted_bars=IndicatorCounted();
      if(counted_bars<0) return(-1);
      if(counted_bars>0) counted_bars--;
         int limit = fmin(Bars-counted_bars,Bars-1); count[0]=limit;
            if (TimeFrame!=_Period)
            {
               limit = (int)fmax(limit,fmin(Bars-1,_mtfCall(3,0)*TimeFrame/_Period));
               for (int i=limit;i>=0 && !_StopFlag; i--)
               {
                  int y = iBarShift(NULL,TimeFrame,Time[i]);
                     ts[i] = _mtfCall(0,y);
                     ks[i] = _mtfCall(1,y);
                     if (!Interpolate || (i>0 && y==iBarShift(NULL,TimeFrame,Time[i-1]))) continue;
                  
                     //
                     //
                     //
                     //
                     //
                  
                     #define _interpolate(buff) buff[i+k] = buff[i]+(buff[i+n]-buff[i])*k/n
                     int n,k; datetime time = iTime(NULL,TimeFrame,y);
                        for(n = 1; (i+n)<Bars && Time[i+n] >= time; n++) continue;	
                        for(k = 1; k<n && (i+n)<Bars && (i+k)<Bars; k++) 
                        {
                           _interpolate(ts);
                           _interpolate(ks);
                         }
               }
      return(0);
      }    
      
      //
      //
      //
      //
      //
              
      for (int i=limit; i>=0; i--)
     {
        if (i>=Bars-Tenkan) continue;
        double thi = High[i];
        double tlo = Low[i];
         for (int k = 1; k<Tenkan; k++)
         {
             if(thi<High[i+k]) thi = High[i+k];
             if(tlo>Low[i+k])  tlo =  Low[i+k];
         }
          if ((thi+tlo) > 0.0) 
               ts[i] = (thi+tlo)*0.5; 
          else ts[i] = 0;
       
          //
          //
          //
          //
          //
        
           if (i>=Bars-Kijun) continue;
           double khi = High[i];
           double klo = Low[i];
           for (int k = 1; k<Kijun; k++)
           {
             if(khi<High[i+k]) khi = High[i+k];
             if(klo>Low[i+k])  klo =  Low[i+k];
           }
           if ((khi+klo) > 0.0) 
               ks[i] = (khi+klo)*0.5; 
           else ks[i] = 0;
      }
return(0);
}

//
//
//
//
//

string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int    iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

string timeFrameToString(int tf)
{
   for (int i=ArraySize(iTfTable)-1; i>=0; i--) 
         if (tf==iTfTable[i]) return(sTfTable[i]);
                              return("");
}

