Индикатор Бета - страница 3

 
winner2008:

Спасибо большое, оперативно и без флуда..
// RollingBeta.mq4

#property copyright "anonymous"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_level1 1.0

extern string symBase;
extern int wndSize;

double beta[];

int init() {
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, beta);
   return (0);
}

int start() {
   for (int shift = Bars - 2; shift >= 0; shift--) {
      int shiftBaseNow = iBarShift(symBase, Period(), Time[shift], true);
      int shiftBasePrev = iBarShift(symBase, Period(), Time[shift + 1], true);
      if ((shiftBaseNow == -1) || (shiftBasePrev == -1)) continue;
      double priceBaseNow = iClose(symBase, Period(), shiftBaseNow);
      double priceBasePrev = iClose(symBase, Period(), shiftBasePrev);
      double retBase = (priceBaseNow / priceBasePrev) - 1.0;
      double retCur = (Close[shift] / Close[shift + 1]) - 1.0;
      beta[shift] = UpdateBeta(retBase, retCur);
   }
   return (0);
}

// slightly optimized
double UpdateBeta(double retBase, double retCur) {
   static int count = 0;
   static double cov = 0.0;
   static double var = 0.0;
   static double meanBase = 0.0;
   static double meanCur = 0.0;
   double alpha = 2.0 / (1.0 + wndSize);
   meanBase += alpha * (retBase - meanBase);
   meanCur += alpha * (retCur - meanCur);
   retBase -= meanBase;
   cov += alpha * (retBase * (retCur - meanCur) - cov);
   var += alpha * (retBase * retBase - var);
   if (count < wndSize) { count++; return (EMPTY_VALUE); }
   return (cov / var);
}
Причина обращения: