Esempio n. 1
0
        public IEnumerable <string> GetAllRecommendations(PortfolioState portfolio)
        {
            var recommendations = GetRecommendations(portfolio);

            if (recommendations.Any())
            {
                yield return("Recommendations for today:");

                foreach (var r in recommendations)
                {
                    yield return(r);
                }
            }
            else
            {
                yield return("Now all in the defined range.");
            }

            var marks = GetMarksStatus(portfolio);

            if (!string.IsNullOrEmpty(marks))
            {
                yield return(marks);
            }

            yield return("TOTALS: " + GetSummary(portfolio));
        }
        public void GetPortfolios_WithValidInputs_ReturnsPortfolios()
        {
            PortfolioState portfolio = new PortfolioState
            {
                AccountCount = 2,
                AsOfDate     = DateTime.Now,
                Number       = "1",
                Name         = "Henry!",
                TotalBalance = 100.0M
            };
            List <PortfolioState> list = new List <PortfolioState> {
                portfolio
            };

            Mock <IDataProcessor> mock = new Mock <IDataProcessor>();

            mock.Setup(m => m.GetPortfolios()).Returns(list as object);

            PortfolioController controller = new PortfolioController(mock.Object);
            object result     = controller.GetPortfolios();
            object portfolios = null;

            if (result is OkObjectResult)
            {
                portfolios = ((OkObjectResult)result).Value;
            }

            Assert.AreEqual(portfolios, list as object);
        }
Esempio n. 3
0
        public string GetSummary(PortfolioState portfolio)
        {
            try
            {
                var stockSummary =
                    portfolio.Stocks
                    .GroupBy(s => s.Currency)
                    .Select(g =>
                {
                    var amounts = g.Select(s =>
                    {
                        var amt = s.Trades.Select(t => t.Quantity).Sum()
                                  * (portfolio.Prices[s.Id].LastPrice ?? -1);
                        if (amt < 0)
                        {
                            throw new Exception("Negative amount on: " + s.Code);
                        }
                        return(amt);
                    });
                    return(new { Currency = g.Key, Amount = amounts.Sum() });
                })
                    .ToList();

                stockSummary.Add(new
                {
                    Currency = "TotalEUR",
                    Amount   = stockSummary.Select(s => s.Amount * portfolio.RatesToEur[s.Currency]).Sum()
                });

                return(string.Join("; ", stockSummary.Select(s => $"{s.Currency}: {Math.Round(s.Amount, 2)}")));
            } catch (Exception ex)
            {
                return(ex.Message);
            }
        }
Esempio n. 4
0
        public string GetRatesMessage(PortfolioState portfolio)
        {
            var rates = portfolio.RatesToEur.Keys
                        .Where(k => k != "EUR")
                        .Select(k => $"{k}: {Math.Round(portfolio.RatesToEur[k], 2)}");

            return($"FxRates: {string.Join(", ", rates)}.");
        }
Esempio n. 5
0
    public void TestPortfolioEquality()
    {
        Portfolio LeftObject
            = Portfolio.GetDefault();
        Portfolio RightObject
            = Portfolio.GetPortfolio("{{GNOME}}", "{{NONE}}", "{{NONE}}");

        Assert.That(LeftObject, PortfolioState.Matches(RightObject));
    }
Esempio n. 6
0
        public List <string> GetRecommendations(PortfolioState portfolio)
        {
            var recommendation = portfolio.Stocks
                                 .SelectMany(s => s.PriceMarks.Select(pm => new { Stock = s, Mark = pm }))
                                 .Where(spm =>
                                        (spm.Mark.Type.Trim() == "buy" && spm.Mark.Price >= portfolio.Prices[spm.Stock.Id].LastPrice) ||
                                        (spm.Mark.Type.Trim() == "sell" && spm.Mark.Price <= portfolio.Prices[spm.Stock.Id].LastPrice));

            return(recommendation.Select(mark =>
            {
                var relative = mark.Mark.Type.Trim() == "buy" ? "below" : "above";
                return
                $"{mark.Stock.Code} {portfolio.Prices[mark.Stock.Id].LastPrice} {relative} {mark.Mark.Price} [{mark.Mark.Comment}]";
            }).ToList());
        }
Esempio n. 7
0
        public async Task LoadPortfolio(UserInfo userInfo, PortfolioState portfolio)
        {
            var channelName = userInfo.ChannelId == "emulator" ? "facebook" : userInfo.ChannelId;
            var channelId   = userInfo.ChannelId == "emulator" ? "2304256339648941" : userInfo.User.Id;
            var r           = await GetStocks(channelName, channelId);

            portfolio.Status = r.Status;
            if (r.Status != Api.StockStatus.Success)
            {
                return;
            }
            portfolio.Stocks   = r.Stocks.ToArray();
            portfolio.LoadedAt = DateTime.Now;
            portfolio.Prices   = new Dictionary <int, Api.Price>();
            //await stepContext.Context.SendActivityAsync($"You have {r.Count()} positions.");
            var currencies = portfolio.Stocks.Select(s => s.Currency).Distinct();

            portfolio.RatesToEur = await GetRatesToEur(currencies);
        }
Esempio n. 8
0
        public string GetMarksStatus(PortfolioState portfolio)
        {
            var missingMarks = portfolio.Stocks
                               .Where(s => !s.PriceMarks.Any(pm => pm.Type.Trim() == "buy") ||
                                      !s.PriceMarks.Any(pm => pm.Type.Trim() == "sell"))
                               .Select(s => s.Code);

            if (missingMarks.Any())
            {
                return("Missing marks on: " + string.Join(", ", missingMarks));
            }

            var width = portfolio.Stocks.Sum(s =>
            {
                var lowMark  = s.PriceMarks.Where(pm => pm.Type.Trim() == "buy").Max(pm => pm.Price);
                var highMark = s.PriceMarks.Where(pm => pm.Type.Trim() == "sell").Min(pm => pm.Price);
                return((highMark - lowMark) * s.Trades.Sum(t => t.Quantity) * portfolio.RatesToEur[s.Currency]);
            });

            return("Marks width is EUR " + Math.Round(width, 2));
        }
Esempio n. 9
0
        public async Task <List <string> > LoadPrices(PortfolioState portfolio)
        {
            foreach (var portfolioStock in portfolio.Stocks)
            {
                if (!portfolio.Prices.ContainsKey(portfolioStock.Id))
                {
                    var p = await GetPrice(portfolioStock.Code, portfolioStock.Exchange);

                    if (p?.LastPrice != null)
                    {
                        portfolio.Prices[portfolioStock.Id] = p;
                    }
                }
            }

            var missing = portfolio.Stocks
                          .Where(s => !portfolio.Prices.ContainsKey(s.Id) || portfolio.Prices[s.Id].LastPrice <= 0)
                          .Select(s => s.Code)
                          .ToList();

            return(missing);
        }
Esempio n. 10
0
 private void AddPortfolioState(PortfolioState portfolio)
 {
     DataClient.Upsert(CouchbaseConfigManager.Instance.PortfolioBucketName, portfolio);
 }
Esempio n. 11
0
 public Portfolio(string username, PortfolioState state)
 {
     Username        = username;
     _portfolioState = state;
 }
Esempio n. 12
0
 public Snapshot()
 {
     State = new PortfolioState();
 }