/// <summary> /// Computes the average value /// </summary> /// <param name="time"></param> /// <param name="input">The data for the calculation</param> /// <returns>The average value</returns> protected override DoubleArray Forward(long time, DoubleArray input) { var price = (input[HighIdx] + input[LowIdx]) / 2; _high.Add(input[HighIdx]); _low.Add(input[LowIdx]); // our first data point just return identity if (_high.Samples <= _high.Size) { return(price); } var hh = _high.Take(_n / 2).Max(); var ll = _low.Take(_n / 2).Min(); var n1 = (hh - ll) / (_n / 2); hh = _high.Skip(_n / 2).Take(_n / 2).Max(); ll = _low.Skip(_n / 2).Take(_n / 2).Min(); var n2 = (hh - ll) / (_n / 2); var n3 = (_high.Max() - _low.Min()) / _n; double dimen = 0; if (n1 + n2 > 0 && n3 > 0) { dimen = Math.Log((n1 + n2) / n3) / Math.Log(2); } var alpha = Math.Exp(_w * (dimen - 1)); if (alpha < .01d) { alpha = .01d; } if (alpha > 1) { alpha = 1; } return(alpha * price + (1 - alpha) * Current.Value); }