Exemple #1
0
        /// <summary>
        /// To handle the input value.
        /// </summary>
        /// <param name="input">The input value.</param>
        /// <returns>The resulting value.</returns>
        protected override IIndicatorValue OnProcess(IIndicatorValue input)
        {
            //если кол-во в буфере больше Shift, то первое значение отдали в прошлый раз, удалим его.
            if (Buffer.Count > Shift)
            {
                Buffer.RemoveAt(0);
            }

            var smaResult = _sma.Process(_medianPrice.Process(input));

            if (_sma.IsFormed & input.IsFinal)
            {
                Buffer.Add(smaResult.GetValue <decimal>());
            }

            return(Buffer.Count > Shift
                                ? new DecimalIndicatorValue(this, Buffer[0])
                                : new DecimalIndicatorValue(this));
        }
Exemple #2
0
        /// <inheritdoc />
        protected override IIndicatorValue OnProcess(IIndicatorValue input)
        {
            var newValue = input.GetValue <decimal>();

            if (!_isInitialized)
            {
                if (input.IsFinal)
                {
                    _last          = newValue;
                    _isInitialized = true;
                }

                return(new DecimalIndicatorValue(this));
            }

            var delta = newValue - _last;

            var gainValue = _gain.Process(input.SetValue(this, delta > 0 ? delta : 0m)).GetValue <decimal>();
            var lossValue = _loss.Process(input.SetValue(this, delta > 0 ? 0m : -delta)).GetValue <decimal>();

            if (input.IsFinal)
            {
                _last = newValue;
            }

            if (lossValue == 0)
            {
                return(new DecimalIndicatorValue(this, 100m));
            }

            if (gainValue / lossValue == 1)
            {
                return(new DecimalIndicatorValue(this, 0m));
            }

            return(new DecimalIndicatorValue(this, 100m - 100m / (1m + gainValue / lossValue)));
        }