protected List <BasicAssetValuation> ConvertProviderResultsToStandardValuations( Dictionary <string, BasicQuotation> providerResults, RequestContext requestContext) { var results = new List <BasicAssetValuation>(); // build standard results (and convert quote units) Logger.LogDebug(" Results :"); for (int i = 0; i < requestContext.RequestItems.Count; i++) { RequestItem requestItem = requestContext.RequestItems[i]; Asset standardAsset = requestItem.StandardAsset; BasicQuotation standardQuote = requestItem.StandardQuote; string standardInstrId = standardAsset.id; string standardFieldId = standardQuote.GetStandardFieldName(); PriceQuoteUnitsEnum standardQuoteUnit = requestItem.StandardUnits; PriceQuoteUnitsEnum providerQuoteUnit = requestItem.ProviderUnits; string providerInstrId = requestContext.InstrConversionMap[standardInstrId.ToLower()]; string providerFieldId = requestContext.FieldConversionMap[standardFieldId.ToLower()]; string providerQuoteKey = FormatProviderQuoteKey(providerInstrId, providerFieldId); if (providerResults.TryGetValue(providerQuoteKey, out var providerQuote)) { BasicQuotation convertedQuote; if (providerQuote.valueSpecified) { // valid value returned decimal convertedValue = PriceQuoteUnitsHelper.ConvertPriceQuoteUnitsValue(providerQuoteUnit, standardQuoteUnit, providerQuote.value); convertedQuote = BasicQuotationHelper.Create(standardQuote, convertedValue); // debug Logger.LogDebug(" [{0}] '{1}/{2}' ({3}/{4}) [{5}] --> '{6}/{7}' ({8}/{9}) [{10}]", i, providerInstrId, providerFieldId, AssetMeasureEnum.MarketQuote, providerQuoteUnit, providerQuote.value, standardInstrId, standardFieldId, AssetMeasureEnum.MarketQuote, standardQuoteUnit, convertedQuote.value); // end debug } else { // no value - copy error details convertedQuote = providerQuote; // debug Logger.LogDebug(" [{0}] '{1}/{2}' ({3}/{4}) [{5}] --> '{6}/{7}' ({8}/{9}) [{10}]", i, providerInstrId, providerFieldId, providerQuote.measureType.Value, providerQuote.quoteUnits.Value, providerQuote.value, standardInstrId, standardFieldId, convertedQuote.measureType.Value, convertedQuote.quoteUnits.Value, convertedQuote.value); // end debug } // add other provider info convertedQuote.timeSpecified = providerQuote.timeSpecified; convertedQuote.time = providerQuote.time; convertedQuote.valuationDateSpecified = providerQuote.valuationDateSpecified; convertedQuote.valuationDate = providerQuote.valuationDate; convertedQuote.informationSource = providerQuote.informationSource; results.Add(new BasicAssetValuation { objectReference = new AnyAssetReference { href = standardAsset.id }, quote = new[] { convertedQuote } }); } } return(results); }
protected RequestContext ConvertStandardAssetQuotesToProviderInstrFieldCodes( MDSRequestType requestType, QuotedAssetSet standardQuotedAssetSet) { // extract assets/quotes that require market quotes var standardAssets = new List <Asset>(); var standardQuotes = new List <BasicQuotation>(); { // build a request/response map (indexed by instrument id) var instrumentMap = new Dictionary <string, Asset>(); //List<Pair<Asset, BasicQuotation>> completeAssetQuotes = new List<Pair<Asset, BasicQuotation>>(); foreach (Asset asset in standardQuotedAssetSet.instrumentSet.Items) { instrumentMap[asset.id.ToLower()] = asset; } foreach (BasicAssetValuation quoteInstr in standardQuotedAssetSet.assetQuote) { string instrId = quoteInstr.objectReference.href; if (!instrumentMap.TryGetValue(instrId.ToLower(), out var asset)) { throw new ApplicationException($"Cannot find instrument '{instrId}' for assetQuote"); } foreach (BasicQuotation quoteField in quoteInstr.quote) { if (quoteField.valueSpecified) { // value provided - don't get from market //completeAssetQuotes.Add(new Pair<Asset, BasicQuotation>(asset, quoteField)); } else { // value not supplied - get from market BasicQuotation quote = BasicQuotationHelper.Clone(quoteField); standardAssets.Add(asset); standardQuotes.Add(quote); } } } } var requestItems = new List <RequestItem>(); var instrConversionMap = new Dictionary <string, string>(); var instrUniquenessMap = new Dictionary <string, string>(); var internalInstrIds = new List <string>(); var fieldConversionMap = new Dictionary <string, string>(); var fieldUniquenessMap = new Dictionary <string, string>(); var internalFieldIds = new List <string>(); Logger.LogDebug(" Mappings :"); for (int i = 0; i < standardAssets.Count; i++) { // map asset to provider instrument id Asset standardAsset = standardAssets[i]; string internalInstrId = standardAsset.id; internalInstrIds.Add(internalInstrId); string providerInstrId = _marketDataMap.Convert( MDSDictionaryType.Instrument, requestType, MDSProviderId.GlobalIB, ProviderId, internalInstrId, ConvertFailMode.ThrowException); // update 1-way map instrConversionMap[internalInstrId.ToLower()] = providerInstrId; instrUniquenessMap[providerInstrId.ToLower()] = providerInstrId; // map quote to provider field name BasicQuotation standardQuote = standardQuotes[i]; string internalFieldId = standardQuote.GetStandardFieldName(); internalFieldIds.Add(internalFieldId); string providerFieldId = _marketDataMap.Convert( MDSDictionaryType.FieldName, requestType, MDSProviderId.GlobalIB, ProviderId, internalFieldId, ConvertFailMode.ThrowException); // update 1-way map fieldConversionMap[internalFieldId.ToLower()] = providerFieldId; fieldUniquenessMap[providerFieldId.ToLower()] = providerFieldId; // get provider units string providerUnitsId = _marketDataMap.Convert( MDSDictionaryType.QuoteUnits, requestType, MDSProviderId.GlobalIB, ProviderId, String.Format("{0}/{1}", internalInstrId, internalFieldId), ConvertFailMode.ThrowException); var requestItem = new RequestItem { StandardAsset = standardAsset, StandardQuote = standardQuote, StandardUnits = PriceQuoteUnitsScheme.ParseEnumString(standardQuote.quoteUnits.Value), ProviderInstrumentId = providerInstrId, ProviderFieldName = providerFieldId, ProviderUnits = PriceQuoteUnitsScheme.ParseEnumString(providerUnitsId) }; requestItems.Add(requestItem); // debug Logger.LogDebug(" [{0}] '{1}/{2}' ({3}) --> '{4}/{5}' ({6})", i, internalInstrIds[i], internalFieldIds[i], standardQuote.quoteUnits.Value, instrConversionMap[internalInstrIds[i].ToLower()], fieldConversionMap[internalFieldIds[i].ToLower()], providerUnitsId); // end debug } var providerInstrIds = new List <string>(instrUniquenessMap.Values); var providerFieldIds = new List <string>(fieldUniquenessMap.Values); // build provider instr/field code sets - todo - for now just build 1 var results = new List <ProviderInstrFieldCodeSet>(); var result = new ProviderInstrFieldCodeSet(providerInstrIds, providerFieldIds); results.Add(result); return(new RequestContext { RequestItems = requestItems, ProviderInstrFieldCodeSets = results, InstrConversionMap = instrConversionMap, FieldConversionMap = fieldConversionMap }); }