2016-06-01 13 views
1

Ich versuche, den SECURITY_DES-Feldwert für eine bekannte CUSIP mit unbekanntem Fixed Income-Typ (könnte ein Unternehmen, Treasury, Hypothek oder Asset sein) -backed usw.). Ich verwende eine deklarierte Variante, um die Bloomberg-Antwort zurückzugeben, die "# N/A Sec" zeigt, egal wie ich meine Anfrage strukturiere.Bloomberg VBA - BLPSubscribe-Methode, die "# N/A Sec" für CUSIP-Eingabe zurückgibt

Ich führe dies innerhalb von Excel und haben die "Bloomberg Data Type Library" -Referenz hinzugefügt. Ich werde den folgenden Code einfügen; Ich habe versucht, die CUSIP als/CUSIP/xxxxxxxxx, xxxxxxxxx CUSIP, IDxxxxxxxxx, alle ohne Glück zu formatieren. Ich habe Googling für die Formatierungshilfe ausprobiert, konnte aber keine passenden Diskussionen finden, die für mich funktionierten.

Ich legte einen Haltepunkt direkt nach der letzten Zeile eingefügt; Wenn ich die BloombergReturnData-Variable beobachte, sehe ich "# N/A Sec" im BloombergReturnData (0,0) -Ausdruck, was ich erwarte - nur mit der tatsächlichen Beschreibung der Sicherheit, die anstelle von "# N/A Sec" zurückgegeben wird.

Wenn Sie noch nicht erwischt haben, bin ich kein Programmierer von Beruf, sondern Bloomberg und VBA in letzter Zeit verwendet, um einige Lücken im Büro zu füllen. Basierend auf dem, was ich gelesen habe, vermute ich, dass ich die festverzinsliche Art (Corp, Govt, Mtge, etc.) weitergeben muss, aber ich weiß das nicht in meinem aktuellen Datensatz und müsste das irgendwie nachverfolgen .

Mit Bloombergs GUI kann ich "IDxxxxxxxxx" eingeben (x steht für eine CUSIP), um zum Hauptmenü für eine Sicherheit zu gelangen.

Hier sind ein paar Probe CUSIP: 428236BR3, 500255AV6, 912828UE8, 49126PET3, 912828SC5, 912828MS6, 02225AFW7

Wie kann ich meine BLPSubscribe Anfrage formatieren Sie die Security Beschreibung von Bloomberg zurückzukehren erfolgreich?



EDIT: Das beantwortet wurde. Ich benutzte eine alte Referenz und Struktur, die Bloomberg nicht mehr unterstützt. Unter Verwendung von Informationen aus einem von Mikael Katajamäki geschriebenen Blogbeitrag habe ich meinen Anruf unter Verwendung der aktualisierten Referenz ("Bloomberg API COM 3.5 Type Library") und des Sicherheitsnamensformats "/ cusip/xxxxxxxxx" umstrukturiert. Der aktualisierte Code unten ist (beachten Sie, dass Sie das Klassenmodul von Mikael Katajamäki Blog-Post benötigen, wenn Sie auf Kopie dieser Struktur beabsichtigen):

 ' BCOM_wrapper is from Mikael Katajamäki's Bloomberg Class Module 
     Dim BloombergModule As BCOM_wrapper 
     Set BloombergModule = New BCOM_wrapper 
     Dim BloombergReturnData As Variant 
     Dim BloombergFields(0) As Variant 
     Dim BloombergSecurities(0) As Variant 
     Dim SecurityDescription As String 
     ' Prepare request for the SECURITY_DES field, "Security Description"... 
     BloombergFields(0) = "SECURITY_DES" 
     BloombergSecurities(0) = ("/cusip/" & CStr(SQLResults![CUSIP])) 
     ' getData() is from Mikael Katajamäki's Bloomberg Class Module 
     BloombergReturnData = BloombergModule.getData(REFERENCE_DATA, BloombergSecurities, BloombergFields) 

     ' I used an absolute reference to the (0,0) slot since the nature of my use here is always just a single security 
     SecurityDescription = BloombergReturnData(0, 0) 

     Range("D" & CStr(Right(Target.Address, 2))).Value = SecurityDescription 

Mikael Katajamäki Blog Beitrag: http://mikejuniperhill.blogspot.com/2013/06/bloomberg-v3com-api-wrapper-update-for.html

Archiv von Mikael Katajamäki Klassenmodul (bitte mich benachrichtigen, wenn dies gegen die Regeln, und ich werde löschen):

Option Explicit 
' 
' public enumerator for request type 
Public Enum ENUM_REQUEST_TYPE 
    REFERENCE_DATA = 1 
    HISTORICAL_DATA = 2 
    BULK_REFERENCE_DATA = 3 
