示例#1
0
        private void CreatePortfolioNavDates(ISession session, NavDate currentNavDate)
        {
            using (var transaction = session.BeginTransaction())
            {
                IList <Portfolio> portfolioList = portfolioRepository.GetPortfolioList(session);
                logger.Log(LogLevel.Info, $"Portfolio count: {portfolioList.Count}");

                IList <PortfolioNavDate> portfolioNavDateList = portfolioNavDateRepository.GetPortfolioNavDateListByNavDate(session, currentNavDate);
                logger.Log(LogLevel.Info, $"Portfolio with NavDate {currentNavDate.Date} count: {portfolioNavDateList.Count}");

                foreach (var portfolio in portfolioList)
                {
                    if (portfolioNavDateList.Any(p => p.Portfolio.PortfolioId == portfolio.PortfolioId))
                    {
                        continue;
                    }

                    PortfolioNavDate portfolioNavDate = new PortfolioNavDate()
                    {
                        NavDate    = currentNavDate,
                        Portfolio  = portfolio,
                        CreateDate = DateTime.Now
                    };

                    portfolioNavDateRepository.SaveOrUpdate(session, portfolioNavDate);

                    logger.Log(LogLevel.Info, $"Created NavDate {currentNavDate.Date} for Portfolio {portfolio.PortfolioId}");
                }

                transaction.Commit();
            }
        }
示例#2
0
        public void FixStatusOfPreviousNavDate(ISession session, NavDate currentNavDate)
        {
            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }

            if (currentNavDate == null)
            {
                throw new ArgumentNullException(nameof(currentNavDate));
            }

            IList <NavDate> navDateInErrorList    = navDateRepository.GetNavDateByRefreshSecurityStaticDataStatus(session, RefreshSecurityStaticDataStatus.Error);
            IList <NavDate> navDateInProgressList = navDateRepository.GetNavDateByRefreshSecurityStaticDataStatus(session, RefreshSecurityStaticDataStatus.InProgress);
            IList <NavDate> navDateToDoList       = navDateRepository.GetNavDateByRefreshSecurityStaticDataStatus(session, RefreshSecurityStaticDataStatus.ToDo);

            IList <NavDate> pendingNavDateList = navDateInErrorList.Concat(navDateInProgressList).Concat(navDateToDoList).ToList();

            logger.Log(LogLevel.Info, $"Pending NavDate retrieved: {pendingNavDateList.Count}");

            foreach (var pendingNavDate in pendingNavDateList)
            {
                if (pendingNavDate.NavDateId == currentNavDate.NavDateId)
                {
                    continue;
                }

                logger.Log(LogLevel.Info, $"NavDate [{pendingNavDate.NavDateId}, {pendingNavDate.Date}]: RefreshSecurityStaticDataStatus {pendingNavDate.RefreshSecurityStaticDataStatus} will be set to Expired");

                pendingNavDate.RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.Expired;
                navDateRepository.SaveOrUpdate(session, pendingNavDate);

                logger.Log(LogLevel.Info, $"NavDate [{pendingNavDate.NavDateId}, {pendingNavDate.Date}]: RefreshSecurityStaticDataStatus {pendingNavDate.RefreshSecurityStaticDataStatus} has been set to Expired");
            }
        }
示例#3
0
        public string GetDescription()
        {
            var description = $"{FundName}({FundCode}) 以 {AvgCost.ToString("F4")} 的价格持有 {Share.ToString("F2")} 份," +
                              $"根据 {NavDate.ToString("yyyy-MM-dd")} 的净值({FundNav.ToString("F4")}) 计算," +
                              $"市值达 {MarketValue.ToString("F2")},盈利 {PositionProfit.ToString("F2")}," +
                              $"实现 {PositionProfitRate.ToString("P")} 收益率";

            if (Abilities?.Any() ?? false)
            {
                Abilities.ForEach(a => description += $"\n{a.GetDescription()}");
            }
            return(description);
        }
示例#4
0
        public void UpdateNavDate(IStatelessSession session, NavDate navDate)
        {
            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }

            if (navDate == null)
            {
                throw new ArgumentNullException(nameof(navDate));
            }

            navDateRepository.Update(session, navDate);
        }
