Exemplo n.º 1
0
        // 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);
        }
Exemplo n.º 2
0
        // 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);
        }