/// <summary> /// Computes the next value of this indicator from the given state /// </summary> /// <param name="input">The input given to the indicator</param> /// <returns>A new value for this indicator</returns> protected override decimal ComputeNextValue(IBaseDataBar input) { if (_previousInputs.IsReady) { var a = input.Close - input.Open; var b = _previousInputs[0].Close - _previousInputs[0].Open; var c = _previousInputs[1].Close - _previousInputs[1].Open; var d = _previousInputs[2].Close - _previousInputs[2].Open; var e = input.High - input.Low; var f = _previousInputs[0].High - _previousInputs[0].Low; var g = _previousInputs[1].High - _previousInputs[1].Low; var h = _previousInputs[2].High - _previousInputs[2].Low; CloseBand.Update(input.Time, (a + 2 * (b + c) + d) / 6); RangeBand.Update(input.Time, (e + 2 * (f + g) + h) / 6); if (CloseBand.IsReady && RangeBand.IsReady && RangeBand != 0m) { _previousInputs.Add(input); var rvi = CloseBand / RangeBand; Signal?.Update(input.Time, rvi); // Checks for null before updating. return(rvi); } } _previousInputs.Add(input); return(0m); }
/// <summary> /// Resets this indicator to its initial state /// </summary> public override void Reset() { base.Reset(); CloseBand.Reset(); RangeBand.Reset(); _previousInputs.Reset(); Signal?.Reset(); }