//+------------------------------------------------------------------+
//| Schaff Trendy.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "perky_z@yahoo.com & Darkstonexa@yahoo.com.au"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
#property indicator_minimum -10.000000
#property indicator_maximum 110.000000

//---- input parameters

extern int MAShort=23;
extern int MALong=50;
extern int Cycle=10;
extern int BarsCount=300;

//

int shift=0;
double MCD=0, LLV=0, HHV=0, i=0, s=0 ,MA_Short=0, MA_Long=0, ST=0;
double smconst=0;
bool check_begin=false;
bool check_begin_MA=false;
int sum=0, n=0, bars_=0;
//int MA=0, prev=0;
double MA=0.0, prev=0.0;
double MCD_Arr[300];
//---- buffers
double TrendBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{

//---- 3 additional buffers are used for counting.
IndicatorBuffers(1);
//---- indicator buffers
SetIndexBuffer(0,TrendBuffer);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));

//---- name for DataWindow and indicator subwindow label
IndicatorShortName("Schaff Trend("+Cycle+")");
SetIndexDrawBegin(0,TrendBuffer);


return(0);
}

//+------------------------------------------------------------------+
//| Average Directional Movement Index |
//+------------------------------------------------------------------+
int start()
{
   check_begin = false;
   check_begin_MA = false;
   n = 1;
   s = 1;
   
   double a=1+Cycle/2;
   smconst =1/a;
   if ( BarsCount > 0)
   {
      if (BarsCount > Bars)
      {
         bars_ = Bars;
      }
      else
      {
         bars_ = BarsCount;
      }
   }
   for (shift= bars_ ; shift>=0; shift--)
      {
         MA_Short=iMA(NULL,0,MAShort,0,MODE_EMA,PRICE_TYPICAL,shift);
         MA_Long=iMA(NULL,0,MALong,0,MODE_EMA,PRICE_TYPICAL,shift);
         MCD_Arr[n] = MA_Short - MA_Long;
         MCD = MA_Short - MA_Long;

         if (n >= Cycle )
         {
            n = 1;
            check_begin = true;
         }
         else n = n + 1;

         if (check_begin)
            {
               for (int i = 1 ;i<=Cycle;i++)
                  {
                  if (i == 1) LLV = MCD_Arr[i];
                  else
                  if( LLV > MCD_Arr[i] )
                  LLV = MCD_Arr[i];
                  if (i == 1 )
                  HHV = MCD_Arr[i];
                  else
                  if( HHV < MCD_Arr[i])
                  HHV = MCD_Arr[i];
                  };

               ST = ((MCD - LLV)/(HHV - LLV))*100 + 0.01;
               s = s + 1;
               if (s >= (Cycle)/2)
                  {
                     s = 1;
                     check_begin_MA = true;
                  }
            }
         else ST = 0;

         if (check_begin_MA )
            {
               prev =TrendBuffer[shift+1];
               MA = smconst * (ST - prev) + prev;
               //Comment ("\nMa= ",MA,"\nPrev= ",prev,"\nST=  ",ST,"\nLLV=  ",LLV,"\nHHV=  ",HHV,"\nMCD= ",MCD,"\nTrendBuffer=  ",TrendBuffer[shift-1],"\n smsconst  ",smconst);
               TrendBuffer[shift]=MA;  
            }
      }
return(0);
}