End Enum 
' 
' constants 
Private Const CONST_SERVICE_TYPE As String = "//blp/refdata" 
Private Const CONST_REQUEST_TYPE_REFERENCE As String = "ReferenceDataRequest" 
Private Const CONST_REQUEST_TYPE_BULK_REFERENCE As String = "ReferenceDataRequest" 
Private Const CONST_REQUEST_TYPE_HISTORICAL As String = "HistoricalDataRequest" 
' 
' private data structures 
Private bInputSecurityArray() As Variant 
Private bInputFieldArray() As Variant 
Private bOutputArray() As Variant 
' 
' BCOM objects 
Private bSession As blpapicomLib2.Session 
Private bService As blpapicomLib2.Service 
Private bRequest As blpapicomLib2.REQUEST 
Private bSecurityArray As blpapicomLib2.Element 
Private bFieldArray As blpapicomLib2.Element 
Private bEvent As blpapicomLib2.Event 
Private bIterator As blpapicomLib2.MessageIterator 
Private bIteratorData As blpapicomLib2.Message 
Private bSecurities As blpapicomLib2.Element 
Private bSecurity As blpapicomLib2.Element 
Private bSecurityName As blpapicomLib2.Element 
Private bSecurityField As blpapicomLib2.Element 
Private bFieldValue As blpapicomLib2.Element 
Private bSequenceNumber As blpapicomLib2.Element 
Private bFields As blpapicomLib2.Element 
Private bField As blpapicomLib2.Element 
Private bDataPoint As blpapicomLib2.Element 
' 
' class non-object data members 
Private bRequestType As ENUM_REQUEST_TYPE 
Private bNumberOfDataPoints As Long 
Private bCalendarType As String 
Private bFrequency As String 
Private bMaxDataPoints As Long 
Private bStartDate As String 
Private bEndDate As String 
Private nSecurities As Long 
Private nSecurity As Long 
' 
Public Function getData(ByVal requestType As ENUM_REQUEST_TYPE, _ 
ByRef securities() As Variant, ByRef fields() As Variant, _ 
Optional ByVal calendarType As String, Optional ByVal dataFrequency As String, _ 
Optional ByVal startDate As Date, Optional ByVal endDate As Date) As Variant() 
    ' 
    bRequestType = requestType 
    bInputSecurityArray = securities 
    bInputFieldArray = fields 
    ' 
    If (bRequestType = ENUM_REQUEST_TYPE.HISTORICAL_DATA) Then 
     ' 
     bCalendarType = calendarType 
     bFrequency = dataFrequency 
     ' 
     If ((startDate = CDate(0)) Or (endDate = CDate(0))) Then _ 
      Err.Raise vbObjectError, "Bloomberg API", "Input parameters missing for historical data query" 
     bStartDate = convertDateToBloombergString(startDate) 
     bEndDate = convertDateToBloombergString(endDate) 
    End If 
    ' 
    openSession 
    sendRequest 
    catchServerEvent 
    releaseObjects 
    getData = bOutputArray 
End Function 
' 
Private Function openSession() 
    ' 
    Set bSession = New blpapicomLib2.Session 
    bSession.Start 
    bSession.OpenService CONST_SERVICE_TYPE 
    Set bService = bSession.GetService(CONST_SERVICE_TYPE) 
End Function 
' 
Private Function sendRequest() 
    ' 
    Select Case bRequestType 
     Case ENUM_REQUEST_TYPE.HISTORICAL_DATA 
      ReDim bOutputArray(0 To UBound(bInputSecurityArray, 1), 0 To 0) 
      Set bRequest = bService.CreateRequest(CONST_REQUEST_TYPE_HISTORICAL) 
      bRequest.Set "periodicityAdjustment", bCalendarType 
      bRequest.Set "periodicitySelection", bFrequency 
      bRequest.Set "startDate", bStartDate 
      bRequest.Set "endDate", bEndDate 
      ' 
     Case ENUM_REQUEST_TYPE.REFERENCE_DATA 
      Dim nSecurities As Long: nSecurities = UBound(bInputSecurityArray) 
      Dim nFields As Long: nFields = UBound(bInputFieldArray) 
      ReDim bOutputArray(0 To nSecurities, 0 To nFields) 
      ' 
      Set bRequest = bService.CreateRequest(CONST_REQUEST_TYPE_REFERENCE) 
      ' 
     Case ENUM_REQUEST_TYPE.BULK_REFERENCE_DATA 
      ReDim bOutputArray(0 To UBound(bInputSecurityArray, 1), 0 To 0) 
      Set bRequest = bService.CreateRequest(CONST_REQUEST_TYPE_BULK_REFERENCE) 
      ' 
    End Select 
    ' 
    Set bSecurityArray = bRequest.GetElement("securities") 
    Set bFieldArray = bRequest.GetElement("fields") 
    appendRequestItems 
    bSession.sendRequest bRequest 
