コード例 #1
0
        /// <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));
        }
コード例 #2
0
        /// <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));
        }
コード例 #3
0
        /// <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));
        }
コード例 #4
0
        /// <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));
        }
コード例 #5
0
        /// <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);
        }