public void OneStrategyUsedTest()
        {
            var strategy = new Mock<AbstractTradingStrategy>();
            StrategyApplicabilitySetup(strategy, DateTime.Today, DateTime.Today.AddDays(4), true);
            StrategySignalSetup(strategy, SignalType.Buy, DateTime.Today);
            StrategySignalSetup(strategy, SignalType.TakeProfits, DateTime.Today.AddDays(4));

            var signalGenerator = new SignalGenerator(this.SetupDatapoints(), new[] { strategy.Object });
            var signals = signalGenerator.Generate();
            Assert.AreEqual(new[] { SignalType.Buy, SignalType.TakeProfits, }, signals.Select(s => s.SignalType).ToArray());
        }
        public void StrategyUsedUntilPositionIsClosedTest()
        {
            var strategy = new Mock<AbstractTradingStrategy>();
            StrategyApplicabilitySetup(strategy, DateTime.Today, DateTime.Today.AddDays(1), true);
            StrategyApplicabilitySetup(strategy, DateTime.Today.AddDays(2), DateTime.Today.AddDays(7), false);
            StrategySignalSetup(strategy, SignalType.Buy, DateTime.Today);
            StrategySignalSetup(strategy, SignalType.TakeProfits, DateTime.Today.AddDays(4));

            // The below signal should not be returned as the stategy should no longer be applicable
            StrategySignalSetup(strategy, SignalType.Sell, DateTime.Today.AddDays(6));

            var signalGenerator = new SignalGenerator(this.SetupDatapoints(), new[] { strategy.Object });
            var signals = signalGenerator.Generate();
            Assert.AreEqual(new[] { SignalType.Buy, SignalType.TakeProfits, }, signals.Select(s => s.SignalType).ToArray());
        }
        public void TwoStrategiesUsedTest()
        {
            var strategy1 = new Mock<AbstractTradingStrategy>();
            var strategy2 = new Mock<AbstractTradingStrategy>();

            StrategyApplicabilitySetup(strategy1, DateTime.Today, DateTime.Today.AddDays(4), true);
            StrategyApplicabilitySetup(strategy1, DateTime.Today.AddDays(5), DateTime.Today.AddDays(7), false);
            StrategyApplicabilitySetup(strategy2, DateTime.Today, DateTime.Today.AddDays(4), false);
            StrategyApplicabilitySetup(strategy2, DateTime.Today.AddDays(5), DateTime.Today.AddDays(7), true);

            StrategySignalSetup(strategy1, SignalType.Buy, DateTime.Today);
            StrategySignalSetup(strategy1, SignalType.TakeProfits, DateTime.Today.AddDays(4));
            StrategySignalSetup(strategy2, SignalType.Sell, DateTime.Today.AddDays(6));

            var signalGenerator = new SignalGenerator(this.SetupDatapoints(), new[] { strategy1.Object, strategy2.Object });
            var signals = signalGenerator.Generate();
            Assert.AreEqual(new[] { SignalType.Buy, SignalType.TakeProfits, SignalType.Sell }, signals.Select(s => s.SignalType).ToArray());
        }
        private IEnumerable<Signal> GenerateSignals(string symbol, IEnumerable<DataPoints> dataPoints)
        {
            var newSignals = new List<Signal>();

            var company = this.companyRepository.FindBySymbol(symbol);
            if (company.ExcludeYn == 0)
            {
                var generator = new SignalGenerator(dataPoints, this.CreateStrategies(dataPoints));
                var generatedSignals = generator.Generate().ToList();
                if (generatedSignals.Any())
                {
                    var totaller = new SignalEquityPositionTotaller(generatedSignals, 100);
                    var totals = totaller.Calculate();
                    var signalsToInsert = generatedSignals.Where(s => totals.ContainsKey(s.Date)).Select(s =>
                        {
                            s.CurrentEquity = totals[s.Date];
                            return s;
                        });

                    newSignals.AddRange(signalsToInsert);
                }
            }

            return newSignals;
        }