示例#5
0
        private void CreatePortfolioNavDateSecurityPrices(ISession session, NavDate currentNavDate)
        {
            IList <PortfolioNavDate> portfolioNavDateList = portfolioNavDateRepository.GetPortfolioNavDateListByNavDate(session, currentNavDate);

            foreach (var portfolioNavDate in portfolioNavDateList)
            {
                logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: Creating PortfolioNavDateSecurityPrices");

                IList <Entities.PortfolioSecurity> portfolioSecurityList = portfolioSecurityRepository.GetPortfolioSecurityList(session, portfolioNavDate.Portfolio);
                logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {portfolioSecurityList.Count} PortfolioSecurity Count");

                IList <PortfolioNavDateSecurityPrice> portfolioNavDateSecurityPriceList = portfolioNavDateSecurityPriceRepository.GetPortfolioNavDateSecurityPriceListByPortfolioNavDate(session, portfolioNavDate);

                IDictionary <long, Entities.PortfolioSecurity>    portfolioSecurityDictionary             = portfolioSecurityList.ToDictionary(x => x.PortfolioSecurityId);
                IDictionary <long, PortfolioNavDateSecurityPrice> portfolioNavDateSecurityPriceDictionary = portfolioNavDateSecurityPriceList.ToDictionary(x => x.PortfolioSecurity.PortfolioSecurityId);

                IList <long> missingPortfolioSecurityList = portfolioSecurityDictionary.Keys.Except(portfolioNavDateSecurityPriceDictionary.Keys).ToList();

                logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {portfolioNavDateSecurityPriceList.Count}/{portfolioSecurityList.Count} PortfolioSecurityPrices already been created");
                logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {missingPortfolioSecurityList.Count} PortfolioSecurityPrices need to be created");

                using (var transaction = session.BeginTransaction())
                {
                    foreach (var portfolioSecurityId in missingPortfolioSecurityList)
                    {
                        Entities.PortfolioSecurity portfolioSecurity = portfolioSecurityDictionary[portfolioSecurityId];

                        PortfolioNavDateSecurityPrice portfolioNavDateSecurityPrice = new PortfolioNavDateSecurityPrice()
                        {
                            PortfolioNavDate  = portfolioNavDate,
                            PortfolioSecurity = portfolioSecurity,
                            PriceStatus       = PriceStatus.ToBeRequested,
                            CreateDate        = DateTime.Now,
                            UpdateDate        = DateTime.Now,
                            Currency          = portfolioSecurity.Security.Currency
                        };

                        portfolioNavDateSecurityPriceRepository.SaveOrUpdate(session, portfolioNavDateSecurityPrice);
                    }

                    transaction.Commit();

                    logger.Log(LogLevel.Info, $"[PortfolioNavDate: PortfolioId {portfolioNavDate.Portfolio.PortfolioId}, NavDate {portfolioNavDate.NavDate.Date}]: {missingPortfolioSecurityList.Count} PortfolioSecurityPrices created");
                }
            }
        }
        public IList <PortfolioNavDateSecurityPrice> GetPortfolioNavDateSecurityPriceByNavDateSymbol(ISession session, DateTime navDate, string symbol)
        {
            PortfolioNavDate pnd = null;

            Entities.PortfolioSecurity ps = null;
            NavDate   nd = null;
            Security  sd = null;
            Portfolio pt = null;

            return(session.QueryOver <PortfolioNavDateSecurityPrice>()
                   .Fetch(SelectMode.ChildFetch, p => p.PortfolioNavDate)
                   .Fetch(SelectMode.ChildFetch, p => p.PortfolioSecurity)
                   .JoinAlias(p => p.PortfolioNavDate, () => pnd).JoinAlias(() => pnd.NavDate, () => nd).JoinAlias(() => pnd.Portfolio, () => pt)
                   .JoinAlias(p => p.PortfolioSecurity, () => ps).JoinAlias(() => ps.Security, () => sd)
                   .Where(() => nd.Date == navDate.Date)
                   .And(() => sd.Symbol == symbol)
                   .List());
        }
示例#7
0
        public async Task Execute(IJobExecutionContext context)
        {
            logger.Log(LogLevel.Info, "Begin");

            try
            {
                using (var session = dbSessionFactory.OpenSession())
                {
                    NavDate currentNavDate = navDateService.GetCurrentNavDate(session);

                    if (currentNavDate == null)
                    {
                        throw new Exception("Missing Current NavDate");
                    }

                    if (currentNavDate.RefreshSecurityStaticDataStatus != RefreshSecurityStaticDataStatus.Done)
                    {
                        PublishSecurityListRequest();

                        currentNavDate.RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.InProgress;

                        navDateService.UpdateNavDate(session, currentNavDate);
                    }
                }
            }
            catch (Exception exception)
            {
                logger.Log(LogLevel.Error, exception, exception.Message);

                using (var session = dbSessionFactory.OpenSession())
                {
                    SetCurrentNavDateInError(session);
                }
            }

            logger.Log(LogLevel.Info, "End");

            await Task.CompletedTask;
        }
