/// <inheritdoc /> public async Task <PagedList <PriceDto> > GetPrices(PagedFilterDefinition <PriceFilter> pagedFilterDefinition) { var results = _priceRepository.GetQueryable().Select(GetSelectDtoExpression()); results = Filter(pagedFilterDefinition.Filter, results); results = Search(pagedFilterDefinition.Search, results); results = results.Where(pagedFilterDefinition.Searches); results = results.OrderBy(pagedFilterDefinition.OrderBys); return(await results.ToPagedList(pagedFilterDefinition.Start, pagedFilterDefinition.Length)); }
/// <inheritdoc /> public async Task <PagedList <TodaySignal> > GetCurrentSignals(PagedFilterDefinition <TransactionFilter> message) { var allSignals = await _cache.Get <List <TodaySignal> >(CacheKeys.AllCurrentSignals); if (allSignals == null) { allSignals = await GetAllCurrentSignals(); await _cache.Set(CacheKeys.AllCurrentSignals, allSignals); } if (!string.IsNullOrWhiteSpace(message.Search)) { allSignals = allSignals.Where(item => item.Company.Contains(message.Search.ToUpper())).ToList(); } var first = true; if (message.OrderBys == null) { return(allSignals.ToPagedList(message.Start, message.Length)); } foreach (var orderBy in message.OrderBys) { if (!first) { continue; } if (orderBy.Column == "Indicator") { allSignals = orderBy.Desc ? allSignals.OrderByDescending(item => item.Indicator.Split(',').Length).ThenBy(item => item.Indicator).ThenBy(item => item.Company).ThenBy(item => item.Action).ToList() : allSignals.OrderBy(item => item.Indicator.Split(',').Length).ThenBy(item => item.Indicator).ThenBy(item => item.Company).ThenBy(item => item.Action).ToList(); } if (orderBy.Column == "Company") { allSignals = orderBy.Desc ? allSignals.OrderByDescending(item => item.Company).ToList() : allSignals.OrderBy(item => item.Company).ToList(); } if (orderBy.Column == "Action") { allSignals = orderBy.Desc ? allSignals.OrderByDescending(item => item.Action).ThenByDescending(item => item.Indicator.Split(',').Length).ThenBy(item => item.Indicator).ThenBy(item => item.Company).ToList() : allSignals.OrderBy(item => item.Action).ThenByDescending(item => item.Indicator.Split(',').Length).ThenBy(item => item.Indicator).ThenBy(item => item.Company).ToList(); } first = false; } return(allSignals.ToPagedList(message.Start, message.Length)); }
/// <inheritdoc /> public async Task <PagedList <MostActivePriceDto> > GetMostActive(PagedFilterDefinition <TransactionFilter> message) { var dates = await GetTwoMaxDates(); var date = dates.First(); var previousDate = dates.Last(); var prices = await _priceRepository.GetPricesForDates(dates); var ret = prices.Where(p => p.Date == date).Select(p => new MostActivePriceDto { ClosePrice = p.ClosePrice, Volume = p.Volume, CompanyName = p.Company.Code, }).ToList(); foreach (var priceDto in ret) { var firstOrDefault = prices.FirstOrDefault(p => p.Date == previousDate && p.Company.Code == priceDto.CompanyName); if (firstOrDefault != null) { var previousPrice = firstOrDefault.ClosePrice; priceDto.Change = (priceDto.ClosePrice - previousPrice) / previousPrice * 100; priceDto.Turnover = priceDto.ClosePrice * priceDto.Volume; } else { priceDto.Change = 0; priceDto.Turnover = priceDto.ClosePrice * priceDto.Volume; } } ret = ret.OrderByDescending(item => item.Volume).ToList(); if (!string.IsNullOrWhiteSpace(message.Search)) { ret = ret.Where(item => item.CompanyName.Contains(message.Search.ToUpper())).ToList(); } ret = ret.OrderBy(message.OrderBys).ToList(); return(ret.ToPagedList(message.Start, message.Length)); }
/// <inheritdoc /> public async Task <PagedList <UserTransactionDto> > GetTransactions(int userId, PagedFilterDefinition <TransactionFilter> filter) { var allTransactions = await _transactionsRepository.GetAllUserTransactions(userId); var transactions = allTransactions.Select(t => new UserTransactionDto { Date = t.Date, Price = t.Price, Quantity = t.Quantity < 0 ? -t.Quantity : t.Quantity, Action = t.Quantity < 0 ? Action.Sell : Action.Buy, Id = t.Id, CompanyName = t.Company.Code, Total = t.Quantity < 0 ? -t.Quantity * t.Price : t.Quantity * t.Price, Profit = 0 }).ToList(); foreach (var pagedTransaction in transactions) { if (pagedTransaction.Action == Action.Buy) { continue; } var pastTransactions = transactions .Where(item => item.CompanyName == pagedTransaction.CompanyName && item.Date < pagedTransaction.Date) .OrderBy(item => item.Date) .ToList(); var quantity = 0m; var price = 0m; foreach (var pastTransaction in pastTransactions) { if (pastTransaction.Action == Action.Buy) { price = (price * quantity + pastTransaction.Price * pastTransaction.Quantity) / (quantity + pastTransaction.Quantity); quantity += pastTransaction.Quantity; } else { quantity -= pastTransaction.Quantity; } } pagedTransaction.Profit = pagedTransaction.Quantity * (pagedTransaction.Price - price); } if (!string.IsNullOrWhiteSpace(filter.Search)) { transactions = transactions.Where(item => item.CompanyName.Contains(filter.Search.ToUpper())).ToList(); } transactions = transactions.OrderBy(filter.OrderBys).ToList(); return(transactions.ToPagedList(filter.Start, filter.Length)); }
/// <inheritdoc /> public async Task<PagedList<OwnedCompanyStocksDto>> GetOwnedStocks(int currentUserId, PagedFilterDefinition<TransactionFilter> searchMessage) { var transactionsByCompany = await _transactionsService.GetTransactionsByCompany(currentUserId); var currentPrices = await _priceService.GetCurrentPrices(transactionsByCompany.Keys.Select(k => k.Id).ToList()); var ret = transactionsByCompany.Select(entry => BuildCompanyOwnedStocksDto(currentUserId, entry, currentPrices)); if (!string.IsNullOrWhiteSpace(searchMessage.Search)) ret = ret.Where(item => item.CompanyName.Contains(searchMessage.Search.ToUpper())); ret = ret.OrderBy(searchMessage.OrderBys); return ret.ToPagedList(searchMessage.Start, searchMessage.Length); }