예제 #1
0
        /// <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);
        }
예제 #2
0
 /// <summary>
 /// Resets this indicator to its initial state
 /// </summary>
 public override void Reset()
 {
     base.Reset();
     CloseBand.Reset();
     RangeBand.Reset();
     _previousInputs.Reset();
     Signal?.Reset();
 }