title: How to stop Indicator from calculating on every tick, when I only need the indicator at bar close?
body: <p>This is an indicator I downloaded from the internet but I have made some modifications. I noticed the indicator calculates the linear regression line and the upper and lower bands on EVERY tick.</p>
  
  <p>I find that to be resource wasteful as I only need the line to be calculated at the close of each bar; i.e. when bar 0 ends and a new bar 0 is formed. </p>
  
  <p>It should not calculate anything while bar 0 is still incomplete. </p>
  
  <p>How I do make the necessary changes?</p>
  
  <p>Thanks!!</p>
  
  <pre><code>//+------------------------------------------------------------------+
  //|                                       Linear Regression Line.mq4 |
  //|                                                      MQL Service |
  //|                                           scripts@mqlservice.com |
  //+------------------------------------------------------------------+
  #property copyright "MQL Service"
  #property link      "www.mqlservice.com"
  
  #property indicator_chart_window
  #property indicator_buffers   3
  
  #property indicator_color1    White
  #property indicator_width1    2
  
  #property indicator_color2    Orange
  #property indicator_width2    2
  
  #property indicator_color3    Orange
  #property indicator_width3    2
  
  //---- input parameters
  extern int LRLPeriod = 20;
  extern int Number_SD = 2;
  
  //---- buffers
  double LRLBuffer[], LRLBuffer_Upper[], LRLBuffer_Lower[];
  
  //int shift = 0;
  int n = 0;
  double sumx = 0;
  double sumy = 0;
  double sumxy = 0;
  double sumx2 = 0;
  double sumy2 = 0;
  double yint = 0;
  double r = 0;
  double m = 0;
  
  //+------------------------------------------------------------------+
  //|                    INITIALIZATION FUNCTION                       |
  //+------------------------------------------------------------------+
  int init()
  {
  //---- indicators
  SetIndexStyle(0, DRAW_LINE);
  SetIndexBuffer(0, LRLBuffer);
  SetIndexStyle(1, DRAW_LINE);
  SetIndexBuffer(1, LRLBuffer_Upper);
  SetIndexStyle(2, DRAW_LINE);
  SetIndexBuffer(2, LRLBuffer_Lower);
  
  IndicatorDigits(Digits);
  if (LRLPeriod &lt; 2) 
      LRLPeriod = 2;
  
  IndicatorShortName("Linear Regression Line ("+LRLPeriod+")");
  SetIndexDrawBegin(0, LRLPeriod+2);
  IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS)+4);
  
  return(0);
  }
  
  //+------------------------------------------------------------------+
  //|                   DEINITIALIZATION FUNCTION                      |
  //+------------------------------------------------------------------+
  int deinit()
  {
  return(0);
  }
  
  //+------------------------------------------------------------------+
  //|                      ITERATION FUNCTION                          |
  //+------------------------------------------------------------------+
  int start()
  {
  int limit, j, Counted_bars;
  int counted_bars = IndicatorCounted();
  
  if (counted_bars &lt; 0) 
      counted_bars = 0;
  
  if (counted_bars &gt; 0) 
      counted_bars--;
  
  limit = Bars - counted_bars;
  
  for (int shift=limit-1; shift &gt;= 0; shift--)
  {
      sumx = 0;
      sumy = 0;
      sumxy = 0;
      sumx2 = 0;
      sumy2 = 0;
      for (n = 0; n &lt;= LRLPeriod-1; n++)
      { 
          sumx = sumx + n;
          sumy = sumy + Close[shift + n];
          sumxy = sumxy + n * Close[shift + n];
          sumx2 = sumx2 + n * n;
          sumy2 = sumy2 + Close[shift + n] * Close[shift + n]; 
      }
      double temp = LRLPeriod * sumx2 - sumx * sumx;
      if (temp == 0)
          temp = .0000001;
  //      m = (LRLPeriod * sumxy - sumx * sumy) / (LRLPeriod * sumx2 - sumx * sumx); 
      m = (LRLPeriod * sumxy - sumx * sumy) / temp; 
  
      temp = LRLPeriod;
      if (temp == 0)
          temp = .0000001;
      yint = (sumy + m * sumx) / temp; // was LRLPeriod (obviously)
  
      temp = MathSqrt((LRLPeriod * sumx2 - sumx * sumx) * (LRLPeriod * sumy2 - sumy * sumy));
      if (temp == 0)
          temp = .0000001;
      r = (LRLPeriod * sumxy - sumx * sumy) / temp;
  
  
      LRLBuffer[shift] = yint - m * LRLPeriod;
  
      //Print (" "+shift+" "+LRLBuffer[shift]);
  }
  
  //----------Added Upper and Lower Bands--------------//
  
     int    nBARs   = 0;  
     double LRLBuffer_CPY[];                        
     ArraySetAsSeries(LRLBuffer_CPY,True);                   
  
     j  = Bars - Counted_bars - 1;         
     while( j &gt;  0 )                              
     {      
      ArrayCopy( LRLBuffer_CPY, LRLBuffer, 0, j, WHOLE_ARRAY );
  
      double StDev  = iStdDevOnArray( LRLBuffer_CPY, nBARs, LRLPeriod, 0, MODE_SMA, 0 );  
  
     LRLBuffer_Upper[j] = LRLBuffer[j] + (Number_SD * StDev);                                    
     LRLBuffer_Lower[j] = LRLBuffer[j] - (Number_SD * StDev);                                     
  
     j--;
    }
  
  
  
  return(0);
  }
  //+------------------------------------------------------------------+
  </code></pre>