Пример #1
0
        /// <summary>
        /// Generate a valuation request for a market and portfolio
        /// Include any scenarios requested
        /// </summary>
        /// <param name="portfolioId"></param>
        /// <param name="marketName"></param>
        /// <param name="baseParty"></param>
        /// <param name="irScenarios">Optional array of IR Stress Scenario names</param>
        /// <param name="fxScenarios">optional array of FX Stress Scenario names</param>
        /// <returns></returns>
        private static PortfolioValuationRequest CreateRequest(string portfolioId, string marketName, string baseParty, string[] irScenarios = null, string[] fxScenarios = null)
        {
            // create portfolio valuation request
            Guid requestId = Guid.NewGuid();
            var  request   = new PortfolioValuationRequest
            {
                BaseDate           = TestBaseDate,
                RequestId          = requestId.ToString(),
                Retention          = Retention.ToString(),
                SubmitTime         = DateTimeOffset.Now.ToString("o"),
                RequestDescription = "PV Regression Test",
                RequesterId        = new UserIdentity
                {
                    Name        = Engine.Cache.ClientInfo.Name,
                    DisplayName = "Unit Test Agent"
                },
                PortfolioId       = portfolioId,
                MarketDate        = null,
                MarketName        = marketName,
                ReportingCurrency = "AUD",
                BaseParty         = baseParty,
                IRScenarioNames   = irScenarios,
                FXScenarioNames   = fxScenarios
            };

            return(request);
        }
Пример #2
0
        private void ReceivePortfolioValuationRequest(ICoreItem pvReqItem)
        {
            DateTimeOffset            created = pvReqItem.Created;
            PortfolioValuationRequest pvReq   = (PortfolioValuationRequest)pvReqItem.Data;
            Guid            requestId         = new Guid(pvReq.RequestId);
            InternalRequest newRequest        = new InternalRequest(requestId, created, pvReq);
            InternalRequest oldRequest        = null;

            _OutstandingRequests.Locked((requests) =>
            {
                if (requests.TryGetValue(requestId, out oldRequest))
                {
                    // exists
                    newRequest.LatestResult = oldRequest.LatestResult;
                }
                requests[requestId] = newRequest;
            });
            if (oldRequest == null)
            {
                (new ServerRequestStatus()
                {
                    RequestId = pvReq.RequestId,
                    RequesterId = pvReq.RequesterId ?? new UserIdentity()
                    {
                        Name = this.Client.ClientInfo.Name, DisplayName = "Unknown"
                    },
                    RequesterData = pvReq.PortfolioId,
                    Status = RequestStatusEnum.Received
                }).Publish(_WorkContext.Logger, _WorkContext.Cache, TimeSpan.FromDays(1));
            }

            // dispatch worker request
            EnqueueWorkerRequest();
        }
Пример #3
0
 /// <summary>
 /// Value and Test the portfolio
 /// </summary>
 /// <param name="portfolioId"></param>
 /// <param name="irScenarios">Optional IR Scenarios</param>
 /// <param name="fxScenarios">Optional FX Scenarios</param>
 private static void ValueAndTestPortfolio(string portfolioId, string[] irScenarios = null, string[] fxScenarios = null)
 {
     foreach (var testMarketName in TestMarketNames)
     {
         PortfolioValuationRequest request = CreateRequest(portfolioId, testMarketName, null, irScenarios, fxScenarios);
         HandlerResponse           result  = ExecuteTradeValuation(request);
         AssertValuation(result);
     }
 }
Пример #4
0
        private void RequestSchedulerTimeout(object notUsed)
        {
            // time to post a portfolio valuation request
            TimeSpan retention = TimeSpan.FromDays(2);
            // publish portfolio specification
            List <PortfolioSubquery> portfolioSubqueries = new List <PortfolioSubquery>();

            portfolioSubqueries.Add(new PortfolioSubquery()
            {
                CounterpartyId = "13142"
            });                                                                            // Barclays
            portfolioSubqueries.Add(new PortfolioSubquery()
            {
                CounterpartyId = "14859"
            });                                                                            // Woolworths
            string portfolioId = Guid.NewGuid().ToString();
            var    portfolio   = new PortfolioSpecification
            {
                PortfolioId = portfolioId,
                OwnerId     = new UserIdentity()
                {
                    Name        = this.Client.ClientInfo.Name,
                    DisplayName = "Portfolio Valuation Server"
                },
                Description         = "Woolworths (14859) Scheduled",
                PortfolioSubqueries = portfolioSubqueries.ToArray()
            };

            this.Client.SaveObject <PortfolioSpecification>(portfolio, retention);

            // publish the portfolio valuation requests
            foreach (string marketName in new string[] { CurveConst.NAB_EOD })
            {
                Guid requestId = Guid.NewGuid();
                PortfolioValuationRequest request = new PortfolioValuationRequest()
                {
                    BaseDate    = DateTime.Today,
                    RequestId   = requestId.ToString(),
                    Retention   = retention.ToString(),
                    SubmitTime  = DateTimeOffset.Now.ToString("o"),
                    RequesterId = new UserIdentity()
                    {
                        Name        = this.Client.ClientInfo.Name,
                        DisplayName = "Portfolio Valuation Server"
                    },
                    PortfolioId       = portfolioId,
                    MarketDate        = null,
                    MarketName        = marketName,
                    ReportingCurrency = "AUD",
                    IsDetailedReport  = false,
                    IRScenarioNames   = ScenarioConst.AllIrScenarioIds,
                    FXScenarioNames   = ScenarioConst.AllFxScenarioIds
                };
                this.Client.SaveObject <PortfolioValuationRequest>(request, false, retention);
            }
        }
