コード例 #1
0
        /// <summary>
        /// Smoothed Moving Average/Running Moving Average
        /// </summary>
        /// <returns>The smma.</returns>
        /// <param name="candleSticks">Candle sticks.</param>
        /// <param name="period">Period.</param>
        /// <param name="priceSource">Price source.</param>
        public static MovingAverage SMMA(CandleStickCollection candleSticks, int period = 14,
                                         PriceSource priceSource = PriceSource.Close)
        {
            int count = candleSticks.Count;

            double[] smma       = new double[count];
            double[] priceArray = priceSource.GetArrayFromCandleStickCollection(candleSticks);

            double sum = priceArray[0];

            //Iterate for first sum over period n
            for (int i = 0; i < period - 1; i++)
            {
                sum = sum + priceArray[i];
            }

            // First n values are zero
            smma[period - 1] = sum / period;

            for (int i = period; i < count; i++)
            {
                // No need to iterate through every sum
                sum = sum - priceArray[i - period] + priceArray[i];

                smma[i] = (sum - smma[0] + priceArray[i]) / (double)period;
            }

            return(new MovingAverage(smma, MAType.SMMA));
        }
コード例 #2
0
        /// <summary>
        /// Relatives the index of the strength.
        /// </summary>
        /// <returns>The strength index.</returns>
        /// <param name="candleSticks">Candle sticks.</param>
        /// <param name="period">Period.</param>
        public static RelativeStrengthIndex RelativeStrengthIndex(CandleStickCollection candleSticks, int period = 14,
                                                                  PriceSource priceSource = PriceSource.Close)
        {
            int count = candleSticks.Count;

            double[] priceArray = priceSource.GetArrayFromCandleStickCollection(candleSticks);
            double[] rsi        = new double[count];

            double[] up   = new double[count];
            double[] down = new double[count];
            double[] rs   = new double[count];

            for (int i = 1; i < count; i++)
            {
                if (priceArray[i] > priceArray[i - 1])
                {
                    up[i] = priceArray[i] - priceArray[i - 1];
                }
                else
                {
                    down[i] = priceArray[i - 1] - priceArray[i];
                }
            }

            for (int i = period; i < count; i++)
            {
                rs[i]  = MovingAverages.SMMA(up, period, i - period, period).MA[i] / MovingAverages.SMMA(down, period, i - period, period).MA[i];
                rsi[i] = 100 - 1 / (1 + rs[i]);
            }

            return(new RelativeStrengthIndex(rsi));
        }
コード例 #3
0
        /// <summary>
        /// Weighted Moving Average
        /// </summary>
        /// <returns>The wma.</returns>
        /// <param name="candleSticks">Candle sticks.</param>
        /// <param name="weight">Weight.</param>
        /// <param name="priceSource">Price source.</param>
        public static MovingAverage WMA(CandleStickCollection candleSticks, int weight = 14,
                                        PriceSource priceSource = PriceSource.Close)
        {
            int count = candleSticks.Count;

            double[] priceArray = priceSource.GetArrayFromCandleStickCollection(candleSticks);
            double[] wma        = new double[count];
            double[] weights    = new double[weight];
            double   sum        = weight * (weight + 1) / 2;

            for (int i = 0; i < weight; i++)
            {
                weights[i] = i / sum;
            }

            for (int i = weight - 1; i < count; i++)
            {
                for (int j = 0; j < weight; j++)
                {
                    wma[i] = wma[i] + priceArray[j + i] * weight;
                }
            }

            return(new MovingAverage(wma, MAType.WMA));
        }
コード例 #4
0
        public static BollingerBands BollingerBands(CandleStickCollection candleSticks, int period = 14,
                                                    double multiplier = 2, PriceSource priceSource = PriceSource.Close)
        {
            BollingerBands bollingerBands = new BollingerBands(candleSticks, period, multiplier, priceSource);

            return(bollingerBands);
        }
コード例 #5
0
        /// <summary>
        /// Simple Moving Average
        /// </summary>
        /// <returns>The SMA.</returns>
        /// <param name="candleSticks">Candle stick data</param>
        /// <param name="period">Time period (size of candlestick time inerval * period)</param>
        /// <param name="priceSource">Price Source (enum: open, high, low, close)</param>
        public static MovingAverage SMA(CandleStickCollection candleSticks, int period = 14,
                                        PriceSource priceSource = PriceSource.Close)
        {
            int count = candleSticks.Count;

            double[] priceArray = priceSource.GetArrayFromCandleStickCollection(candleSticks);
            double[] sma        = new double[count];
            double   sum        = priceArray[0];

            // Compute the first sum
            for (int i = 1; i < period - 1; i++)
            {
                sum = sum + priceArray[i];
            }

            sma[period - 1] = sum / period;

            for (int j = period; j < count - 1; j++)
            {
                // No more iterating required for the other sums
                sum    = sum - priceArray[j - period] + priceArray[j];
                sma[j] = sum / period;
            }

            return(new MovingAverage(sma, MAType.SMA));
        }
