As you can see from another answer, the problem is event handling, so I rewrote this part with some examples from the Bloomberg API emulator .
session.sendRequest(request, cid); bool continueToLoop = true; while (continueToLoop) { Event evt = session.nextEvent(); switch (evt.eventType()) { case Event::RESPONSE: continueToLoop = false; //fall through case Event::PARTIAL_RESPONSE: ProcessReferenceDataEvent(evt); break; } } void ProcessReferenceDataEvent(Event evt) { const string level1 = ""; const string level2 = "\t"; const string level3 = "\t\t"; const string level4 = "\t\t\t"; std::cout << endl << endl; std::cout << level1 << "EventType = " << evt.eventType(); MessageIterator iter(evt); while (iter.next()) { Message msg = iter.message(); std::cout << endl << endl; std::cout << level1 << "correlationID = " << msg.correlationId().asInteger() << endl; std::cout << level1 << "messageType = " << msg.messageType().string() << endl; std::cout << endl << endl; Element SecurityDataArray = msg.getElement(SECURITY_DATA); int numSecurities = SecurityDataArray.numValues(); for (int valueIndex = 0; valueIndex < numSecurities; valueIndex++) { Element SecurityData = SecurityDataArray.getValueAsElement(valueIndex); string Security = SecurityData.getElementAsString(SECURITY); std::cout << level2 << Security << endl; bool hasFieldErrors = SecurityData.hasElement("fieldExceptions", true); if (hasFieldErrors) { Element FieldErrors = SecurityData.getElement(FIELD_EXCEPTIONS); for (size_t errorIndex = 0; errorIndex < FieldErrors.numValues(); errorIndex++) { Element fieldError = FieldErrors.getValueAsElement(errorIndex); string fieldId = fieldError.getElementAsString(FIELD_ID); Element errorInfo = fieldError.getElement(ERROR_INFO); string source = errorInfo.getElementAsString("source"); int code = errorInfo.getElementAsInt32("code"); string category = errorInfo.getElementAsString("category"); string strMessage = errorInfo.getElementAsString("message"); string subCategory = errorInfo.getElementAsString("subcategory"); cerr << level3 << "field error:" << endl; cerr << level4 << "fieldId = " << fieldId << endl; cerr << level4 << "source = " << source << endl; cerr << level4 << "code = " << code << endl; cerr << level4 << "category = " << category << endl; cerr << level4 << "errorMessage = " << strMessage << endl; cerr << level4 << "subCategory = " << subCategory << endl; } } bool isSecurityError = SecurityData.hasElement("securityError", true); if (isSecurityError) { Element secError = SecurityData.getElement("securityError"); string source = secError.getElementAsString("source"); int code = secError.getElementAsInt32("code"); string category = secError.getElementAsString("category"); string errorMessage = secError.getElementAsString("message"); string subCategory = secError.getElementAsString("subcategory"); cerr << level3 << "security error:" << endl; cerr << level4 << "source = " << source << endl; cerr << level4 << "code = " << code << endl; cerr << level4 << "category = " << category << endl; cerr << level4 << "errorMessage = " << errorMessage << endl; cerr << level4 << "subCategory = " << subCategory << endl; } else { Element FieldData = SecurityData.getElement(FIELD_DATA); double pxLast = FieldData.getElementAsFloat64("PX_LAST"); double bid = FieldData.getElementAsFloat64("BID"); double ask = FieldData.getElementAsFloat64("ASK"); string ticker = FieldData.getElementAsString("TICKER"); std::cout << level3 << "fields: " << endl; std::cout << level4 << "PX_LAST = " << pxLast << endl; std::cout << level4 << "BID = " << bid << endl; std::cout << level4 << "ASK = " << ask << endl; std::cout << level4 << "TICKER = " << ticker << endl; bool excludeNullElements = true; if (FieldData.hasElement("CHAIN_TICKERS", excludeNullElements)) { Element chainTickers = FieldData.getElement("CHAIN_TICKERS"); for (size_t chainTickerValueIndex = 0; chainTickerValueIndex < chainTickers.numValues(); chainTickerValueIndex++) { Element chainTicker = chainTickers.getValueAsElement(chainTickerValueIndex); string strChainTicker = chainTicker.getElementAsString("Ticker"); std::cout << level4 << "CHAIN_TICKER = " << strChainTicker << endl; } } else { std::cout << level4 << "NO CHAIN_TICKER information" << endl; } } } } }
Regarding the second question, Bloomberg support staff recommended that I simply select a large enough quantity so that all parameters are loaded, i.e.
override2.setElement("fieldId", "CHAIN_POINTS_OVRD"); override2.setElement("value", 50000);
For the third question, you can load the chains for all maturities by setting the redefinition of "CHAIN_EXP_DT_OVRD" to "EVERYTHING" (this part is not currently verified):
Element override3 = overrides.appendElement(); override3.setElement("fieldId", "CHAIN_EXP_DT_OVRD"); override3.setElement("value", 'ALL');
source share