示例#8
0
        public async Task Execute(IJobExecutionContext context)
        {
            logger.Log(LogLevel.Info, "Begin");

            try
            {
                using (var session = dbSessionFactory.OpenSession())
                {
                    NavDate currentNavDate = navDateService.CreateNavDateIfNotExists(session);

                    navDateService.FixStatusOfPreviousNavDate(session, currentNavDate);
                }
            }
            catch (Exception exception)
            {
                logger.Log(LogLevel.Error, exception, exception.Message);
            }

            logger.Log(LogLevel.Info, "End");

            await Task.CompletedTask;
        }
示例#9
0
        public Task Execute(IJobExecutionContext context)
        {
            logger.Log(LogLevel.Info, "Begin");

            try
            {
                using (var session = sessionFactory.OpenSession())
                {
                    DateTime navDate        = navDateCalculator.CalculateNavDate(DateTime.Today);
                    NavDate  currentNavDate = navDateRepository.GetNavDate(session, navDate);

                    if (currentNavDate == null)
                    {
                        return(Task.CompletedTask);
                    }

                    logger.Log(LogLevel.Info, "[CreatePortfolioNavDates]: Begin");
                    CreatePortfolioNavDates(session, currentNavDate);
                    logger.Log(LogLevel.Info, "[CreatePortfolioNavDates]: End");

                    logger.Log(LogLevel.Info, "[CreatePortfolioNavDateSecurityPrices]: Begin");
                    CreatePortfolioNavDateSecurityPrices(session, currentNavDate);
                    logger.Log(LogLevel.Info, "[CreatePortfolioNavDateSecurityPrices]: End");

                    logger.Log(LogLevel.Info, "[CreateRequestForPortfolioNavDateSecurityPrices]: Begin");
                    CreateRequestForPortfolioNavDateSecurityPrices(session, currentNavDate);
                    logger.Log(LogLevel.Info, "[CreateRequestForPortfolioNavDateSecurityPrices]: End");
                }
            }
            catch (Exception ex)
            {
                logger.Log(LogLevel.Error, ex, ex.Message);
            }

            logger.Log(LogLevel.Info, "End");

            return(Task.CompletedTask);
        }