コード例 #6
0
ファイル: Indicators.cs プロジェクト: jwr1995/Objective-TA
        public static MovingAverageConvergenceDivergence MACD(CandleStickCollection candleSticks, int fast = 12, int slow = 26, int length = 9,
                                                              PriceSource priceSource = PriceSource.Close)
        {
            MovingAverage fastMA = MovingAverages.EMA(candleSticks, fast, priceSource);
            MovingAverage slowMA = MovingAverages.EMA(candleSticks, slow, priceSource);

            double[] macd = SubtractArray(fastMA.MA, slowMA.MA);
            return(new MovingAverageConvergenceDivergence(macd, length));
        }
コード例 #7
0
        /// <summary>
        /// Cumulative Moving Average
        /// </summary>
        /// <returns>The CMA.</returns>
        /// <param name="candleSticks">Candle sticks.</param>
        /// <param name="priceSource">Price source.</param>
        public static MovingAverage CMA(CandleStickCollection candleSticks,
                                        PriceSource priceSource = PriceSource.Close)
        {
            int count = candleSticks.Count;

            double[] cma        = new double[count];
            double[] priceArray = priceSource.GetArrayFromCandleStickCollection(candleSticks);
            cma[0] = priceArray[0];

            for (int i = 1; i < count; i++)
            {
                cma[i] = cma[i - 1] + (priceArray[i] - cma[i - 1]) / (double)i;
            }

            return(new MovingAverage(cma, MAType.CMA));
        }
コード例 #8
0
        /// <summary>
        /// Vortex Indicator Model
        /// </summary>
        /// <returns>The indicator.</returns>
        /// <param name="candleSticks">Candle stick data array.</param>
        /// <param name="period">Period.</param>
        public static VortexIndicator VortexIndicator(CandleStickCollection candleSticks, int period = 14)
        {
            int count = candleSticks.Count;

            double[] sumVMUp      = new double[count];
            double[] sumVMDown    = new double[count];
            double[] sumTrueRange = new double[count];
            double[] viUP         = new double[count];
            double[] viDown       = new double[count];

            try
            {
                for (int j = 0; j < count - period - 2; j++)
                {
                    for (int i = 1 + j; i < 1 + j + period; i++)
                    {
                        // abs(current high - current low)
                        var chcl = Abs(candleSticks[i].High - candleSticks[i].Low);
                        // abs(current low - previous close)
                        var clpc = Abs(candleSticks[i].Low - candleSticks[i - 1].Close);
                        // abs(current high - previous close)
                        var chpc = Abs(candleSticks[i].High - candleSticks[i - 1].Close);

                        //true range
                        var trueRange = Max(chcl, clpc, chpc);

                        var vmUp   = Abs(candleSticks[i].High - candleSticks[i - 1].Low);
                        var vmDown = Abs(candleSticks[i].Low - candleSticks[i - 1].High);

                        sumVMUp[j]      = sumVMUp[j] + vmUp;
                        sumVMDown[j]    = sumVMDown[j] + vmDown;
                        sumTrueRange[j] = sumTrueRange[j] + trueRange;
                    }

                    viUP[j]   = sumVMUp[j] / sumTrueRange[j];
                    viDown[j] = sumVMDown[j] / sumTrueRange[j];
                }

                return(new VortexIndicator(viUP, viDown));
            }
            catch (IndexOutOfRangeException e)
            {
                throw e;
            }
        }
コード例 #9
0
        public BollingerBands(CandleStickCollection candleSticks, int period = 20,
                              double multiplier = 2, PriceSource priceSource = PriceSource.Close)
        {
            int length = candleSticks.Count - period;

            double[]          prices = priceSource.GetArrayFromCandleStickCollection(candleSticks);
            StandardDeviation standardDeviation;

            LowerBand  = UpperBand = new double[length];
            MiddleBand = MovingAverages.SMA(candleSticks, period, priceSource).MA;

            for (int i = 0; i < length; i++)
            {
                standardDeviation = new StandardDeviation(prices.GetSegment(i, i + period), MiddleBand.GetSegment(i, i + period));
                UpperBand[i]      = MiddleBand[i] + multiplier * standardDeviation.Value;
                LowerBand[i]      = MiddleBand[i] - multiplier * standardDeviation.Value;
            }
        }
コード例 #10
0
        /// <summary>
        /// Exponential Moving Average
        /// </summary>
        /// <returns>The EMA.</returns>
        /// <param name="candleSticks">Candle sticks.</param>
        /// <param name="period">Period.</param>
        /// <param name="priceSource">Price source.</param>
        public static MovingAverage EMA(CandleStickCollection candleSticks, int period = 14,
                                        PriceSource priceSource = PriceSource.Close)
        {
            int count = candleSticks.Count;

            double[] ema = new double[count];

            double w = 1 / period;

            // Set intial value to first price value
            ema[0] = priceSource.GetValueFromCandleStick(candleSticks[0]);

            for (int i = 1; i < count; i++)
            {
                ema[i] = w * priceSource.GetValueFromCandleStick(candleSticks[i])
                         + (1.0 - w) * ema[i - 1];
            }

            return(new MovingAverage(ema, MAType.EMA));
        }