Пример #1
0
    // SIMPLE MOVING AVERAGE (EXTENDED VERSION)
    /// <include file='./info.xml' path='indicator/type[@name="Extended"]/*' />
    ///
    public static IEnumerable <SmaExtendedResult> GetSmaExtended <TQuote>(
        this IEnumerable <TQuote> quotes,
        int lookbackPeriods)
        where TQuote : IQuote
    {
        // convert quotes
        List <BasicD> quotesList = quotes.ConvertToBasic(CandlePart.Close);

        // initialize
        List <SmaExtendedResult> results = GetSma(quotes, lookbackPeriods)
                                           .Select(x => new SmaExtendedResult {
            Date = x.Date, Sma = x.Sma
        })
                                           .ToList();

        // roll through quotes
        for (int i = lookbackPeriods - 1; i < results.Count; i++)
        {
            int index             = i + 1;
            SmaExtendedResult r   = results[i];
            double            sma = (double)r.Sma;

            double sumMad  = 0;
            double sumMse  = 0;
            double?sumMape = 0;

            for (int p = index - lookbackPeriods; p < index; p++)
            {
                BasicD d     = quotesList[p];
                double close = d.Value;

                sumMad += Math.Abs(close - sma);
                sumMse += (close - sma) * (close - sma);

                sumMape += (close == 0) ? null
                    : Math.Abs(close - sma) / close;
            }

            // mean absolute deviation
            r.Mad = sumMad / lookbackPeriods;

            // mean squared error
            r.Mse = sumMse / lookbackPeriods;

            // mean absolute percent error
            r.Mape = sumMape / lookbackPeriods;
        }

        return(results);
    }
Пример #2
0
        public void Extended()
        {
            List <SmaExtendedResult> results = history.GetSmaExtended(20).ToList();

            // assertions

            // proper quantities
            // should always be the same number of results as there is history
            Assert.AreEqual(502, results.Count);
            Assert.AreEqual(483, results.Where(x => x.Sma != null).Count());

            // sample value
            SmaExtendedResult r = results[501];

            Assert.AreEqual(251.86m, r.Sma);
            Assert.AreEqual(9.45m, r.Mad);
            Assert.AreEqual(119.2510m, Math.Round((decimal)r.Mse, 4));
            Assert.AreEqual(0.037637m, Math.Round((decimal)r.Mape, 6));
        }