
d_host = "localhost";d_port = 8194;Sessionoptions sessionoptions;sessionoptions.setServerHost(d_host.c_str());sessionoptions.setServerPort(d_port);Session session(sessionoptions);Service refDataService = session.getService("//blp/refdata");Request request = refDataService.createRequest("ReferenceDataRequest");request.append("securitIEs","MSFT US EQUITY");request.append("fIElds","CHAIN_TICKERS");// add overrIDesElement overrIDes = request.getElement("overrIDes");Element overrIDe1 = overrIDes.appendElement();overrIDe1.setElement("fIEldID","CHAIN_PUT_CALL_TYPE_OVRD");overrIDe1.setElement("value","C");Element overrIDe2 = overrIDes.appendElement();overrIDe2.setElement("fIEldID","CHAIN_POINTS_OVRD");overrIDe2.setElement("value",100);Element overrIDe3 = overrIDes.appendElement();overrIDe3.setElement("fIEldID","CHAIN_EXP_DT_OVRD");overrIDe3.setElement("value","20250203");std::cout << "Sending Request: " << request << std::endl;CorrelationID cID(this);session.sendRequest(request,cID);(followed by event handling) 现在我有几个问题/问题:
>代码编译没有问题,但在Bloomberg终端上运行时,会打印以下错误:
我该如何解决这个问题呢?我假设我在覆盖字段的某个地方犯了一个错误.
>我需要调整我的代码以下载特定成熟度下的所有可用选项,即我希望获得所有选项的列表,直到今天15年.
>然后,我如何下载每个期权的隐含波动率?我是否需要将代码存储在一个数组中,然后为每个选项发送一个“IVol_MID”字段的请求,或者是否有某种方法可以立即获得所有的波动率?
编辑:这是我的事件处理程序的代码,因为这似乎是问题.
session.sendRequest(request,cID); while (true) { Event event = session.nextEvent(); MessageIterator msgiter(event); while (msgiter.next()) { Message msg = msgiter.message(); if (msg.correlationID() == cID) { processMessage(msg); } } if (event.eventType() == Event::RESPONSE) { break; } } voID processMessage(Message &msg){ Element securityDataArray = msg.getElement(Security_DATA); int numSecuritIEs = securityDataArray.numValues(); for (int i = 0; i < numSecuritIEs; ++i) { Element securityData = securityDataArray.getValueAsElement(i); std::cout << securityData.getElementAsstring(Security) << std::endl; const Element fIEldData = securityData.getElement(FIELD_DATA); for (size_t j = 0; j < fIEldData.numElements(); ++j) { Element fIEld = fIEldData.getElement(j); if (!fIEld.isValID()) { std::cout << fIEld.name() << " is NulL." << std::endl; } else { std::cout << fIEld.name() << " = " << fIEld.getValueAsstring() << std::endl; } } Element fIEldExceptionArray = securityData.getElement(FIELD_EXCEPTIONS); for (size_t k = 0; k < fIEldExceptionArray.numValues(); ++k) { Element fIEldException = fIEldExceptionArray.getValueAsElement(k); std::cout << fIEldException.getElement(ERROR_INFO).getElementAsstring( "category") << ": " << fIEldException.getElementAsstring(FIELD_ID); } std::cout << std::endl; }解决方法 问题出在您未显示的事件处理代码中.你可能错误地解析它. 运行您的查询我得到以下结果:
MSFT US 01/20/17 C23MSFT US 01/20/17 C25MSFT US 01/20/17 C30MSFT US 01/20/17 C33MSFT US 01/20/17 C35MSFT US 01/20/17 C38MSFT US 01/20/17 C40MSFT US 01/20/17 C43MSFT US 01/20/17 C45MSFT US 01/20/17 C47MSFT US 01/20/17 C50MSFT US 01/20/17 C52.5MSFT US 01/20/17 C55MSFT US 01/20/17 C57.5MSFT US 01/20/17 C60MSFT US 01/20/17 C65MSFT US 01/20/17 C70
注意:我使用的是Java API,但它基本相同.
更新:
您的代码不能正确解析字段数据数组元素:返回的数据包含一系列序列,因此您需要分两步解析它.而不是fIEld.getValueAsstring(),你应该有一个看起来像这样的代码(它在Java中,没有经过测试):
//...for (int i = 0; i < fIEld.numValues(); i++) { Element sequence = fIEld.getValueAsElement(i); ElementIterator it = sequence.elementIterator(); while (it.hasNext()) { Element e = it.next(); System.out.println(e.getValueAsstring()); } 如果这不起作用,我建议您逐步调试代码并检查您收到的数据类型并相应地处理它.
有关详细信息,请阅读Developer’s guide,特别是A.2.3.
总结以上是内存溢出为你收集整理的c – 通过API的Bloomberg Equity Option Chain全部内容,希望文章能够帮你解决c – 通过API的Bloomberg Equity Option Chain所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)