示例#10
0
        public NavDate CreateNavDateIfNotExists(ISession session)
        {
            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }

            var currentNavDate = GetCurrentNavDate(session);

            if (currentNavDate == null)
            {
                DateTime navDate = navDateCalculator.CalculateNavDate(DateTime.Today);

                currentNavDate = new NavDate()
                {
                    Date = navDate, RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.ToDo
                };
                navDateRepository.SaveOrUpdate(session, currentNavDate);

                logger.Log(LogLevel.Info, $"NavDate {navDate} has been created");
            }

            return(currentNavDate);
        }
 public IList <PortfolioNavDate> GetPortfolioNavDateListByNavDate(ISession session, NavDate navDate)
 {
     return(session.QueryOver <PortfolioNavDate>()
            .Fetch(SelectMode.ChildFetch, x => x.NavDate)
            .Fetch(SelectMode.ChildFetch, x => x.Portfolio)
            .Where(p => p.NavDate.NavDateId == navDate.NavDateId).List());
 }
        private void ProcessResponse(IModel channel, BasicDeliverEventArgs e)
        {
            try
            {
                logger.Log(LogLevel.Info, "Processing SecurityListResponse");

                var response = e.GetMessage <SecurityListResponse>();

                logger.Log(LogLevel.Info, $"[SecurityListResponse] ErrorMessage: {response.ErrorMessage}, SecurityList count: {response.SecurityList?.Count}, RequestDate: {response.RequestDate}, MessageId: {response.MessageId}");

                ILookup <SecurityKey, SecurityDataProvider.Entities.Requests.Security> securityFromResponseLookup = GetSecurityLookupFromResponse(response.SecurityList);

                using (var session = dbSessionFactory.OpenSession())
                {
                    NavDate currentNavDate = navDateService.GetCurrentNavDate(session);

                    if (currentNavDate == null)
                    {
                        return;
                    }

                    if (DateTime.Today != response.RequestDate.Date)
                    {
                        logger.Log(LogLevel.Warn, $"[SecurityListResponse] RequestDate: {response.RequestDate} will be ignored because it is not related to today");

                        channel.SendAck(e.DeliveryTag);
                        return;
                    }

                    if (currentNavDate.RefreshSecurityStaticDataStatus == RefreshSecurityStaticDataStatus.Done)
                    {
                        logger.Log(LogLevel.Warn, $"[SecurityListResponse] RequestDate: {response.RequestDate} will be ignored because Securities have been already updated");

                        channel.SendAck(e.DeliveryTag);
                        return;
                    }

                    IDictionary <SecurityKey, Entities.Security> securityFromDbDictionary = GetSecurityDictionaryFromDb(session);

                    IList <SecurityKey> securityKeyFromResponseList = securityFromResponseLookup.Select(x => x.Key).ToList();
                    IList <SecurityKey> newOrUpdatedSecurityList    = securityKeyFromResponseList.Except(securityFromDbDictionary.Keys).ToList();

                    IDictionary <SecurityKey, Entities.Security> securityFromDbBySymbolDictionary = securityFromDbDictionary.Values.ToDictionary(x => new SecurityKey(x.Symbol, string.Empty, x.Currency));

                    int newSecurityCount    = 0;
                    int updateSecurityCount = 0;

                    using (var statelessSession = dbSessionFactory.OpenStatelessSession())
                        using (var transaction = statelessSession.BeginTransaction())
                        {
                            foreach (SecurityKey securityKey in newOrUpdatedSecurityList)
                            {
                                SecurityDataProvider.Entities.Requests.Security securityResponse = securityFromResponseLookup[securityKey].FirstOrDefault();
                                Entities.Security securityDb;

                                SecurityKey securityKeyWithoutName = new SecurityKey(securityResponse.Symbol?.ToUpper(), string.Empty, securityResponse.Symbol?.ToUpper());

                                if (!securityFromDbBySymbolDictionary.TryGetValue(securityKeyWithoutName, out securityDb))
                                {
                                    securityDb = new Entities.Security()
                                    {
                                        Symbol     = securityResponse.Symbol?.ToUpper(),
                                        Name       = securityResponse.Name,
                                        Currency   = securityResponse.Currency,
                                        CreateDate = DateTime.Now,
                                        UpdateDate = DateTime.Now,
                                    };

                                    newSecurityCount++;
                                }
                                else
                                {
                                    securityDb.Name     = securityResponse.Name;
                                    securityDb.Currency = securityResponse.Currency;

                                    updateSecurityCount++;
                                }

                                securityRepository.Insert(statelessSession, securityDb);
                            }

                            currentNavDate.RefreshSecurityStaticDataStatus = RefreshSecurityStaticDataStatus.Done;
                            navDateService.UpdateNavDate(statelessSession, currentNavDate);

                            transaction.Commit();

                            logger.Log(LogLevel.Info, $"[SecurityListResponse] RequestDate {response.RequestDate} Processed: new {newSecurityCount}, updated {updateSecurityCount}");
                        }

                    channel.SendAck(e.DeliveryTag);
                }
            }
            catch (JsonException jsonException)
            {
                logger.Log(LogLevel.Error, jsonException, jsonException.Message);
                channel.SendAck(e.DeliveryTag);
            }
            catch (Exception exception)
            {
                logger.Log(LogLevel.Error, exception, exception.Message);
                channel.SendNack(e.DeliveryTag);
            }
        }
示例#13
0
        private void CreateRequestForPortfolioNavDateSecurityPrices(ISession session, NavDate currentNavDate)
        {
            using (IConnection connection = connectionFactory.CreateConnection())
            {
                using (IModel channel = connection.CreateModel())
                {
                    channel.CreateQueueIfNotExists(Queues.SecurityPriceRequestQueue);

                    IList <PortfolioNavDate> portfolioNavDateList = portfolioNavDateRepository.GetPortfolioNavDateListByNavDate(session, currentNavDate);

                    foreach (var portfolioNavDate in portfolioNavDateList)
                    {
                        logger.Log(LogLevel.Info, $"Portfolio {portfolioNavDate.Portfolio.PortfolioId} for NavDate {portfolioNavDate.NavDate.Date}: Creating Security Price Requests");

                        IList <PortfolioNavDateSecurityPrice> portfolioNavDateSecurityPriceList = portfolioNavDateSecurityPriceRepository.GetPortfolioNavDateSecurityPriceListByPortfolioNavDate(session, portfolioNavDate)
                                                                                                  .Where(p => p.PriceStatus == PriceStatus.ToBeRequested).ToList();

                        foreach (var portfolioNavDateSecurityPrice in portfolioNavDateSecurityPriceList)
                        {
                            SendSecurityPriceRequest(channel, session, portfolioNavDateSecurityPrice);
                        }

                        logger.Log(LogLevel.Info, $"Portfolio {portfolioNavDate.Portfolio.PortfolioId} for NavDate {portfolioNavDate.NavDate.Date}: {portfolioNavDateSecurityPriceList.Count} Security Price Requests created");
                    }
                }
            }
        }