public override List <Signal> GetSignals(List <Quote> q, Parameters p)
        {
            if (p.CalculatedIndicatorFirstDaysInterval == p.CalculatedIndicatorSecondDaysInterval)
            {
                throw new Exception("Both DaysIntervals parameters have the same value. The signals cannot be generated.");
            }

            q = q.OrderBy(z => z.Date).ToList();

            int shortDayInterval = p.CalculatedIndicatorFirstDaysInterval;
            int longDayInterval  = p.CalculatedIndicatorSecondDaysInterval;

            if (shortDayInterval > longDayInterval)
            {
                int tmp = shortDayInterval;

                shortDayInterval = longDayInterval;
                longDayInterval  = tmp;
            }

            IndicatorCollectionOfValuesWithDaysInterval shortEAMDayInterval = new IndicatorCollectionOfValuesWithDaysInterval
            {
                IndicatorValues = CalculateExponentialMovingAverage(q, shortDayInterval),
                DaysInterval    = shortDayInterval
            };
            IndicatorCollectionOfValuesWithDaysInterval longEAMDayInterval = new IndicatorCollectionOfValuesWithDaysInterval
            {
                IndicatorValues = CalculateExponentialMovingAverage(q, longDayInterval),
                DaysInterval    = longDayInterval
            };

            List <Signal> obtainedSignals = DetermineSignalsFromIntersectionOfAverages(shortEAMDayInterval, longEAMDayInterval, q.Take(shortDayInterval - 1).ToList());

            return(obtainedSignals);
        }
        private List <Signal> DetermineSignalsFromIntersectionOfAverages(
            IndicatorCollectionOfValuesWithDaysInterval shortEAMDayInterval,
            IndicatorCollectionOfValuesWithDaysInterval longEAMDayInterval,
            List <Quote> quotesWithoutCalculatedIndicator)
        {
            List <Signal> calculatedSignals = new List <Signal>();

            for (int i = 0; i < quotesWithoutCalculatedIndicator.Count; i++)
            {
                calculatedSignals.Add(new Signal
                {
                    Date  = quotesWithoutCalculatedIndicator[i].Date,
                    Value = NEUTRAL_SIGNAL
                });
            }
            ;

            int daysDifferentialWithoutIntersection = shortEAMDayInterval.IndicatorValues.Count() - longEAMDayInterval.IndicatorValues.Count();

            for (int i = 0; i <= daysDifferentialWithoutIntersection; i++)
            {
                calculatedSignals.Add(new Signal
                {
                    Date  = shortEAMDayInterval.IndicatorValues[i].Date,
                    Value = NEUTRAL_SIGNAL
                });
            }
            ;

            int longEAMDayIntervalLength = longEAMDayInterval.IndicatorValues.Count;

            for (int i = 1; i < longEAMDayIntervalLength; i++)
            {
                calculatedSignals.Add(new Signal
                {
                    Date = longEAMDayInterval.IndicatorValues[i].Date
                });

                if (shortEAMDayInterval.IndicatorValues[daysDifferentialWithoutIntersection + i - 1].IndicatorValue > longEAMDayInterval.IndicatorValues[i - 1].IndicatorValue &&
                    shortEAMDayInterval.IndicatorValues[daysDifferentialWithoutIntersection + i].IndicatorValue < longEAMDayInterval.IndicatorValues[i].IndicatorValue)
                {
                    calculatedSignals[daysDifferentialWithoutIntersection + i].Value = SELL_SIGNAL;
                }
                else if (shortEAMDayInterval.IndicatorValues[daysDifferentialWithoutIntersection + i - 1].IndicatorValue <longEAMDayInterval.IndicatorValues[i - 1].IndicatorValue &&
                                                                                                                          shortEAMDayInterval.IndicatorValues[daysDifferentialWithoutIntersection + i].IndicatorValue> longEAMDayInterval.IndicatorValues[i].IndicatorValue)
                {
                    calculatedSignals[daysDifferentialWithoutIntersection + i].Value = BUY_SIGNAL;
                }
                else
                {
                    calculatedSignals[daysDifferentialWithoutIntersection + i].Value = NEUTRAL_SIGNAL;
                }
            }

            return(calculatedSignals);
        }