/// <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(DataPointBar input) { _adx.Update(input); _adxHistory.Add(_adx); return((_adx + _adxHistory[Math.Min(_adxHistory.Count - 1, _period - 1)]) / 2); }
/// <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(IndicatorDataPoint input) { _price.Add((double)input.Price); if (_price.Samples == 1) { _price.Add(_price[0]); _price.Add(_price[0]); } double signal = _a0 * _c0 * (_b0 * _price[0] + _b1 * _price[1] + _b2 * _price[2]) + _a0 * (_a1 * _filt[0] + _a2 * _filt[1]); _filt.Add(signal); return((decimal)signal); }
/// <summary> /// Computes the average value /// </summary> /// <param name="input">The data for the calculation</param> /// <returns>The average value</returns> protected override decimal ComputeNextValue(DataPointBar input) { var price = (double)(input.High + input.Low) / 2; _high.Add((double)input.High); _low.Add((double)input.Low); // our first data point just return identity if (_high.Samples <= _high.Size) { _filt = price; } double n1; double n2; double n3; double hh; double ll; double dimen = 0; double alpha; n3 = (_high.Max() - _low.Min()) / _n; hh = _high.Take(_n / 2).Max(); ll = _low.Take(_n / 2).Min(); n1 = (hh - ll) / (_n / 2); if (_high.IsReady) { hh = _high.Skip(_n / 2).Take(_n / 2).Max(); ll = _low.Skip(_n / 2).Take(_n / 2).Min(); } n2 = (hh - ll) / (_n / 2); if (n1 > 0 && n2 > 0 && n3 > 0) { dimen = (Math.Log(n1 + n2) - Math.Log(n3)) / Math.Log(2); } ; alpha = Math.Exp(_w * (dimen - 1)); if (alpha < .01) { alpha = .01; } if (alpha > 1) { alpha = 1; } _filt = alpha * price + (1 - alpha) * _filt; return((decimal)_filt); }
/// <summary> /// Computes the next value of this indicator from the given state /// </summary> /// <param name="window"></param> /// <param name="input">The input given to the indicator</param> /// <returns> /// A new value for this indicator /// </returns> protected override decimal ComputeNextValue(IReadOnlyWindow <IndicatorDataPoint> window, IndicatorDataPoint input) { int Mc = 0; int MRc = 0; decimal momersion = 50m; if (window.Count >= 3) { _multipliedDiffWindow.Add((window[0] - window[1]) * (window[1] - window[2])); } // Estimate the indicator if less than 50% of observation are zero. Avoid division by // zero and estimations with few real observations in case of forward filled data. if (this.IsReady && _multipliedDiffWindow.Count(obs => obs == 0) < 0.5 * _multipliedDiffWindow.Count) { Mc = _multipliedDiffWindow.Count(obs => obs > 0); MRc = _multipliedDiffWindow.Count(obs => obs < 0); momersion = 100m * Mc / (Mc + MRc); } return(momersion); }