private static IEnumerable <SmaData> ExponentialMovingAverageImpl_CD(List <CandleData> source, int length) { Queue <CandleData> sample = new Queue <CandleData>(length); double multipler = 2d / (length + 1d); var lastEma = double.MinValue; foreach (var curCandle in source) { if (sample.Count == length) { sample.Dequeue(); } sample.Enqueue(curCandle); if (sample.Count == length) { SmaData emaResult; if (lastEma == double.MinValue) { var newSmaData = new SmaData { ActualPrice = curCandle.Close, Time = curCandle.Time }; newSmaData.SmaValue = (double)sample.Average(c => c.Close); emaResult = newSmaData; } else { var newSmaData = new SmaData { ActualPrice = curCandle.Close, Time = curCandle.Time }; newSmaData.SmaValue = multipler * ((double)curCandle.Close - lastEma) + lastEma; emaResult = newSmaData; } //yield returns an intermediate value and saves to final result incrementally lastEma = emaResult.SmaValue; yield return(emaResult); } } }
private static IEnumerable <SmaData> SimpleMovingAverageImpl_CD(IEnumerable <CandleData> source, int SmaInterval, int sampleLength) { var tempSourceCopy = source.Where((candleData, i) => i % SmaInterval == 0).ToList(); Queue <CandleData> sample = new Queue <CandleData>(sampleLength); foreach (var d in tempSourceCopy) { if (sample.Count == sampleLength) { sample.Dequeue(); } sample.Enqueue(d); if (sample.Count == sampleLength) { var lastItem = sample.Last(); var newSmaData = new SmaData { ActualPrice = lastItem.Close, Time = lastItem.Time }; newSmaData.SmaValue = (double)sample.Average(s => s.Close); yield return(newSmaData); } } }