/// <summary> /// Calculate Triple Exponential Moving Average, as described here: /// <see href="https://en.wikipedia.org/wiki/Triple_exponential_moving_average"/> /// </summary> /// <param name="series">input time series</param> /// <param name="n">averaging length</param> /// <param name="parentId">caller cache id, optional</param> /// <param name="memberName">caller's member name, optional</param> /// <param name="lineNumber">caller line number, optional</param> /// <returns>TEMA time series</returns> public static ITimeSeries <double> TEMA(this ITimeSeries <double> series, int n, CacheId parentId = null, [CallerMemberName] string memberName = "", [CallerLineNumber] int lineNumber = 0) { var cacheId = new CacheId(parentId, memberName, lineNumber, series.GetHashCode(), n); return(series .Multiply(3.0, cacheId) .EMA(n, cacheId) .Subtract( series .Multiply(3.0, cacheId) .EMA(n, cacheId) .EMA(n, cacheId), cacheId) .Add( series .EMA(n, cacheId) .EMA(n, cacheId) .EMA(n, cacheId), cacheId)); }