/*
   Multple Time Frame Trix T3 Indicator for THV System
   This Multiple Time Frame TRIX T3 is for MTF purposes
   The original TRIX T3 remains untouched (orginal by Luis Damiani)
   
   Make sure the variable (strBaseCodeFileName) is set to the Original Trix filename...
*/

#property copyright "Modified MTF Trix by Peter D."

#property indicator_separate_window

#property indicator_buffers     4
#property indicator_color1      Green     // Fast Trix Up
#property indicator_color2      Crimson   // Fast Trix Down
#property indicator_color3      Lime      // Slow Trix Up
#property indicator_color4      Red       // Slow Trix Down

//---- input parameters
extern string     TimeFrameInfo0 = "<<< Time Frame >>>";

extern int        TimeFrame = 0;
extern string     TimeFrameInfo1 = "";
extern string     TimeFrameInfo2 = "use: '0' for current timeframe";
extern string     TimeFrameInfo3 = "1->M1, 5->M5, 15->M15, 30->M30";
extern string     TimeFrameInfo4 = "60->H1, 240->H4, 1440->D1";
extern string     TimeFrameInfo5 = "10080->W1, 43200->MN1";
extern string     TimeFrameInfo6 = "or use auto=true for 1 period higher";
extern bool       autotimeframe=true;
extern bool       autotimeframe2=false;


extern string strBaseCodeFileName = "THV3 Trix for MTFHisto";
string   indicatorName;
//---- Arrays for Trix values
double dblMain[];
double dblSignal[];

// Indicator Buffers //
double dblTrixFastUp[];
double dblTrixFastDown[];
double dblTrixSlowUp[];
double dblTrixSlowDown[];

//+------------------------------------------------------------------+
//| init()
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,dblTrixFastUp);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,dblTrixFastDown);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,dblTrixSlowUp);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,dblTrixSlowDown);
//----

  if(autotimeframe==true)
   {
   TimeFrame=getPeriod();
   }
   
  if(autotimeframe2==true)
   {
   TimeFrame=getPeriod2();
   }
   
   string strTimeFrame = GetPeriodName(TimeFrame);
   indicatorName = "THV3 - MTF Any Trix (" + strTimeFrame + ")";
   IndicatorShortName(indicatorName);
//----

 
   
      return(0);
  }

//+------------------------------------------------------------------+
//| start()
//+------------------------------------------------------------------+
int start()
  {
   datetime dtmTime[];
   int i;
   int j;
   int intMaxVal;
   int intTotBars = IndicatorCounted();

   intMaxVal = Bars - intTotBars;
   ArrayCopySeries(dtmTime, MODE_TIME, Symbol(), TimeFrame); 
   ArrayResize(dblMain, intMaxVal);ArrayResize(dblSignal, intMaxVal);
   j = 0;
   
   // Calculate TRIX Values //
   for(i=0; i<intMaxVal; i++)
   {
      if (Time[i] < dtmTime[j]) j++; 
      dblMain[i]=iCustom(NULL, TimeFrame, strBaseCodeFileName,  6, j);
      dblSignal[i]=iCustom(NULL, TimeFrame, strBaseCodeFileName,  7, j);
   }

   // Coloring //
   for(i=intMaxVal-2; i>=0; i--)
   {
      dblTrixFastUp[i] = EMPTY_VALUE; dblTrixFastDown[i] = EMPTY_VALUE;
      dblTrixSlowUp[i] = EMPTY_VALUE; dblTrixSlowDown[i] = EMPTY_VALUE;
      if (dblMain[i+1] < dblMain[i])
      {
         if (dblTrixFastUp[i+1] == EMPTY_VALUE) dblTrixFastUp[i+1] = dblMain[i+1];
         dblTrixFastUp[i] = dblMain[i];
      }
      else if (dblMain[i+1]>dblMain[i])
      {
         if (dblTrixFastDown[i+1] == EMPTY_VALUE) dblTrixFastDown[i+1] = dblMain[i+1];
         dblTrixFastDown[i] = dblMain[i];
      }
      else
      {
         if (dblTrixFastUp[i+1]   != EMPTY_VALUE) dblTrixFastUp[i]   = dblTrixFastUp[i+1];
         if (dblTrixFastDown[i+1] != EMPTY_VALUE) dblTrixFastDown[i] = dblTrixFastDown[i+1];
      }

      if(dblSignal[i+1]<dblSignal[i])
      {
         if (dblTrixSlowUp[i+1] == EMPTY_VALUE) dblTrixSlowUp[i+1] = dblSignal[i+1];
         dblTrixSlowUp[i] = dblSignal[i];
      }   
      else if (dblSignal[i+1]>dblSignal[i])
      {
         if (dblTrixSlowDown[i+1] == EMPTY_VALUE) dblTrixSlowDown[i+1] = dblSignal[i+1];
         dblTrixSlowDown[i] = dblSignal[i];
      }
      else
      {
         if (dblTrixSlowUp[i+1]   != EMPTY_VALUE) dblTrixSlowUp[i]   = dblTrixSlowUp[i+1];
         if (dblTrixSlowDown[i+1] != EMPTY_VALUE) dblTrixSlowDown[i] = dblTrixSlowDown[i+1];
      }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//-----------------------------------------------------------------------------//
//  Get TimeFrame
//-----------------------------------------------------------------------------//
string GetPeriodName(int intPeriod)
{
   string strPeriod = "unknown";

   if (intPeriod == PERIOD_M1)  strPeriod = "M1";
   if (intPeriod == PERIOD_M5)  strPeriod = "M5";
   if (intPeriod == PERIOD_M15) strPeriod = "M15";
   if (intPeriod == PERIOD_M30) strPeriod = "M30";
   if (intPeriod == PERIOD_H1)  strPeriod = "H1";
   if (intPeriod == PERIOD_H4)  strPeriod = "H4";
   if (intPeriod == PERIOD_D1)  strPeriod = "D1";
   if (intPeriod == PERIOD_W1)  strPeriod = "W1";
   if (intPeriod == PERIOD_MN1) strPeriod = "MN1";
   if (intPeriod == 0) strPeriod = GetPeriodName(Period());

   return(strPeriod);
}
int getPeriod()
  {
      int tf=0;
     
                switch(Period())
                  {
                    case 1:
                      tf=5;
                     
                      break;
                   case 5:
                      tf=15; 
                      
                      break;
                   case 15:
                      tf=30;  
                     
                      break;
                   case 30:
                      tf=60; 
                       
                      break;
                   case 60:
                     tf=240; 
                     
                      break;
                   case 240:
                      tf=1440;
                       
                      break;
                   case 1440:
                      tf=10080;
                      
                      break;
                   case 10080:
                      tf=43200;
                      
                      break;
                   case 43200:
                      tf=43200; 
                      
                      break;
                  }
           
         return(tf);
      }
      
      int getPeriod2()
  {
      int tf=0;
     
                switch(Period())
                  {
                    case 1:
                      tf=15;
                     
                      break;
                   case 5:
                      tf=30; 
                      
                      break;
                   case 15:
                      tf=60;  
                     
                      break;
                   case 30:
                      tf=240; 
                       
                      break;
                   case 60:
                     tf=1440; 
                     
                      break;
                   case 240:
                      tf=10080;
                       
                      break;
                   case 1440:
                      tf=43200;
                      
                      break;
                   case 10080:
                      tf=43200;
                      
                      break;
                   case 43200:
                      tf=43200; 
                      
                      break;
                  }
           
         return(tf);
      }