#property description "SHO"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMediumBlue
#property indicator_width1  1

input int                 inpPeriod   = 4000;          // Period 
input int                 inpHlPeriod =    2;          // Highest price period

double val[], _alpha;
int OnInit()
{
         SetIndexBuffer(0,val);
         SetIndexStyle(0,DRAW_LINE);
         _alpha = 2.0/(1.0+(inpPeriod>1 ? inpPeriod : 1));

   IndicatorSetString(INDICATOR_SHORTNAME,"Simple Harmonic Oscillator ("+(string)inpPeriod+")");
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { return; }
int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
  
   ArraySetAsSeries(val,false);
   ArraySetAsSeries(close,false);
   
   int i=prev_calculated-1; 
   if (i<0) i=0; 
   
   for (; i<rates_total && !_StopFlag; i++)
        val[i] = (i>0) ? val[i-1] + _alpha * ((close[i]>close[i-1] ? 4 : -4) - val[i-1]) : 0;
   return(rates_total);        
}