private void BaseCurveCallback(ICoreItem baseCurveItem) { try { // check for server shutdown if (GetState() != BasicServerState.Running) { return; } // refresh all curves // - update market data // - regenerate curves DateTime dtNow = DateTime.Now; // Curve identifiers var nameSpace = baseCurveItem.AppProps.GetValue <string>(EnvironmentProp.NameSpace, true); var marketName = baseCurveItem.AppProps.GetValue <string>(CurveProp.Market, true); var curveType = baseCurveItem.AppProps.GetValue <string>(CurveProp.PricingStructureType, true); var curveName = baseCurveItem.AppProps.GetValue <string>(CurveProp.CurveName, true); // }); //} var curveGenRequest = new OrdinaryCurveGenRequest { RequestId = Guid.NewGuid().ToString(), RequesterId = new UserIdentity { Name = IntClient.Target.ClientInfo.Name, DisplayName = "Curve Generation Server" }, BaseDate = dtNow.Date, NameSpace = nameSpace, SaveMarketData = false, UseSavedMarketData = true, ForceGenerateEODCurves = false, CurveSelector = new[] { new CurveSelection { NameSpace = nameSpace, MarketName = marketName, CurveType = curveType, CurveName = curveName } } }; IWorkContext context = new WorkContext(Logger, IntClient.Target, "DEV"); using (var workflow = new WFGenerateOrdinaryCurve()) { workflow.Initialise(context); WorkflowOutput <HandlerResponse> output = workflow.Execute(curveGenRequest); WorkflowHelper.ThrowErrors(output.Errors); } } catch (Exception excp) { Logger.LogDebug("Base curve generation failed with exception: {0}", excp.GetType().Name); Logger.Log(excp); } }
private RequestBase CreateCurveGenRequest() { // get curve identifiers IExpression curveDefFilter = Expr.BoolAND( Expr.IsEQU(CurveProp.Function, "Configuration"), Expr.IsEQU(CurveProp.Market, CurveConst.QR_LIVE), Expr.IsNull(CurveProp.MarketDate)); DateTime dtNow = DateTime.Now; // - hack get reference curves 1st List <string> curveItemNames = new List <string>(); List <CurveSelection> referenceCurveSelectors = new List <CurveSelection>(); List <CurveSelection> remainingCurveSelectors = new List <CurveSelection>(); List <ICoreItem> curveDefItems = _ClientRef.Target.LoadItems <Market>(curveDefFilter); foreach (ICoreItem curveDefItem in curveDefItems) { string marketName = curveDefItem.AppProps.GetValue <string>(CurveProp.Market, true); string curveType = curveDefItem.AppProps.GetValue <string>(CurveProp.PricingStructureType, true); string curveName = curveDefItem.AppProps.GetValue <string>(CurveProp.CurveName, true); string refCurveName = curveDefItem.AppProps.GetValue <string>(CurveProp.ReferenceCurveName, null); ((refCurveName == null) ? referenceCurveSelectors : remainingCurveSelectors).Add(new CurveSelection() { MarketName = marketName, CurveType = curveType, CurveName = curveName }); } List <CurveSelection> curveSelectors = new List <CurveSelection>(referenceCurveSelectors); curveSelectors.AddRange(remainingCurveSelectors); OrdinaryCurveGenRequest request = new OrdinaryCurveGenRequest() { RequestId = Guid.NewGuid().ToString(), RequesterId = new UserIdentity() { Name = _ClientRef.Target.ClientInfo.Name, DisplayName = "Grid Test Harness" }, SubmitTime = DateTimeOffset.Now.ToString("o"), BaseDate = dtNow.Date, SaveMarketData = false, UseSavedMarketData = false, ForceGenerateEODCurves = false, CurveSelector = curveSelectors.ToArray() }; _ClientRef.Target.SaveObject <OrdinaryCurveGenRequest>(request); return(request); }
public void ProcessItems() { int count = Interlocked.Decrement(ref _queuedCalls); // exit if there are more callbacks following us //if (count % 10000 == 0) _loggerRef.Target.LogDebug("ProcessItems: Queued calls remaining: {0}", count); if (count != 0) { return; } ICoreItem item = null; _queuedItems.Locked(queue => { if (queue.Count > 0) { item = queue.Dequeue(); } }); while (item != null) { var qas = item.Data as QuotedAssetSet; if (qas != null) { // 1. Get the property values that uniquely identify the curves to refresh. // This is the process for the workflow request. Alternatively, a direct build of the curve can occur. // var nameSpace = item.AppProps.GetValue <string>(EnvironmentProp.NameSpace); var market = item.AppProps.GetValue <string>(CurveProp.Market);//For real time use Market and not MarketAndDate var curveType = item.AppProps.GetValue <string>(CurveProp.PricingStructureType); var curveName = item.AppProps.GetValue <string>(CurveProp.CurveName); var configIdentifier = FunctionProp.Configuration + ".PricingStructures." + market + "." + curveType + "." + curveName; var identifier = FunctionProp.Market + "." + market + "." + curveType + "." + curveName; List <ICoreItem> items = null; // 2.Check if the dependent curves should be refreshed // if (chkBoxDependentCurves.Checked) { //Find all the QAS's where the ReferenceCurveName is equal to the curveType.curveName! var requestProperties = new NamedValueSet(); requestProperties.Set(EnvironmentProp.NameSpace, NameSpace); requestProperties.Set(CurveProp.Market, market); requestProperties.Set(EnvironmentProp.Function, FunctionProp.Configuration); requestProperties.Set(CurveProp.ReferenceCurveName, curveType + '.' + curveName); IExpression queryExpr = Expr.BoolAND(requestProperties); _loggerRef.Target.LogDebug("Dependent curve property request set at {0}", DateTime.Now.ToLongTimeString()); items = _cache.LoadItems <Market>(queryExpr); } // 3. If the build is a local build then use the curve engine. // if (!chkBoxWorkflow.Checked) { _loggerRef.Target.LogDebug("Request to build base curve {0} locally at : {1}", identifier, DateTime.Now.ToLongTimeString()); var curve = CurveEngine.RefreshPricingStructureFromConfiguration(_loggerRef.Target, _cache, nameSpace, configIdentifier, identifier, qas, DateTime.Now, DateTime.Now); _loggerRef.Target.LogDebug("Built the base curve {0} locally at : {1}", curve, DateTime.Now.ToLongTimeString()); if (items != null) { foreach (var dataItem in items) { var spreadCurve = dataItem.Data as Market; if (spreadCurve == null) { continue; } //var bootstrap = dataItem.AppProps.GetValue<bool>(CurveProp.BootStrap, false); //if (!bootstrap) { dataItem.AppProps.Set(CurveProp.BootStrap, true); } try { var curveId = spreadCurve.id; if (String.IsNullOrEmpty(curveId)) { curveId = spreadCurve.Items[0].id; //use yieldCurve.id, CurveGen 1.X compatible } dataItem.AppProps.Set(CurveProp.BaseDate, DateTime.Now); dataItem.AppProps.Set(CurveProp.BuildDateTime, DateTime.Now); var marketData = new Pair <PricingStructure, PricingStructureValuation>(spreadCurve.Items[0], spreadCurve.Items1[0]); var ps = PricingStructureFactory.Create(_loggerRef.Target, _cache, nameSpace, null, null, marketData, dataItem.AppProps); if (ps != null) { CurveEngine.SaveCurve(_cache, nameSpace, ps); } _loggerRef.Target.LogDebug("Built the spread curve {0} locally at : {1}", curveId, DateTime.Now.ToLongTimeString()); } catch (Exception e) { _loggerRef.Target.LogDebug(e.ToString()); } } } } else { // 4. Set the parameters for the work request. // var curveGenRequest = new OrdinaryCurveGenRequest { NameSpace = nameSpace, BaseDate = DateTime.Now, RequestId = Guid.NewGuid().ToString(), RequesterId = new UserIdentity { Name = _cache.ClientInfo.Name, DisplayName = _cache.ClientInfo.UserFullName //Name = _clientRef.Target.ClientInfo.Name, //DisplayName = _clientRef.Target.ClientInfo.UserFullName }, UseSavedMarketData = true, ForceGenerateEODCurves = true }; // 5. Set the base curve in the curve selection for the work request. // var curveSelector = new List <CurveSelection> { new CurveSelection { NameSpace = nameSpace, MarketName = market, CurveType = curveType, CurveName = curveName } }; // 6.Include all other dependent curvenames i.e. spread curves. // if (items != null) { curveSelector.AddRange(from childCurve in items let spreadCurveType = childCurve.AppProps.GetValue <string>( CurveProp.PricingStructureType) let spreadCurveName = childCurve.AppProps.GetValue <string>(CurveProp.CurveName) select new CurveSelection { NameSpace = nameSpace, MarketName = market, CurveType = spreadCurveType, CurveName = spreadCurveName }); } curveGenRequest.CurveSelector = curveSelector.ToArray(); // 7. Set the actual work request. // IWorkContext context = new WorkContext(_loggerRef.Target, _cache, "DEV"); //IWorkContext context = new WorkContext(_loggerRef.Target, _clientRef.Target, "DEV"); _loggerRef.Target.LogDebug("WorkContext set at {0}", DateTime.Now.ToLongTimeString()); using (var workflow = new WFGenerateOrdinaryCurve()) { workflow.Initialise(context); WorkflowOutput <HandlerResponse> output = workflow.Execute(curveGenRequest); WorkflowHelper.ThrowErrors(output.Errors); foreach (var error in output.Errors) { _loggerRef.Target.LogInfo("WorkFlow error: {0} at {1}", error.Message, DateTime.Now.ToLongTimeString()); } } _loggerRef.Target.LogDebug("WorkFlow executed at {0}", DateTime.Now.ToLongTimeString()); //item = null; //_queuedItems.Locked(queue => // { // if (queue.Count > 0) // item = queue.Dequeue(); // }); } } } }
public void ProcessRequest(RequestBase baseRequest, HandlerResponse response) { if (baseRequest == null) { throw new ArgumentNullException("request"); } OrdinaryCurveGenRequest request = baseRequest as OrdinaryCurveGenRequest; if (request == null) { throw new InvalidCastException(String.Format("{0} is not a {1}", typeof(RequestBase).Name, typeof(OrdinaryCurveGenRequest).Name)); } CurveSelection[] curveSelectors = request.CurveSelector ?? new List <CurveSelection>().ToArray(); response.ItemCount = curveSelectors.Length; DateTime lastStatusPublishedAt = DateTime.Now; // check for workflow cancellation if (this.Cancelled) { throw new OperationCanceledException(this.CancelReason); } // iterate selected curves foreach (CurveSelection curveSelector in curveSelectors) { // publish 'intermediate' in-progress result (throttled) if ((DateTime.Now - lastStatusPublishedAt) > TimeSpan.FromSeconds(5)) { lastStatusPublishedAt = DateTime.Now; response.Status = RequestStatusEnum.InProgress; _Context.Cache.SaveObject <HandlerResponse>(response); } string inputMarketName = curveSelector.MarketName; string inputCurveName = curveSelector.CurveName; string inputCurveType = curveSelector.CurveType; // given a curve definition, this workflow generates: // - a live base curve using current market data // load curve definition _Context.Logger.LogDebug("Building ordinary curve: {0}.{1}.{2}", inputMarketName, inputCurveType, inputCurveName); string curveUniqueId = string.Format("Orion.Configuration.PricingStructures.{0}.{1}.{2}", inputMarketName, inputCurveType, inputCurveName); ICoreItem marketItem = LoadAndCheckMarketItem(_Context.Cache, curveUniqueId); var marketDate = curveSelector.MarketDate; Market market = marketItem.GetData <Market>(true); //AssertSomeQuotesMissing(((YieldCurveValuation)(cachedMarket.Items1[0])).inputs); //Market clonedMarket = BinarySerializerHelper.Clone<Market>(cachedMarket); PricingStructure ps = market.Items[0]; PricingStructureValuation psv = market.Items1[0]; // supply base data and build datetime psv.baseDate = new IdentifiedDate { Value = request.BaseDate }; QuotedAssetSet curveDefinition; if (psv is YieldCurveValuation) { curveDefinition = ((YieldCurveValuation)psv).inputs; } else if (psv is FxCurveValuation) { curveDefinition = ((FxCurveValuation)psv).spotRate; } else { throw new NotSupportedException("Unsupported PricingStructureValuation type: " + psv.GetType().Name); } // default outputs var curveDefProps = new NamedValueSet(marketItem.AppProps); var curveType = PropertyHelper.ExtractPricingStructureType(curveDefProps);//.GetValue<string>(CurveProp.PricingStructureType, true)); var curveName = curveDefProps.GetValue <string>(CurveProp.CurveName, true); string marketDataItemName = String.Format("Highlander.MarketData.{0}.{1}.{2}", inputMarketName, curveType, curveName); curveDefProps.Set("BootStrap", true); curveDefProps.Set(CurveProp.BaseDate, request.BaseDate); IPricingStructureIdentifier liveCurveId = PricingStructureIdentifier.CreateMarketCurveIdentifier(curveDefProps, inputMarketName, null, null, null, null); NamedValueSet liveCurveProps = liveCurveId.Properties; var liveCurveItemName = liveCurveProps.GetValue <string>(CurveProp.UniqueIdentifier, true); var liveCurve = new Market(); // empty // given a curve definition, this workflow generates: // - a live base curve using current market data var curveGenProps = new NamedValueSet(); curveGenProps.Set(CurveProp.BaseDate, request.BaseDate); IPricingStructureIdentifier curveUniqueId = PricingStructureIdentifier.CreateMarketCurveIdentifier(curveGenProps, inputMarketName, marketDate, inputCurveType, inputCurveName, null); var baseCurveUniqueId = curveUniqueId.Properties.GetValue <string>(CurveProp.UniqueIdentifier, true); ICoreItem marketItem = LoadAndCheckMarketItem(_Context.Cache, baseCurveUniqueId); // load curve definition _Context.Logger.LogDebug("Copy curve: {0} to {1}", baseCurveUniqueId, inputMarketName); // default outputs curveDefProps = new NamedValueSet(marketItem.AppProps); curveDefProps.Set(CurveProp.MarketAndDate, inputMarketName); curveDefProps.Set(CurveProp.MarketDate, null); var curveType = PropertyHelper.ExtractPricingStructureType(curveDefProps); IPricingStructureIdentifier newCurveUniqueId = PricingStructureIdentifier.CreateMarketCurveIdentifier(curveGenProps, inputMarketName, null, inputCurveType, inputCurveName, null); var curveId = newCurveUniqueId.Properties.GetValue <string>(CurveProp.UniqueIdentifier, true); //var curveName = curveDefProps.GetValue<string>(CurveProp.CurveName, true); //string marketItemName = String.Format("Highlander.Market.{0}.{1}.{2}", inputMarketName, curveType, curveName); curveDefProps.Set(CurveProp.UniqueIdentifier, curveId); _Context.Cache.SaveObject <Market>((Market)marketItem.Data, curveId, curveDefProps, true, TimeSpan.FromDays(50)); // curve done requestStatus.IncrementItemsPassed(); // publish 'completed' in-progress result requestStatus.Publish(_Context.Logger, _Context.Cache); } // success requestStatus.Status = RequestStatusEnum.Completed; // publish 'completed' in-progress result requestStatus.Publish(_Context.Logger, _Context.Cache); return(requestStatus); }
public void ProcessItems() { int count = Interlocked.Decrement(ref _queuedCalls); // exit if there are more callbacks following us if (count % 10000 == 0) { _loggerRef.Target.LogDebug("ProcessItems: Queued calls remaining: {0}", count); } if (count != 0) { return; } ICoreItem item = null; _queuedItems.Locked(queue => { if (queue.Count > 0) { item = queue.Dequeue(); } }); while (item != null) { if (item.Data is QuotedAssetSet) { var nameSpace = item.AppProps.GetValue <string>(EnvironmentProp.NameSpace); var marketName = item.AppProps.GetValue <string>(CurveProp.MarketAndDate); var curveType = item.AppProps.GetValue <string>(CurveProp.PricingStructureType); var curveName = item.AppProps.GetValue <string>(CurveProp.CurveName); var curveGenRequest = new OrdinaryCurveGenRequest { NameSpace = nameSpace, BaseDate = DateTime.Now, RequestId = Guid.NewGuid().ToString(), RequesterId = new UserIdentity { Name = _clientRef.Target.ClientInfo.Name, DisplayName = _clientRef.Target.ClientInfo.UserFullName }, UseSavedMarketData = true, ForceGenerateEODCurves = true, CurveSelector = new[] { new CurveSelection { NameSpace = nameSpace, MarketName = marketName, CurveType = curveType, CurveName = curveName } } }; IWorkContext context = new WorkContext(_loggerRef.Target, _clientRef.Target, "DEV"); using (var workflow = new WFGenerateOrdinaryCurve()) { workflow.Initialise(context); WorkflowOutput <HandlerResponse> output = workflow.Execute(curveGenRequest); WorkflowHelper.ThrowErrors(output.Errors); } item = null; _queuedItems.Locked(queue => { if (queue.Count > 0) { item = queue.Dequeue(); } }); } } }