End Function 
' 
Private Function appendRequestItems() 
    ' 
    Dim nSecurities As Long: nSecurities = UBound(bInputSecurityArray) 
    Dim nFields As Long: nFields = UBound(bInputFieldArray) 
    Dim i As Long 
    Dim nItems As Integer: nItems = getMax(nSecurities, nFields) 
    For i = 0 To nItems 
     If (i <= nSecurities) Then bSecurityArray.AppendValue CStr(bInputSecurityArray(i)) 
     If (i <= nFields) Then bFieldArray.AppendValue CStr(bInputFieldArray(i)) 
    Next i 
End Function 
' 
Private Function catchServerEvent() 
    ' 
    Dim bExit As Boolean 
    Do While (bExit = False) 
     Set bEvent = bSession.NextEvent 
     If (bEvent.EventType = PARTIAL_RESPONSE Or bEvent.EventType = RESPONSE) Then 
      ' 
      Select Case bRequestType 
       Case ENUM_REQUEST_TYPE.REFERENCE_DATA: getServerData_reference 
       Case ENUM_REQUEST_TYPE.HISTORICAL_DATA: getServerData_historical 
       Case ENUM_REQUEST_TYPE.BULK_REFERENCE_DATA: getServerData_bulkReference 
      End Select 
      ' 
      If (bEvent.EventType = RESPONSE) Then bExit = True 
     End If 
    Loop 
End Function 
' 
Private Function getServerData_reference() 
    ' 
    Set bIterator = bEvent.CreateMessageIterator 
    Do While (bIterator.Next) 
     Set bIteratorData = bIterator.Message 
     Set bSecurities = bIteratorData.GetElement("securityData") 
     Dim offsetNumber As Long, i As Long, j As Long 
     nSecurities = bSecurities.Count 
     ' 
     For i = 0 To (nSecurities - 1) 
      Set bSecurity = bSecurities.GetValue(i) 
      Set bSecurityName = bSecurity.GetElement("security") 
      Set bSecurityField = bSecurity.GetElement("fieldData") 
      Set bSequenceNumber = bSecurity.GetElement("sequenceNumber") 
      offsetNumber = CInt(bSequenceNumber.Value) 
      ' 
      For j = 0 To UBound(bInputFieldArray) 
       If (bSecurityField.HasElement(bInputFieldArray(j))) Then 
        Set bFieldValue = bSecurityField.GetElement(bInputFieldArray(j)) 
        ' 
        If (bFieldValue.DataType = BLPAPI_INT32) Then 
         bOutputArray(offsetNumber, j) = VBA.CLng(bFieldValue.Value) 
        Else 
         bOutputArray(offsetNumber, j) = bFieldValue.Value 
        End If 
       End If 
      Next j 
     Next i 
    Loop 
End Function 
' 
Private Function getServerData_bulkReference() 
    ' 
    Set bIterator = bEvent.CreateMessageIterator 
    nSecurity = nSecurity + 1 
    ' 
    Do While (bIterator.Next) 
     Set bIteratorData = bIterator.Message 
     Set bSecurities = bIteratorData.GetElement("securityData") 
     Dim offsetNumber As Long, i As Long, j As Long 
     Dim nSecurities As Long: nSecurities = bSecurities.Count 
     ' 
     Set bSecurity = bSecurities.GetValue(0) 
     Set bSecurityField = bSecurity.GetElement("fieldData") 
     ' 
     If (bSecurityField.HasElement(bInputFieldArray(0))) Then 
      Set bFieldValue = bSecurityField.GetElement(bInputFieldArray(0)) 
      ' 
      If ((bFieldValue.NumValues - 1) > UBound(bOutputArray, 2)) Then _ 
       ReDim Preserve bOutputArray(0 To UBound(bOutputArray, 1), 0 To bFieldValue.NumValues - 1) 
      ' 
      For i = 0 To bFieldValue.NumValues - 1 
       Set bDataPoint = bFieldValue.GetValue(i) 
       bOutputArray(nSecurity - 1, i) = bDataPoint.GetElement(0).Value 
      Next i 
     End If 
    Loop 
