/// <summary> /// Maps from a list of asset pairs to a quoted asset set. /// </summary> /// <param name="assetPairs"></param> /// <returns></returns> internal static QuotedAssetSet MapFromAssetPairs(ICollection <Pair <Asset, BasicAssetValuation> > assetPairs) { var quotedAssetSet = new QuotedAssetSet(); var assets = new Asset[assetPairs.Count]; var basicAssetValuations = new BasicAssetValuation[assetPairs.Count]; var types = new List <ItemsChoiceType19>(); var index = 0; foreach (var pair in assetPairs) { assets[index] = pair.First; basicAssetValuations[index] = pair.Second; var properties = new PriceableAssetProperties(assets[index].id); var assetTypeFpML = AssetTypeConvertor.ParseEnumStringToFpML(properties.AssetType.ToString()); types.Add(assetTypeFpML); index++; } quotedAssetSet.assetQuote = basicAssetValuations; var instrumentSet = new InstrumentSet { Items = assets.ToArray(), ItemsElementName = types.ToArray() }; quotedAssetSet.instrumentSet = instrumentSet; return(quotedAssetSet); }
public DataTable GetDataTable() { if (null != _lastQuotedAssetSet) { foreach (DataRow dataRow in _dataTable.Rows) { var instrumentId = (string)dataRow["InstrumentId"]; List <BasicAssetValuation> basicAssetValuations = QuotedAssetSet.GetAssetQuote(_lastQuotedAssetSet, instrumentId); if (basicAssetValuations.Count > 0) { BasicAssetValuation bav0 = basicAssetValuations[0]; foreach (DataColumn dataColumn in _dataTable.Columns) { string columnName = dataColumn.ColumnName; BasicQuotation basicQuotation = BasicAssetValuationHelper.GetQuotationByTiming(bav0, columnName); if (null != basicQuotation) { dataRow[columnName] = basicQuotation.value; } } } } } _dataTable.AcceptChanges(); DataTable copy = _dataTable.Copy(); // remove "InstrumentId" column // copy.Columns.Remove("InstrumentId"); copy.AcceptChanges(); return(copy); }
public QuotedAssetSet Create() { var result = new QuotedAssetSet(); var assets = new List <Asset>(); var quotes = new List <BasicAssetValuation>(); var types = new List <ItemsChoiceType19>(); foreach (Pair <Asset, BasicAssetValuation> assetAndQuote in _assetAndQuotes) { assets.Add(assetAndQuote.First); quotes.Add(assetAndQuote.Second); //Handles the case of tenor curves var id = assetAndQuote.First?.id ?? assetAndQuote.Second?.objectReference?.href; var properties = new PriceableAssetProperties(id); var assetTypeFpML = AssetTypeConvertor.ParseEnumStringToFpML(properties.AssetType.ToString()); types.Add(assetTypeFpML); } var instrumentSet = new InstrumentSet { Items = assets.ToArray(), ItemsElementName = types.ToArray() }; result.instrumentSet = instrumentSet; result.assetQuote = quotes.ToArray(); return(result); }
/// <summary> /// Initializes a new instance of the <see cref="RateBasisCurve"/> class. /// </summary> /// <param name="logger">The logger.</param> /// <param name="cache">The cache.</param> /// <param name="nameSpace">The client namespace</param> /// <param name="underlyingAsset">THe underlying asset used for security.</param> /// <param name="referenceCurve">The reference parent curveid.</param> /// <param name="spreadAssets">The spreads by asset.</param> /// <param name="properties">The properties of the new spread curve.</param> /// <param name="fixingCalendar">The fixingCalendar.</param> /// <param name="rollCalendar">The rollCalendar.</param> public SecuredRateBasisCurve(ILogger logger, ICoreCache cache, string nameSpace, Asset underlyingAsset, IRateCurve referenceCurve, QuotedAssetSet spreadAssets, NamedValueSet properties, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) : base(logger, cache, nameSpace, referenceCurve, spreadAssets, properties, fixingCalendar, rollCalendar) { UnderlyingAsset = underlyingAsset; }
public void TestMDSBloomberg() { // test basic start, request snapshot, and stop functions // - create a MDS client with direct connection to provider using (Reference <ILogger> loggerRef = Reference <ILogger> .Create(new TraceLogger(true))) { IModuleInfo clientInfo = new V131ModuleInfo(new V131ClientInfo()); using (ICoreClient client = new CoreClientFactory(loggerRef).SetEnv(BuildConst.BuildEnv).Create()) { const string curveName = "Orion.V5r3.Configuration.PricingStructures.QR_LIVE.RateCurve.AUD-BBR-BBSW-3M"; ICoreItem marketItem = client.LoadItem <Market>(curveName); if (marketItem == null) { throw new ApplicationException("Market '" + curveName + "' not found!"); } var market = (Market)marketItem.Data; //PricingStructure ps = market.Items[0]; PricingStructureValuation psv = market.Items1[0]; QuotedAssetSet quotedAssetSet = ((YieldCurveValuation)psv).inputs; using (IMarketDataClient mdc = new MarketDataRealtimeClient( loggerRef, null, client, MDSProviderId.Bloomberg))//MDSProviderId.GlobalIB { QuotedAssetSet data = mdc.GetMarketQuotes( MDSProviderId.Bloomberg, clientInfo, Guid.NewGuid(), true, null, quotedAssetSet).Result; Assert.IsNotNull(data); } } } }
/// <summary> /// Initializes a new instance of the <see cref="RateBasisCurve"/> class. /// </summary> /// <param name="logger">The logger.</param> /// <param name="cache">The cache.</param> /// <param name="nameSpace">The client namespace</param> /// <param name="baseDiscountingCurve">The reference curve.</param> /// <param name="clearedRateAssets">The cleared rate asset.</param> /// <param name="properties">The properties of the new spread curve.</param> /// <param name="fixingCalendar">The fixingCalendar.</param> /// <param name="rollCalendar">The rollCalendar.</param> public ClearedRateCurve(ILogger logger, ICoreCache cache, string nameSpace, IRateCurve baseDiscountingCurve, QuotedAssetSet clearedRateAssets, NamedValueSet properties, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) : base(logger, cache, nameSpace, new RateCurveIdentifier(properties), fixingCalendar, rollCalendar) { PricingStructureData = new PricingStructureData(CurveType.Child, AssetClass.Rates, properties); BaseDiscountingCurve = baseDiscountingCurve; ReferenceDiscountingCurveId = BaseDiscountingCurve.GetPricingStructureId(); if (PricingStructureIdentifier.PricingStructureType != PricingStructureTypeEnum.ClearedRateCurve) { return; } var termCurve = SetConfigurationData(); var curveId = GetRateCurveId(); var indexTenor = curveId.ForecastRateIndex?.indexTenor; //Set the priceable assets. PriceableClearedRateAssets = PriceableAssetFactory.CreatePriceableClearedRateAssetsWithBasisSwaps(logger, cache, nameSpace, indexTenor, clearedRateAssets, PricingStructureIdentifier.BaseDate, fixingCalendar, rollCalendar); termCurve.point = ClearedRateBootstrapper.Bootstrap(PriceableClearedRateAssets, BaseDiscountingCurve, curveId.BaseDate, termCurve.extrapolationPermitted, termCurve.interpolationMethod, Tolerance); CreatePricingStructure(curveId, termCurve, clearedRateAssets); // CreatePricingStructure(curveId, termCurve, PriceableAssetFactory.Parse(PriceableClearedRateAssets)); // Interpolate the DiscountFactor curve based on the respective curve interpolation SetInterpolator(termCurve); }
protected virtual void OnPublishMarketData( Guid requestId, NamedValueSet requestParams, TimeSpan dataLifetime, QuotedAssetSet marketDataSet) { throw new NotSupportedException("This provider (" + ProviderId.ToString() + ") does not support the OnPublishMarketData method!"); }
public static Boolean QuotedAssetSetIsValid(QuotedAssetSet quotedAssetSet) { return(quotedAssetSet != null && quotedAssetSet.assetQuote != null && quotedAssetSet.instrumentSet != null && quotedAssetSet.instrumentSet.Items != null && quotedAssetSet.instrumentSet.Items.Length == quotedAssetSet.assetQuote.Length); }
public void PublishMarketData( IModuleInfo clientInfo, Guid requestId, NamedValueSet requestParams, TimeSpan dataLifetime, QuotedAssetSet marketDataSet) { OnPublishMarketData(requestId, requestParams, dataLifetime, marketDataSet); }
/// <summary> /// Initializes a new instance of the <see cref="RateSpreadCurve"/> class. /// </summary> /// <param name="logger">The logger.</param> /// <param name="cache">The cache.</param> /// <param name="nameSpace">The client namespace</param> /// <param name="referenceCurve">The reference parent curve id.</param> /// <param name="spreadAssets">The spreads by asset.</param> /// <param name="properties">The properties of the new spread curve.</param> /// <param name="fixingCalendar">The fixingCalendar.</param> /// <param name="rollCalendar">The rollCalendar.</param> public RateSpreadCurve(ILogger logger, ICoreCache cache, string nameSpace, IRateCurve referenceCurve, QuotedAssetSet spreadAssets, NamedValueSet properties, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) : base(logger, cache, nameSpace, ProcessQuotedAssetSet(logger, cache, nameSpace, referenceCurve, spreadAssets, properties, fixingCalendar, rollCalendar), properties, fixingCalendar, rollCalendar) { PricingStructureData = new PricingStructureData(CurveType.Child, AssetClass.Rates, properties); BaseCurve = referenceCurve; ReferenceCurveId = BaseCurve.GetPricingStructureId(); }
protected virtual MDSResult <QuotedAssetSet> OnRequestMarketData( IModuleInfo clientInfo, Guid requestId, MDSRequestType requestType, NamedValueSet requestParams, DateTimeOffset subsExpires, QuotedAssetSet standardQuotedAssetSet) { throw new NotSupportedException("This provider (" + ProviderId + ") does not support the OnRequestMarketData method!"); }
protected override MDSResult <QuotedAssetSet> OnRequestMarketData( IModuleInfo clientInfo, Guid requestId, MDSRequestType requestType, NamedValueSet requestParams, DateTimeOffset subsExpires, QuotedAssetSet standardQuotedAssetSet) { return(RunBloombergRequest(clientInfo, requestId, requestParams, MDSRequestType.Current, DateTimeOffset.Now, standardQuotedAssetSet)); }
public void StartRealtimeFeed( IModuleInfo clientInfo, Guid subscriptionId, NamedValueSet requestParams, QuotedAssetSet instruments, TimeSpan subsLifetime, AsyncQueueCallback <QuotedAssetSet> callback) { _mds.StartRealtimeFeed( clientInfo, subscriptionId, requestParams, instruments, subsLifetime, callback); }
public MDSResult <QuotedAssetSet> GetMarketQuotes( MDSProviderId provider, IModuleInfo clientInfo, Guid requestId, bool throwOnError, NamedValueSet requestParams, QuotedAssetSet instruments) { // construct market data request return(_mds.GetMarketQuotes( provider, clientInfo, requestId, throwOnError, requestParams, instruments)); }
/// <summary> /// Handles the case of tenor curves /// </summary> /// <returns></returns> public QuotedAssetSet CreateTenorSet() { var result = new QuotedAssetSet(); var quotes = new List <BasicAssetValuation>(); foreach (Pair <Asset, BasicAssetValuation> assetAndQuote in _assetAndQuotes) { quotes.Add(assetAndQuote.Second); } result.instrumentSet = null; result.assetQuote = quotes.ToArray(); return(result); }
private void AddBaseCurveInputs(List <BasicAssetValuation> assetQuotes) { QuotedAssetSet baseCurveInputs = ((YieldCurveValuation)BaseCurve?.GetFpMLData().Second)?.inputs; if (baseCurveInputs?.assetQuote != null) { foreach (BasicAssetValuation assetQuote in baseCurveInputs.assetQuote) { BasicAssetValuation clonedAssetQuote = XmlSerializerHelper.Clone(assetQuote); clonedAssetQuote.definitionRef = BaseCurveName; assetQuotes.Add(clonedAssetQuote); } } }
public void AddQuotedAssetSet(QuotedAssetSet quotedAssetSet) { quotedAssetSet = BinarySerializerHelper.Clone(quotedAssetSet); //_lastQuotedAssetSet = quotedAssetSet; if (null == _lastQuotedAssetSet) { _lastQuotedAssetSet = quotedAssetSet; } else { MergeQuotedAssetSet(quotedAssetSet); } }
private void RemoveMarketQuoteValues(QuotedAssetSet marketData) { // strip out market quote values foreach (var item in marketData.assetQuote) { foreach (var quote in item.quote) { if (quote.measureType.Value != "MarketQuote") { continue; } quote.valueSpecified = false; quote.value = 0.0m; } } }
public MDSResult <QuotedAssetSet> RequestMarketQuotes( IModuleInfo clientInfo, Guid requestId, NamedValueSet requestParams, MDSRequestType requestType, DateTimeOffset subsExpires, QuotedAssetSet standardQuotedAssetSet) { Logger.LogDebug("{0}.RequestMarketQuotes", GetType().Name); Logger.LogDebug(" Inputs:"); Logger.LogDebug(" Request Id : {0}", requestId); Logger.LogDebug(" Request Type: {0}", requestType); Logger.LogDebug(" Other params: {0}", requestParams.Serialise()); return(OnRequestMarketData( clientInfo, requestId, requestType, requestParams, subsExpires, standardQuotedAssetSet)); }
/// <summary> /// Initializes a new instance of the <see cref="RateBasisCurve"/> class. /// </summary> /// <param name="logger">The logger.</param> /// <param name="cache">The cache.</param> /// <param name="nameSpace">The client namespace</param> /// <param name="referenceCurve">The reference parent curve id.</param> /// <param name="spreadAssets">The spreads by asset.</param> /// <param name="properties">The properties of the new spread curve.</param> /// <param name="fixingCalendar">The fixingCalendar.</param> /// <param name="rollCalendar">The rollCalendar.</param> public RateBasisCurve(ILogger logger, ICoreCache cache, string nameSpace, IRateCurve referenceCurve, QuotedAssetSet spreadAssets, NamedValueSet properties, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) : base(logger, cache, nameSpace, ProcessQuotedAssetSet(logger, cache, nameSpace, referenceCurve, spreadAssets, properties, fixingCalendar, rollCalendar), properties, fixingCalendar, rollCalendar) { PricingStructureData = new PricingStructureData(CurveType.Child, AssetClass.Rates, properties); BaseCurve = referenceCurve; ReferenceCurveId = BaseCurve.GetPricingStructureId(); if (PricingStructureIdentifier.PricingStructureType != PricingStructureTypeEnum.RateBasisCurve) { return; } //Set the spread sets. PriceableRateSpreadAssets = PriceableAssetFactory.CreatePriceableRateSpreadAssets(logger, cache, nameSpace, PricingStructureIdentifier.BaseDate, spreadAssets, fixingCalendar, rollCalendar); Build(logger, cache, nameSpace, fixingCalendar, rollCalendar); }
private void LogResults(ILogger logger, QuotedAssetSet results) { foreach (BasicAssetValuation instrument in results.assetQuote) { logger.LogDebug("{0}:", instrument.objectReference.href); foreach (BasicQuotation field in instrument.quote) { logger.LogDebug(" '{0}' ({1}/{2}) = {3} (as at {4}) (received {5})", (field.timing != null) ? field.timing.Value : "Last", // side (null=last) field.measureType.Value, // usually "MarketQuote" unless error field.quoteUnits.Value, // usually "Rate" unless error field.valueSpecified ? field.value.ToString(CultureInfo.InvariantCulture) : "#N/A", field.valuationDateSpecified ? field.valuationDate.ToShortTimeString() : "???", field.timeSpecified ? field.time.ToShortTimeString() : "???"); } } }
private static void LogResults(ILogger logger, QuotedAssetSet results) { foreach (BasicAssetValuation instrument in results.assetQuote) { logger.LogDebug("{0}:", instrument.objectReference.href); foreach (BasicQuotation field in instrument.quote) { logger.LogDebug(" '{0}' ({1}/{2}) = {3} [Source:{4},Recd:{5}]", field.GetStandardFieldName(), // field name field.measureType.Value, // usually "MarketQuote" unless error field.quoteUnits.Value, // usually "Rate" unless error field.valueSpecified ? field.value.ToString(CultureInfo.InvariantCulture) : "#N/A", ProviderName(field.informationSource), //field.valuationDateSpecified ? field.valuationDate.ToShortTimeString() : "???", field.timeSpecified ? field.time.ToShortTimeString() : "???"); } } }
/// <summary> /// Maps from a list of asset pairs to a quoted asset set. /// </summary> /// <param name="assetPairs"></param> /// <returns></returns> internal static QuotedAssetSet MapFromAssetPairs(List <Pair <Asset, BasicAssetValuation> > assetPairs) { var quotedAssetSet = new QuotedAssetSet(); var assets = new Asset[assetPairs.Count]; var bavs = new BasicAssetValuation[assetPairs.Count]; var index = 0; foreach (var pair in assetPairs) { assets[index] = pair.First; bavs[index] = pair.Second; index++; } quotedAssetSet.assetQuote = bavs; quotedAssetSet.instrumentSet = assets; return(quotedAssetSet); }
// Assumption - QAS contains one BAV with one BQ // private static void MergeQuotedAssetSet(QuotedAssetSet quotedAssetSet) { BasicAssetValuation bavNew = quotedAssetSet.assetQuote[0]; BasicQuotation bqNew = bavNew.quote[0]; string newInstrumentId = bavNew.objectReference.href; List <BasicAssetValuation> basicAssetValuationsOldWithTheSameIdAsNew = QuotedAssetSet.GetAssetQuote(_lastQuotedAssetSet, newInstrumentId); if (basicAssetValuationsOldWithTheSameIdAsNew.Count == 0) { // Add // var temp = new List <BasicAssetValuation>(_lastQuotedAssetSet.assetQuote) { bavNew }; _lastQuotedAssetSet.assetQuote = temp.ToArray(); } else { //update BasicAssetValuation bavOld = basicAssetValuationsOldWithTheSameIdAsNew[0]; bool bqUpdated = false; foreach (BasicQuotation bqOld in bavOld.quote) { if (bqNew.timing.Value == bqOld.timing.Value) { bqOld.value = bqNew.value; bqUpdated = true; break; } } if (!bqUpdated) { // Add // var tempBQ = new List <BasicQuotation>(bavOld.quote) { bqNew }; bavOld.quote = tempBQ.ToArray(); } } }
public QuotedAssetSet Create() { var result = new QuotedAssetSet(); var assets = new List <Asset>(); var quotes = new List <BasicAssetValuation>(); foreach (Pair <Asset, BasicAssetValuation> assetAndQuote in _assetAndQuotes) { assets.Add(assetAndQuote.First); quotes.Add(assetAndQuote.Second); } var instrumentSet = new InstrumentSet { Items = assets.ToArray() }; result.instrumentSet = instrumentSet; result.assetQuote = quotes.ToArray(); return(result); }
public static Market CreateYieldCurveConfiguration(string curveId, QuotedAssetSet quotedAssetSet) { var market = new Market { id = curveId }; //Create the curve information. var curve = new YieldCurve { id = curveId }; //reate the valuation structure that contains qas. var curveValuation = new YieldCurveValuation { id = curveId, inputs = quotedAssetSet }; //Set the market. market.Items = new[] { (PricingStructure)curve }; market.Items1 = new[] { (PricingStructureValuation)curveValuation }; return(market); }
protected override MDSResult <QuotedAssetSet> OnRequestPricingStructure( IModuleInfo clientInfo, Guid requestId, MDSRequestType requestType, NamedValueSet requestParams, DateTimeOffset subsExpires, NamedValueSet structureParams) { var combinedResult = new QuotedAssetSet(); var debugRequest = requestParams.GetValue <bool>("DebugRequest", false); Client.DebugRequests = debugRequest; IExpression query = Expr.BoolAND(structureParams); List <QuotedAssetSet> providerResults = Client.LoadObjects <QuotedAssetSet>(query); Client.DebugRequests = false; // merge multiple results combinedResult = providerResults.Aggregate(combinedResult, (current, providerResult) => current.Merge(providerResult, false, true, true)); return(new MDSResult <QuotedAssetSet> { Result = combinedResult }); }
/// <summary> /// Initializes a new instance of the <see cref="RateXccySpreadCurve"/> class, /// by applying spreads to an existing RateCurve. Using FX Curve to create synthetic swaps /// for the period under 1Y. /// </summary> /// <param name="logger">The logger.</param> /// <param name="cache">The cache.</param> /// <param name="nameSpace">THe client namespace</param> /// <param name="properties">The properties of the new curve. One of the mandatory properties for this curve type: /// CutOverTerm, is the tenor at which point all Fx Curve points are removed form the RateXccyCurve bootstrap. /// Normally this is 1Y.</param> /// <param name="currency1Curve">The base zero curve.</param> /// <param name="fxCurve">The FX curve, used for constructing synthetic deposits. The fx points map from the base curve to the non-base curve.</param> /// <param name="currency2Curve">The non-Base Curve.</param> /// <param name="spreadInstruments">The spread instruments and their values.</param> /// <param name="fixingCalendar">The fixingCalendar.</param> /// <param name="rollCalendar">The rollCalendar.</param> public RateXccySpreadCurve(ILogger logger, ICoreCache cache, String nameSpace, NamedValueSet properties, RateCurve currency1Curve, IFxCurve fxCurve, RateCurve currency2Curve, QuotedAssetSet spreadInstruments, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) : base(logger, cache, nameSpace, new RateCurveIdentifier(properties)) { //Set the base curve. BaseCurve = currency1Curve; ReferenceCurveId = BaseCurve.GetPricingStructureId(); //PricingStructureIdentifier = new RateCurveIdentifier(properties); Currency2Curve = currency2Curve; //Get the cut-over date. var cutOverTerm = properties.GetValue <string>("CutOverTerm"); if (cutOverTerm != null) { CutOverTerm = PeriodHelper.Parse(cutOverTerm); } //set the fx curve. ReferenceFxCurve = fxCurve; IsCurrency1RateCurve = properties.GetValue <bool>("Currency1RateCurve"); //Check the pricing structure type. var pricingStructureId = (RateCurveIdentifier)PricingStructureIdentifier; if (pricingStructureId.PricingStructureType != PricingStructureTypeEnum.RateXccyCurve || ReferenceFxCurve == null) { return; } //There must be a valid quoted asset set in order to bootstrap. if (!XsdClassesFieldResolver.QuotedAssetSetIsValid(spreadInstruments)) { return; } PriceableRateSpreadAssets = PriceableAssetFactory.CreatePriceableRateSpreadAssets(logger, cache, nameSpace, pricingStructureId.BaseDate, spreadInstruments, fixingCalendar, rollCalendar); Build(logger, cache, nameSpace, fixingCalendar, rollCalendar); }
/// <summary> /// Initializes a new instance of the <see cref="RateBasisCurve"/> class. /// </summary> /// <param name="logger">The logger.</param> /// <param name="cache">The cache.</param> /// <param name="nameSpace">The client namespace</param> /// <param name="properties">The properties.</param> /// <param name="refCurve">The reference parent curve id.</param> /// <param name="spreadValueSet">The spread ValueSet.</param> /// <param name="fixingCalendar">The fixingCalendar.</param> /// <param name="rollCalendar">The rollCalendar.</param> public RateBasisCurve(ILogger logger, ICoreCache cache, string nameSpace, NamedValueSet properties, IPricingStructure refCurve, QuotedAssetSet spreadValueSet, IBusinessCalendar fixingCalendar, IBusinessCalendar rollCalendar) : base(logger, cache, nameSpace, AdjustMarketQuotes(spreadValueSet, refCurve.GetFpMLData(), PropertyHelper.ExtractUniqueCurveIdentifier(properties)), properties, fixingCalendar, rollCalendar) { PricingStructureData = new PricingStructureData(CurveType.Child, AssetClass.Rates, properties); ReferenceCurveId = refCurve.GetPricingStructureId(); }
protected override MDSResult <QuotedAssetSet> OnRequestMarketData( IModuleInfo clientInfo, Guid requestId, MDSRequestType requestType, NamedValueSet requestParams, DateTimeOffset subsExpires, QuotedAssetSet standardQuotedAssetSet) { // process request parameters RequestProperties requestProperties = ProcessRequestParams(requestParams); // process the asset/quote lists to produce 1 or more instrument/field matrices RequestContext requestContext = ConvertStandardAssetQuotesToProviderInstrFieldCodes(requestType, standardQuotedAssetSet); // process the instr/field code sets var results = new List <BasicAssetValuation>(); foreach (ProviderInstrFieldCodeSet instrFieldCodeSet in requestContext.ProviderInstrFieldCodeSets) { var providerResults = new Dictionary <string, BasicQuotation>(); // simulated reply var rng = new Random(); //List<BasicAssetValuation> results = new List<BasicAssetValuation>(); foreach (string t in instrFieldCodeSet.InstrumentIds) { var quote = new BasicAssetValuation { objectReference = new AnyAssetReference { href = t }, quote = new BasicQuotation[instrFieldCodeSet.FieldNames.Count] }; foreach (string t1 in instrFieldCodeSet.FieldNames) { var providerQuote = new BasicQuotation { measureType = new AssetMeasureType { Value = AssetMeasureEnum.MarketQuote.ToString() }, quoteUnits = new PriceQuoteUnits { Value = PriceQuoteUnitsEnum.Rate.ToString() }, value = Convert.ToDecimal(rng.NextDouble() * 10.0), valueSpecified = true }; // field value // simulator returns a random decimal value // field done string providerQuoteKey = FormatProviderQuoteKey(t, t1); providerResults[providerQuoteKey] = providerQuote; } } // process provider results //Dictionary<string, BasicQuotation> providerResults = BuildProviderResultsIndex(pages); results.AddRange(ConvertProviderResultsToStandardValuations(providerResults, requestContext)); } return(new MDSResult <QuotedAssetSet> { Result = new QuotedAssetSet { assetQuote = results.ToArray() } }); }