/// <summary> /// Computes the next value for this indicator from the given state. /// </summary> /// <param name="input">The input value to this indicator on this time step</param> /// <returns>A a value for this indicator</returns> protected override decimal ComputeNextValue(TradeBar input) { if (_previousHighMaximum == 0 && _previousLowMinimum == 0) { _previousHighMaximum = input.High; _previousLowMinimum = input.Low; } if (input.Volume == 0 || input.High == input.Low) { _sma.Update(input.Time, 0); return(_sma.Current.Value); } var midValue = ((input.High + input.Low) / 2) - ((_previousHighMaximum + _previousLowMinimum) / 2); var midRatio = ((input.Volume / _scale) / (input.High - input.Low)); _previousHighMaximum = input.High; _previousLowMinimum = input.Low; _sma.Update(input.Time, midValue / midRatio); return(_sma.Current.Value); }
protected override decimal ComputeNextValue(IndicatorDataPoint input) { double ifish = 0d; double normalized; mean.Update(input); sd.Update(input); if (mean.IsReady && sd.IsReady && sd != 0) { normalized = (double)(4 * (input - mean) / sd); ifish = (Math.Exp(2 * normalized) - 1) / (Math.Exp(2 * normalized) + 1); } return((decimal)ifish); }