5

.Net API を使用して複数の証券のブルームバーグ ヒストリカル データ リクエストを送信すると仮定すると、各証券の応答データを分離/識別するエレガントな方法はありますか?

応答にフィールドがあることは認識していますがsequenceNumber、それが各証券にどのようにマッピングされているかはわかりません。私のコードスニペットを以下に示します。

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?();
        }
    }
}
}
4

4 に答える 4

4

返される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による:開発者ガイド

要求内のセキュリティの位置を指定するセキュリティシーケンス番号。

于 2012-09-07T13:48:54.887 に答える
3

もう 1 つのループが必要になる場合があります。

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"));
   }
}
于 2012-12-05T08:10:52.617 に答える
0

securityData次のように、エレメントからブルームバーグ コードを抽出できます。

string bloombergCode = secDataArray.GetElement("security").GetValueAsString();
于 2015-09-20T21:02:27.803 に答える
0

Java の場合 (簡単に転置可能):

Element securityData = msg.getElement("securityData");
String ticker = securityData.getElementAsString("security");
于 2012-12-05T18:50:13.810 に答える