Пример #5
0
 public InternalPortfRevalRequest(Guid requestId, DateTimeOffset created, PortfolioValuationRequest pvReq)
 {
     RequestId    = requestId;
     Created      = created;
     Request      = pvReq;
     LatestResult = new HandlerResponse
     {
         RequestId = pvReq.RequestId,
         //RequesterData = pvReq.PortfolioId,
         Status = RequestStatusEnum.Received
     };
 }
Пример #6
0
        /// <summary>
        /// Value and Test the portfolio
        /// </summary>
        /// <param name="portfolioId"></param>
        private static void ValueTradeDebug(string portfolioId)
        {
            var irScenarios = new[] { ScenarioConst.Unstressed };

            //var curveTypes = new[] { "RateCurve" };
            //ExecuteCurveStressing(TestMarketNames, curveTypes, Generate_All_RateCurveNames());
            foreach (var testMarketName in TestMarketNames)
            {
                PortfolioValuationRequest request = CreateRequest(portfolioId, testMarketName, null, irScenarios);
                HandlerResponse           result  = ExecuteTradeValuation(request);
                PrintValuation(result);
            }
        }
Пример #7
0
        private RequestBase CreatePVRequest(string marketName, string counterPartyId, string counterPartyName, bool allIRStresses, bool allFXStresses)
        {
            // time to post a portfolio valuation request
            TimeSpan retention = TimeSpan.FromDays(1);
            // publish portfolio specifications
            List <PortfolioSubquery> portfolioSubqueries = new List <PortfolioSubquery>();

            portfolioSubqueries.Add(new PortfolioSubquery()
            {
                CounterpartyId = counterPartyId
            });
            string portfolioId = Guid.NewGuid().ToString();
            var    portfolio   = new PortfolioSpecification
            {
                PortfolioId = portfolioId,
                OwnerId     = new UserIdentity()
                {
                    Name = _ClientRef.Target.ClientInfo.Name, DisplayName = "Grid Test Harness"
                },
                Description         = String.Format("{1} ({0}) Test Request", counterPartyId, counterPartyName),
                PortfolioSubqueries = portfolioSubqueries.ToArray()
            };

            _ClientRef.Target.SaveObject <PortfolioSpecification>(portfolio, retention);

            // publish the portfolio valuation requests
            Guid requestId = Guid.NewGuid();
            PortfolioValuationRequest request = new PortfolioValuationRequest()
            {
                BaseDate           = DateTime.Today,
                RequestId          = requestId.ToString(),
                Retention          = retention.ToString(),
                SubmitTime         = DateTimeOffset.Now.ToString("o"),
                RequestDescription = String.Format("{0} [{1}]", portfolio.Description, marketName),
                RequesterId        = new UserIdentity()
                {
                    Name = _ClientRef.Target.ClientInfo.Name, DisplayName = "Grid Test Harness"
                },
                PortfolioId       = portfolioId,
                MarketDate        = null,
                MarketName        = marketName,
                ReportingCurrency = "AUD",
                IRScenarioNames   = allIRStresses ? ScenarioConst.AllIrScenarioIds : null,
                FXScenarioNames   = allFXStresses ? ScenarioConst.AllFxScenarioIds : null
            };

            _ClientRef.Target.SaveObject <PortfolioValuationRequest>(request);
            return(request);
        }
Пример #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="request"></param>
        private static HandlerResponse ExecuteTradeValuation(PortfolioValuationRequest request)
        {
            // create and execute workflow
            HandlerResponse result;
            IWorkContext    context = new WorkContext(UTE.Logger, Engine.Cache, "UnitTest");

            using (var workflow = new WFCalculatePortfolioStressValuation())
            {
                workflow.Initialise(context);
                WorkflowOutput <HandlerResponse> output = workflow.Execute(request);
                result = output.Result;
                WorkflowHelper.ThrowErrors(output.Errors);
            }
            return(result);
        }
