【问题标题】:Bloomberg .Net API - Response Data for Multiple SecuritiesBloomberg .Net API - 多种证券的响应数据
【发布时间】:2012-09-07 09:50:51
【问题描述】:

假设我们使用 .Net API 向多个证券发送彭博历史数据请求,有没有什么优雅的方法可以分离/识别每个证券的响应数据?

我知道响应中有一个字段sequenceNumber,但不确定它是如何映射到每个证券的。我的代码 sn-p 在下面给出。

Service refDataService = session.GetService("//blp/refdata");
Request request = refDataService.CreateRequest("HistoricalDataRequest");
Element securities = request.GetElement("securities");
securities.AppendValue("EURUSD CURNCY");
securities.AppendValue("USDJPY CURNCY");
securities.AppendValue("GBPUSD Curncy");
securities.AppendValue("USDCHF Curncy");

Element fields = request.GetElement("fields");                
fields.AppendValue("OPEN");
fields.AppendValue("HIGH");
fields.AppendValue("LOW");
fields.AppendValue("PX_LAST");

request.Set("periodicityAdjustment", "CALENDAR");  
request.Set("periodicitySelection", "DAILY");
request.Set("startDate", DateTime.Now.AddDays(-30).ToString("yyyyMMdd"));
request.Set("endDate", Convert.ToString(null));

session.SendRequest(request, null);

while (true)
{
Event eventObj = session.NextEvent();
foreach (Message msg in eventObj.GetMessages()) 
{
    if (msg.MessageType.Equals(Name.GetName("HistoricalDataResponse")))
    {
        Element secDataArray = msg.GetElement("securityData");          
        Element securityData = secDataArray.GetElement(3);
        for (int index = 0; index < securityData.NumValues; index++)
        {
            Element fieldData = securityData.GetValueAsElement(index);
            Datetime time = fieldData.GetElementAsDate("date");
            decimal? open = fieldData.HasElement("OPEN") ? Convert.ToDecimal(fieldData.GetElementAsFloat64("OPEN")) : new decimal?();
            decimal? high = fieldData.HasElement("HIGH") ? Convert.ToDecimal(fieldData.GetElementAsFloat64("HIGH")) : new decimal?();
            decimal? low = fieldData.HasElement("LOW") ? Convert.ToDecimal(fieldData.GetElementAsFloat64("LOW")) : new decimal?();
            decimal? close = fieldData.HasElement("PX_LAST") ? Convert.ToDecimal(fieldData.GetElementAsFloat64("PX_LAST")) : new decimal?();
        }
    }
}
}

【问题讨论】:

    标签: c# .net bloomberg


    【解决方案1】:

    返回的sequenceNumber 值对应于您通过调用AppendValue 添加证券的顺序

    securities.AppendValue("EURUSD CURNCY");  // Sequence number 1
    securities.AppendValue("USDJPY CURNCY");  // Sequence number 2
    securities.AppendValue("GBPUSD Curncy");  // Sequence number 3
    securities.AppendValue("USDCHF Curncy");  // Sequence number 4
    

    根据BLPAPI: Developer’s Guide

    安全序列号,指定安全在请求中的位置。

    【讨论】:

    • 感谢您阐明 SequenceNumber 逻辑。除了SequenceNumber还有什么办法,例如我们可以通过SecurityName获取证券的整个响应吗?
    • @RavinderSingh 你为什么要这样做?比较序数更有效。
    • 是的,同意。我按照您建议的方式实施了解决方案,并且效果很好。感谢您的帮助。
    【解决方案2】:

    你可能还需要一个循环:

    foreach (Message msg in eventObj.GetMessages())
    {
       Element element = msg.GetElement("securityData");
    
       for (int i = 0; i < element.NumValues; i++)
       {
          Element security = element.GetValueAsElement(i);
          string ticker = security.GetElementAsString("security");
          Element fields = security.GetElement("fieldData");
          decimal px_last  = Convert.toDecimal(fields.GetElementAsFloat64("PX_LAST"));
       }
    }
    

    【讨论】:

      【解决方案3】:

      在 Java 中(易于转置):

      Element securityData = msg.getElement("securityData");
      String ticker = securityData.getElementAsString("security");
      

      【讨论】:

        【解决方案4】:

        您可以从securityData 元素中提取彭博代码,如下所示:

        string bloombergCode = secDataArray.GetElement("security").GetValueAsString();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-23
          • 1970-01-01
          相关资源
          最近更新 更多