/// <summary> /// Calculates indicator. /// </summary> /// <param name="price">Price series.</param> /// <param name="period">Indicator period.</param> /// <param name="timeSeries">Instrument <c>ohlc</c> time series.</param> /// <returns>Calculated indicator series.</returns> public static double[] Calculate(double[] price, int period, TimeSeries timeSeries) { Condition.Requires(price, "price") .IsNotEmpty(); Condition.Requires(period, "period") .IsGreaterThan(0) .IsLessOrEqual(price.Length); Condition.Requires(timeSeries, "timeSeries") .IsNotNull(); var wpr = new double[price.Length]; for (var i = period; i < price.Length; i++) { var highest = double.MinValue; var lowest = double.MaxValue; for (int j = i - period + 1; j <= i; j++) { if (timeSeries.High[j] > highest) { highest = timeSeries.High[j]; } if (timeSeries.Low[j] < lowest) { lowest = timeSeries.Low[j]; } } wpr[i] = -100 * (highest - timeSeries.Close[i]) / (highest - lowest); } return wpr; }
/// <summary> /// Calculates indicator. /// </summary> /// <param name="period">Indicator period.</param> /// <param name="timeSeries">Instrument <c>ohlc</c> time series.</param> /// <returns>Calculated indicator series.</returns> public static double[] Calculate(int period, TimeSeries timeSeries) { Condition.Requires(timeSeries, "timeSeries") .IsNotNull(); Condition.Requires(period, "period") .IsGreaterThan(0) .IsLessOrEqual(timeSeries.Close.Length); var temp = new double[timeSeries.Close.Length]; temp[0] = 0; for (var i = 1; i < timeSeries.Close.Length; i++) { var diff1 = Math.Abs(timeSeries.Close[i - 1] - timeSeries.High[i]); var diff2 = Math.Abs(timeSeries.Close[i - 1] - timeSeries.Low[i]); var diff3 = timeSeries.High[i] - timeSeries.Low[i]; var max = diff1 > diff2 ? diff1 : diff2; temp[i] = max > diff3 ? max : diff3; } var atr = SMA.Calculate(temp, period); return atr; }
/// <summary> /// Calculates indicator. /// </summary> /// <param name="price">Price series.</param> /// <param name="period">Indicator period.</param> /// <param name="timeSeries">Instrument <c>ohlc</c> time series.</param> /// <returns>Calculated indicator series.</returns> public static double[] Calculate(double[] price, int period, TimeSeries timeSeries) { Condition.Requires(price, "price") .IsNotEmpty(); Condition.Requires(period, "period") .IsGreaterThan(0) .IsLessOrEqual(price.Length); Condition.Requires(timeSeries, "timeSeries") .IsNotNull(); var dx = new double[price.Length]; var pDi = DmiPlus.Calculate(price, period, timeSeries); var mDi = DmiMinus.Calculate(price, period, timeSeries); for (var i = 0; i < price.Length; ++i) { var diff = pDi[i] + mDi[i]; if (diff.IsAlmostZero()) { dx[i] = 0; } else { dx[i] = 100 * (Math.Abs(pDi[i] - mDi[i]) / (pDi[i] + mDi[i])); } } var adx = EMA.Calculate(dx, period); return adx; }
/// <summary> /// Calculates indicator. /// </summary> /// <param name="price">Price series.</param> /// <param name="period">Indicator period.</param> /// <param name="timeSeries">Instrument <c>ohlc</c> time series.</param> /// <returns>Calculated indicator series.</returns> public static double[] Calculate(double[] price, int period, TimeSeries timeSeries) { Condition.Requires(price, "price") .IsNotEmpty(); Condition.Requires(period, "period") .IsGreaterThan(0) .IsLessOrEqual(price.Length); Condition.Requires(timeSeries, "timeSeries") .IsNotNull(); var mdm = new double[price.Length]; mdm[0] = 0.0; for (int i = 1; i < price.Length; ++i) { var plusDm = timeSeries.High[i] - timeSeries.High[i - 1]; var minusDm = timeSeries.Low[i - 1] - timeSeries.Low[i]; if (plusDm < 0) { plusDm = 0; } if (minusDm < 0) { minusDm = 0; } if (plusDm.AlmostEqual(minusDm)) { minusDm = 0; } else if (plusDm >= minusDm) { minusDm = 0; } var trueHigh = timeSeries.High[i] > price[i - 1] ? timeSeries.High[i] : price[i - 1]; var trueLow = timeSeries.Low[i] < price[i - 1] ? timeSeries.Low[i] : price[i - 1]; var tr = trueHigh - trueLow; if (tr.IsAlmostZero()) { mdm[i] = 0; } else { mdm[i] = 100 * minusDm / tr; } } var dmi = EMA.Calculate(mdm, period); return dmi; }
/// <summary> /// Calculates indicator. /// </summary> /// <param name="period">Indicator period.</param> /// <param name="timeSeries">Instrument <c>ohlc</c> time series.</param> /// <returns>Calculated indicator series.</returns> public static double[] Calculate(int period, TimeSeries timeSeries) { Condition.Requires(timeSeries, "timeSeries") .IsNotNull(); Condition.Requires(period, "period") .IsGreaterThan(0) .IsLessOrEqual(timeSeries.Close.Length); var atr = ATR.Calculate(period, timeSeries); var atrp = new double[atr.Length]; for (var i = period; i < timeSeries.Close.Length; i++) { atrp[i] = atr[i] * 100.0 / timeSeries.Close[i]; } return atrp; }
/// <summary> /// Calculates indicator. /// </summary> /// <param name="price">Price series.</param> /// <param name="period">Indicator period.</param> /// <param name="timeSeries">Instrument <c>ohlc</c> time series.</param> /// <returns>Calculated indicator series.</returns> public static double[] Calculate(double[] price, int period, TimeSeries timeSeries) { Condition.Requires(price, "price") .IsNotEmpty(); Condition.Requires(period, "period") .IsGreaterThan(0) .IsLessOrEqual(price.Length); Condition.Requires(timeSeries, "timeSeries") .IsNotNull(); var bears = new double[price.Length]; var ema = EMA.Calculate(price, period); for (var i = 0; i < price.Length; i++) { bears[i] = timeSeries.Low[i] - ema[i]; } return bears; }
/// <summary> /// Calculates indicator. /// </summary> /// <param name="timeSeries">Instrument <c>ohlc</c> time series.</param> /// <returns>Calculated indicator series.</returns> public static double[] Calculate(TimeSeries timeSeries) { Condition.Requires(timeSeries, "timeSeries") .IsNotNull(); var bop = new double[timeSeries.Open.Length]; for (var i = 0; i < timeSeries.Open.Length; i++) { if (timeSeries.High[i].AlmostEqual(timeSeries.Low[i])) { bop[i] = 0; } else { bop[i] = (timeSeries.Close[i] - timeSeries.Open[i]) / (timeSeries.High[i] - timeSeries.Low[i]); } } return bop; }