Пример #9
0
        private void DequeueWorkerRequests(object notUsed)
        {
            // throttle callbacks to once per timer period
            DateTime dtNow = DateTime.Now;

            if ((dtNow - _lastManagedAt) < _requestManagerPeriod)
            {
                return;
            }
            _lastManagedAt = dtNow;

            try
            {
                // processing algorithm
                // - find oldest unprocessed (status==received) request and process it
                bool workToDo = true;
                while (workToDo && (GetState() == BasicServerState.Running))
                {
                    workToDo = false;
                    InternalPortfRevalRequest activeRequest        = null;
                    DateTimeOffset            oldestRequestCreated = DateTimeOffset.MaxValue;
                    _outstandingRequests.Locked(requests =>
                    {
                        foreach (InternalPortfRevalRequest request in requests.Values)
                        {
                            if ((request.LatestResult.Status == RequestStatusEnum.Received) &&
                                (request.Created < oldestRequestCreated) &&
                                (request.Request != null))
                            {
                                activeRequest        = request;
                                oldestRequestCreated = request.Created;
                            }
                        }
                        if (activeRequest != null)
                        {
                            // we have found a request to process
                            workToDo = true;
                        }
                    });

                    if (activeRequest != null)
                    {
                        // process request
                        PortfolioValuationRequest request = activeRequest.Request;
                        try
                        {
                            // run the valuation worflow
                            using (var workflow = new WFCalculatePortfolioStressValuation())
                            {
                                workflow.Initialise(_workContext);
                                activeRequest.Workflow = workflow;
                                _activeWorkflow        = workflow;
                                try
                                {
                                    WorkflowOutput <HandlerResponse> output = workflow.Execute(request);
                                    WorkflowHelper.LogErrors(Logger, output.Errors);
                                }
                                finally
                                {
                                    activeRequest.Workflow = null;
                                    _activeWorkflow        = null;
                                }
                            }
                        }
                        catch (Exception innerExcp)
                        {
                            Logger.Log(innerExcp);
                            // publish 'faulted' result
                            var response = new HandlerResponse
                            {
                                RequestId   = request.RequestId,
                                RequesterId = request.RequesterId,
                                //RequesterData = request.PortfolioId,
                                Status      = RequestStatusEnum.Faulted,
                                FaultDetail = new ExceptionDetail(innerExcp)
                            };
                            _workContext.Cache.SaveObject(response);
                        }
                    }
                } // while there is work to do
            }
            catch (Exception outerExcp)
            {
                // deserialisation error?
                Logger.Log(outerExcp);
            }
        }
Пример #10
0
        private void DequeueWorkerRequests(object notUsed)
        {
            // exit if more requests following
            if (Interlocked.Decrement(ref _WorkerRequests) > 0)
            {
                return;
            }

            // throttle callbacks to once per timer period
            DateTime dtNow = DateTime.Now;

            if ((dtNow - _LastManagedAt) < RequestManagerPeriod)
            {
                return;
            }
            _LastManagedAt = dtNow;

            try
            {
                // processing algorithm
                // - find oldest unprocessed (status==received) request and process it
                bool workToDo = true;
                while (workToDo)
                {
                    workToDo = false;
                    InternalRequest oldestUnstartedRequest = null;
                    DateTimeOffset  oldestRequestCreated   = DateTimeOffset.MaxValue;
                    _OutstandingRequests.Locked((requests) =>
                    {
                        foreach (InternalRequest request in requests.Values)
                        {
                            if ((request.LatestResult.Status == RequestStatusEnum.Received) &&
                                (request.Created < oldestRequestCreated))
                            {
                                oldestUnstartedRequest = request;
                                oldestRequestCreated   = request.Created;
                            }
                        }
                        if (oldestUnstartedRequest != null)
                        {
                            // we have found a request to process
                            workToDo = true;
                        }
                    });

                    if (oldestUnstartedRequest != null)
                    {
                        // process request
                        PortfolioValuationRequest request = oldestUnstartedRequest.Request;
                        try
                        {
                            // run the valuation worflow
                            WorkflowOutput <ServerRequestStatus> output = _Workflow.Execute(request);
                            bool failed = WorkflowHelper.LogErrors(Logger, output.Errors);
                        }
                        catch (Exception innerExcp)
                        {
                            Logger.Log(innerExcp);
                            // publish 'faulted' result
                            (new ServerRequestStatus()
                            {
                                RequestId = request.RequestId,
                                RequesterId = request.RequesterId,
                                RequesterData = request.PortfolioId,
                                Status = RequestStatusEnum.Faulted,
                                FaultDetail = new ExceptionDetail(innerExcp),
                            }).Publish(_WorkContext.Logger, _WorkContext.Cache, TimeSpan.FromDays(1));
                        }
                    }
                } // while there is work to do
            }
            catch (Exception outerExcp)
            {
                // deserialisation error?
                Logger.Log(outerExcp);
            }
        }