/// <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)); }
/// <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))); }