//+------------------------------------------------------------------+
//|                                                          NR7.mq4 |
//|                                                      googolyenfx |
//|                               http://googolyenfx.blog18.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "googolyenfx"
#property link      "http://googolyenfx.blog18.fc2.com/"

#property indicator_chart_window
#property indicator_buffers 1

#property indicator_width1 3
#property indicator_color1 Blue

extern int OfDays = 7;
extern int Wingdings = 244;
extern color Clr = Blue;

double NR[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0, NR);
   SetIndexLabel(0,"NarrowRange");
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, indicator_width1, Clr);
   SetIndexArrow(0, Wingdings);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit = Bars - IndicatorCounted() - 1;
   
   for (int i=1; i<limit; i++) {
      NR[i] = EMPTY_VALUE;
      if (isNarrowRange(i)) {
         NR[i] = High[i] + 5*Point;
      }
   }
   return(0);
  }

bool isNarrowRange(int start) {
   double narrow = 1000.0, range;
   int end = start + OfDays;
   int index = -1;
   for (int i = start; i <= end; i++) {
      if (Bars < i) {
         break;
      }
      range = High[i] - Low[i];
      
      if (Period() == PERIOD_D1 && TimeDayOfWeek(Time[i]) == 0) {
         continue;
      }
      if (range <= narrow) {
         index = i;
         narrow = range;
      }
   }
   
   if (start == index) {
      return (true);
   }
   else {
      return (false);
   }
}
//+------------------------------------------------------------------+