//+------------------------------------------------------------------+
//|                                                          SMI.mq4 |
//|                           Modified from Danny Feng's Ergodic.mq4 |
//+------------------------------------------------------------------+

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Silver
#property indicator_color2 Red
#property indicator_level1 50
#property indicator_level2 -50
//---- input parameters
extern int Prd=16;
extern int s=3;
extern int u=3;
extern int smooth=3;

//---- buffers
double SMI[];
double Signal[];
double Num[];
double Den[];
double s_emaNum[];
double s_emaDen[];
double u_emaNum[];
double u_emaDen[];

//----
int draw_begin1=0;
int draw_begin2=0;

//+------------------------------------------------------------------+
//|             Custom indicator initialization function             |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- additional buffers are used for counting.
IndicatorBuffers(8);
SetIndexBuffer(0,SMI);
SetIndexBuffer(1,Signal);
SetIndexBuffer(2,Num);
SetIndexBuffer(3,Den);
SetIndexBuffer(4,s_emaNum);
SetIndexBuffer(5,s_emaDen);
SetIndexBuffer(6,u_emaNum);
SetIndexBuffer(7,u_emaDen);


//---- indicator lines
SetIndexStyle(0,DRAW_LINE);

//---- name for DataWindow and indicator subwindow label
short_name="SMI";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexLabel(1,"Signal");
IndicatorDigits(2);

//----
draw_begin1=Prd+s+u+smooth;
SetIndexDrawBegin(0,draw_begin1);

//----
return(0);
}
//+------------------------------------------------------------------+
//|                  SMI                                             |
//+------------------------------------------------------------------+
int start() {

int i,k,limit;
double Hi, Lo;

int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;


//---- 
   i=Bars-Prd;
   if(counted_bars>Prd) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double min=1000000;
      double max=-1000000;
      k=i+Prd-1;
      while(k>=i)
        {
         Lo=Low[k];
         if(min>Lo) min=Lo;
         Hi=High[k];
         if(max<Hi) max=Hi;
         k--;
        }
      Num[i]= Close[i]-(0.5*(max+min));
      Den[i]=max-min;
      i--;
     }


for(i=0; i<limit; i++) 
{
s_emaNum[i]=iMAOnArray(Num,Bars,s,0,MODE_EMA, i);
s_emaDen[i]=iMAOnArray(Den,Bars,s,0,MODE_EMA, i);
}

for(i=0; i<limit; i++) 
{
u_emaNum[i]=iMAOnArray(s_emaNum,Bars,u,0,MODE_EMA,i);
u_emaDen[i]=iMAOnArray(s_emaDen,Bars,u,0,MODE_EMA,i);
}

for(i=0; i<limit; i++)
{
SMI[i] = 100 * u_emaNum[i] / (0.5 * u_emaDen[i]) ;
} 

for(i=0; i<limit; i++)
{
Signal[i] = iMAOnArray(SMI,Bars,smooth,0,MODE_EMA,i);
} 


return(0);
}
//+------------------------------------------------------------------+