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