/// <summary> /// Computes the next value of this indicator from the given state /// </summary> /// <param name="time"></param> /// <param name="input">The input given to the indicator</param> /// <returns>A new value for this indicator</returns> protected override DoubleArray Forward(long time, DoubleArray input) { _trueRange.Update(time, input); if (Samples == 1) { _previousInput = input.Clone(); return(50.0d); } var buyingPressure = new DoubleArrayScalar(input[CloseIdx] - Math.Min(input[LowIdx], _previousInput.Close)); _sumBuyingPressure1.Update(time, buyingPressure); _sumBuyingPressure2.Update(time, buyingPressure); _sumBuyingPressure3.Update(time, buyingPressure); _sumTrueRange1.Update(time, _trueRange.Current); _sumTrueRange2.Update(time, _trueRange.Current); _sumTrueRange3.Update(time, _trueRange.Current); _previousInput = input; if (!IsReady) { return(50.0d); } var average1 = _sumBuyingPressure1 / _sumTrueRange1; var average2 = _sumBuyingPressure2 / _sumTrueRange2; var average3 = _sumBuyingPressure3 / _sumTrueRange3; return(100.0d * (4 * average1 + 2 * average2 + average3) / 7); }
/// <summary> /// Computes the next value of this indicator from the given state /// </summary> /// <param name="time"></param> /// <param name="input">The input given to the indicator</param> /// <returns>A new value for this indicator</returns> protected override DoubleArray Forward(long time, DoubleArray input) { // compute the true range and then send it to our smoother TrueRange.Update(time, input); _smoother.Update(time, TrueRange); return(_smoother.Current.Value); }
/// <summary> /// Computes the next value of this indicator from the given state /// </summary> /// <param name="time"></param> /// <param name="input">The input given to the indicator</param> /// <returns>A new value for this indicator</returns> protected override DoubleArray Forward(long time, DoubleArray input) { _tr.Update(time, input); if (!IsReady) { _atr.Update(time, input); return(input[CloseIdx] != 0 ? _atr / input[CloseIdx] * 100 : 0d); } if (Samples == _period + 1) { // first output value is SMA of TrueRange _atr.Update(time, input); _lastAtrValue = _atr; } else { // next TrueRange values are smoothed using Wilder's approach _lastAtrValue = (_lastAtrValue * (_period - 1) + _tr) / _period; } return(input[CloseIdx] != 0 ? _lastAtrValue / input[CloseIdx] * 100 : 0d); }