private IEnumerable<Signal> AddEquityTotalling(IEnumerable<Signal> signals)
        {
            var equityTotaller = new SignalEquityPositionTotaller(signals, 100m);
            var totals = equityTotaller.Calculate();

            return signals.Select(s =>
                {
                    var total = totals.First(t => t.Key == s.Date);
                    s.CurrentEquity = total.Value;
                    return s;
                });
        }
        public void ShortIsSucessfulTest()
        {
            var signals = new[]{
                Signal.Create("SGP.L", DateTime.Today, SignalType.Sell, 1000),
                Signal.Create("SGP.L", DateTime.Today.AddDays(1), SignalType.Buy, 900)
            };

            var totaller = new SignalEquityPositionTotaller(signals, 2000);
            var result = totaller.Calculate();
            var expectedResult = new Dictionary<DateTime, decimal>{
                                                                      {DateTime.Today.AddDays(0), 2000},
                                                                      {DateTime.Today.AddDays(1), 2200}
                                                                  };
            Assert.AreEqual(expectedResult, result);
        }
        public void TakeProfitsTest()
        {
            var signals = new[]{
                Signal.Create("SGP.L", DateTime.Today, SignalType.Buy, 1000),
                Signal.Create("SGP.L", DateTime.Today.AddDays(1), SignalType.TakeProfits, 1100),
                Signal.Create("SGP.L", DateTime.Today.AddDays(2), SignalType.Sell, 1000),
                Signal.Create("SGP.L", DateTime.Today.AddDays(3), SignalType.Buy, 800),
                Signal.Create("SGP.L", DateTime.Today.AddDays(4), SignalType.TakeProfits, 880),
            };

            var totaller = new SignalEquityPositionTotaller(signals, 2000);
            var result = totaller.Calculate();
            var expectedResult = new Dictionary<DateTime, decimal>{
                                                                      {DateTime.Today.AddDays(0), 2000},
                                                                      {DateTime.Today.AddDays(1), 2200},
                                                                      {DateTime.Today.AddDays(2), 2200},
                                                                      {DateTime.Today.AddDays(3), 2640},
                                                                      {DateTime.Today.AddDays(4), 2904}
                                                                  };
            Assert.AreEqual(expectedResult, result);
        }
 public void NoSignalsTest()
 {
     var totaller = new SignalEquityPositionTotaller(new List<Signal>(), 1000);
     var result = totaller.Calculate();
     Assert.AreEqual(0, result.Count);
 }
        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;
        }