Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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);
                }
            }
        }