
//

double work[][4];
#define haClose 0
#define haOpen  1
#define haHigh  2
#define haLow   3

//
//
//
//
//

int start()
{
   int i,r,limit,counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
           limit=MathMin(Bars-counted_bars,Bars-1);
           if (returnBars) { gup[0] = limit+1; return(0); }

   //
   //
   //
   //
   //

   if (calculateValue || timeFrame == Period())
   {
      if (ArrayRange(work,0)!=Bars) ArrayResize(work,Bars);
      for(i=limit, r=Bars-i-1;i>=0;i--,r++)
      {
         if (r==0)
         {
            work[r][haOpen]  = (Open[i]+Close[i])/2.0;
            work[r][haClose] = (Open[i]+Close[i]+High[i]+Low[i])/4.0;
            work[r][haHigh]  = High[i];
            work[r][haLow]   = Low[i];
            continue;
         }
         
         //
         //
         //
         //
         //
            double Length  = MathMax(iHilbert(iMA(NULL,0,1,0,MODE_SMA,price,i),mode,smooth,i)/2,1);
            double maOpen  = iSmooth(Open[i], Length,Phase,i, 0);
            double maClose = iSmooth(Close[i],Length,Phase,i,10);
            double maLow   = iSmooth(Low[i],  Length,Phase,i,20);
            double maHigh  = iSmooth(High[i], Length,Phase,i,30);

            //
            //
            //
            //
            //
               
               work[r][haOpen]  = (work[r-1][haOpen]+work[r-1][haClose])/2.0;
               work[r][haClose] = (maOpen+maHigh+maLow+maClose)/4.0;
               work[r][haHigh]  = MathMax(maHigh,MathMax(work[r][haOpen],work[r][haClose]));
               work[r][haLow]   = MathMin(maLow ,MathMin(work[r][haOpen],work[r][haClose]));

            //
            //
            //
            //

               arrowUp[i] = EMPTY_VALUE;
               arrowDn[i] = EMPTY_VALUE;
               trend[i] = trend[i+1];
                  if(Close[i]>work[r-1][haHigh]) trend[i] =  1;
                  if(Close[i]<work[r-1][haLow] ) trend[i] = -1;
                  if(trend[i]!=trend[i+1])
                  { 
                     if(trend[i] ==  1) arrowUp[i] = Low[i] -arrowsDistance*iATR(NULL,0,20,i);
                     if(trend[i] == -1) arrowDn[i] = High[i]+arrowsDistance*iATR(NULL,0,20,i);
                  }                     
                  if(trend[i] == -1)
                        { gup[i] = Low[i]; gdn[i]= High[i]; }
                  else  { gdn[i] = Low[i]; gup[i]= High[i]; }
      }

      //
      //
      //
      //
      //