// TRIPLE EMA OSCILLATOR (TRIX) public static IEnumerable <TrixResult> GetTrix <TQuote>( IEnumerable <TQuote> history, int lookbackPeriod, int?signalPeriod = null) where TQuote : IQuote { // convert history to basic format List <BasicData> bdList = Cleaners.ConvertHistoryToBasic(history, "C"); // validate parameters ValidateTrix(bdList, lookbackPeriod); // initialize List <TrixResult> results = new List <TrixResult>(bdList.Count); decimal? lastEma = null; List <EmaResult> emaN1 = CalcEma(bdList, lookbackPeriod).ToList(); List <BasicData> bd2 = emaN1 .Where(x => x.Ema != null) .Select(x => new BasicData { Date = x.Date, Value = (decimal)x.Ema }) .ToList(); List <EmaResult> emaN2 = CalcEma(bd2, lookbackPeriod).ToList(); List <BasicData> bd3 = emaN2 .Where(x => x.Ema != null) .Select(x => new BasicData { Date = x.Date, Value = (decimal)x.Ema }) .ToList(); List <EmaResult> emaN3 = CalcEma(bd3, lookbackPeriod).ToList(); // compose final results for (int i = 0; i < emaN1.Count; i++) { EmaResult e1 = emaN1[i]; int index = i + 1; TrixResult result = new TrixResult { Date = e1.Date }; results.Add(result); if (index >= 3 * lookbackPeriod - 2) { EmaResult e2 = emaN2[index - lookbackPeriod]; EmaResult e3 = emaN3[index - 2 * lookbackPeriod + 1]; result.Ema3 = e3.Ema; if (lastEma != null && lastEma != 0) { result.Trix = 100 * (e3.Ema - lastEma) / lastEma; } lastEma = e3.Ema; // optional SMA signal GetTrixSignal(signalPeriod, index, lookbackPeriod, results); } } return(results); }
// TRIPLE EMA OSCILLATOR (TRIX) public static IEnumerable <TrixResult> GetTrix( IEnumerable <Quote> history, int lookbackPeriod, int?signalPeriod = null) { // convert history to basic format IEnumerable <BasicData> bd = Cleaners.ConvertHistoryToBasic(history, "C"); // validate parameters ValidateTrix(bd, lookbackPeriod); // initialize List <TrixResult> results = new List <TrixResult>(); decimal? lastEma = null; List <EmaResult> emaN1 = CalcEma(bd, lookbackPeriod).ToList(); List <BasicData> bd2 = emaN1 .Where(x => x.Ema != null) .Select(x => new BasicData { Index = null, Date = x.Date, Value = (decimal)x.Ema }) .ToList(); List <EmaResult> emaN2 = CalcEma(bd2, lookbackPeriod).ToList(); List <BasicData> bd3 = emaN2 .Where(x => x.Ema != null) .Select(x => new BasicData { Index = null, Date = x.Date, Value = (decimal)x.Ema }) .ToList(); List <EmaResult> emaN3 = CalcEma(bd3, lookbackPeriod).ToList(); // compose final results for (int i = 0; i < emaN1.Count; i++) { EmaResult e1 = emaN1[i]; TrixResult result = new TrixResult { Index = e1.Index, Date = e1.Date }; results.Add(result); if (e1.Index >= 3 * lookbackPeriod - 2) { EmaResult e2 = emaN2[e1.Index - lookbackPeriod]; EmaResult e3 = emaN3[e2.Index - lookbackPeriod]; result.Ema3 = e3.Ema; if (lastEma != null && lastEma != 0) { result.Trix = 100 * (e3.Ema - lastEma) / lastEma; } lastEma = e3.Ema; // optional SMA if (signalPeriod != null && e1.Index >= 3 * lookbackPeriod - 2 + signalPeriod) { decimal sumSma = 0m; for (int p = e1.Index - (int)signalPeriod; p < e1.Index; p++) { sumSma += (decimal)results[p].Trix; } result.Signal = sumSma / signalPeriod; } } } return(results); }