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); }
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); } }
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)}."); }
public void TestPortfolioEquality() { Portfolio LeftObject = Portfolio.GetDefault(); Portfolio RightObject = Portfolio.GetPortfolio("{{GNOME}}", "{{NONE}}", "{{NONE}}"); Assert.That(LeftObject, PortfolioState.Matches(RightObject)); }
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()); }
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); }
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)); }
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); }
private void AddPortfolioState(PortfolioState portfolio) { DataClient.Upsert(CouchbaseConfigManager.Instance.PortfolioBucketName, portfolio); }
public Portfolio(string username, PortfolioState state) { Username = username; _portfolioState = state; }
public Snapshot() { State = new PortfolioState(); }