/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
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; } }