Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
        /// <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;
        }
Ejemplo n.º 5
0
        /// <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;
        }
Ejemplo n.º 6
0
        /// <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;
        }
Ejemplo n.º 7
0
        /// <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;
        }