End Function 
' 
Private Function getServerData_historical() 
    ' 
    Set bIterator = bEvent.CreateMessageIterator 
    Do While (bIterator.Next) 
     Set bIteratorData = bIterator.Message 
     Set bSecurities = bIteratorData.GetElement("securityData") 
     Dim nSecurities As Long: nSecurities = bSecurityArray.Count 
     Set bSecurityField = bSecurities.GetElement("fieldData") 
     Dim nItems As Long, offsetNumber As Long, nFields As Long, i As Long, j As Long 
     nItems = bSecurityField.NumValues 
     If (nItems = 0) Then Exit Function 
     If ((nItems > UBound(bOutputArray, 2))) Then _ 
      ReDim Preserve bOutputArray(0 To nSecurities - 1, 0 To nItems - 1) 
     ' 
     Set bSequenceNumber = bSecurities.GetElement("sequenceNumber") 
     offsetNumber = CInt(bSequenceNumber.Value) 
     ' 
     If (bSecurityField.Count > 0) Then 
      For i = 0 To (nItems - 1) 
       ' 
       If (bSecurityField.Count > i) Then 
        Set bFields = bSecurityField.GetValue(i) 
        If (bFields.HasElement(bFieldArray(0))) Then 
         ' 
         Dim d(0 To 1) As Variant 
         d(0) = bFields.GetElement(0).GetValue(0) 
         d(1) = bFields.GetElement(1).GetValue(0) 
         bOutputArray(offsetNumber, i) = d 
        End If 
       End If 
      Next i 
     End If 
    Loop 
End Function 
' 
Private Function releaseObjects() 
    ' 
    Set bFieldValue = Nothing 
    Set bSequenceNumber = Nothing 
    Set bSecurityField = Nothing 
    Set bSecurityName = Nothing 
    Set bSecurity = Nothing 
    Set bSecurities = Nothing 
    Set bIteratorData = Nothing 
    Set bIterator = Nothing 
    Set bEvent = Nothing 
    Set bFieldArray = Nothing 
    Set bSecurityArray = Nothing 
    Set bRequest = Nothing 
    Set bService = Nothing 
    bSession.Stop 
    Set bSession = Nothing 
End Function 
' 
Private Function convertDateToBloombergString(ByVal d As Date) As String 
    ' 
    ' convert date data type into string format YYYYMMDD 
    Dim dayString As String: dayString = VBA.CStr(VBA.Day(d)): If (VBA.Day(d) < 10) Then dayString = "0" + dayString 
    Dim MonthString As String: MonthString = VBA.CStr(VBA.Month(d)): If (VBA.Month(d) < 10) Then MonthString = "0" + MonthString 
    Dim yearString As String: yearString = VBA.Year(d) 
    convertDateToBloombergString = yearString + MonthString + dayString 
End Function 
' 
Private Function getMax(ByVal a As Long, ByVal b As Long) As Long 
    ' 
    getMax = a: If (b > a) Then getMax = b 
End Function 
+0

Willkommen bei Stack Overflow. Ihre Beschreibung ist sehr detailliert - und was genau ist Ihre Frage? Bitte sei sehr genau, was du verlangst. – Matt

+0

Entschuldigung für die Unklarheit - Wie formatiere ich durch BLPSubscribe-Anfrage, um die Sicherheitsbeschreibung von Bloomberg erfolgreich zurückzugeben? – Bloomie

+0

Ich habe Ihre Frage zum obigen Text hinzugefügt. – Matt

Antwort

0

Sie formatieren würden durch „Cusip“ nach der CUSIP-Nummer vergeben. So BloombergReturnData = BloombergModule.BLPSubscribe ("xxxxxxx Cusip", BloombergFields) würde die erforderlichen Felder zurückgeben. Ich testete mit Ihrer Cusip-Liste und es füllt die Variante mit den richtigen Felddaten.

Bitte beachten Sie, dass das von Ihnen verwendete ActiveX-Steuerelement nicht mehr von Bloomberg unterstützt wird. Es gibt ein COM Data Control mit der "v3" -Schnittstelle.

+0

Danke! Ich habe den von mir verwendeten Verweis von "Bloomberg Data Type Library" auf "Bloomberg API COM 3.5 Type Library" aktualisiert. Ich verwiesen dann ein vor-geschriebenes Bloomberg-Klassen-Modul, das gemacht wurde, um Bloomberg-Anrufe zu optimieren, die ich an dieser URL fand (danke Mikael Katajamäki): http://mikejuniperhill.blogspot.com/2013/06/bloomberg-v3com-api-wrapper -update-for.html Ich habe eine leere Variante mit dem refaktorierten Code zurück erhalten, bis ich meinen Sicherheitsnamen als "/ cusip/xxxxxxxxx" umformatiert habe. Wird neuen Code in einer Bearbeitung der ursprünglichen Frage veröffentlichen. – Bloomie