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