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