Asynchronous data through Bloomberg's new data API (COM v3) with Python?

前端 未结 2 658
青春惊慌失措
青春惊慌失措 2020-12-23 18:47

Does anyone know how to get asynchronous data through Bloomberg\'s new data API (COM v3) with Python? I found this code below on wilmott.com and it works just fine, but it\'

相关标签:
2条回答
  • 2020-12-23 18:53

    For it to work you need to install Bloomberg Desktop v3 API SDK, I did that, restarted my machine, seems to work. Without the restart it just crashed.

    If you use Com explorer, you will see the bloomberg elements are now present

    0 讨论(0)
  • 2020-12-23 18:57

    I finally figured it out. I did a fair bit of combrowse.py detective work, and I compared with the JAVA, C, C++, and .NET examples in the BBG API download. Interestingly enough the Bloomberg Helpdesk people knew pretty much null when it came to these things, or perhaps I was just talking to the wrong person.

    Here is my code.

    asynchronousHandler.py:

    import win32com.client
    from pythoncom import PumpWaitingMessages
    from time import time, strftime
    import constants
    
    class EventHandler:
        def OnProcessEvent(self, result):
            event = win32com.client.gencache.EnsureDispatch(result) 
            if event.EventType == constants.SUBSCRIPTION_DATA:
                self.getData(event)
            elif event.EventType == constants.SUBSCRIPTION_STATUS:
                self.getStatus(event)
            else:
                self.getMisc(event)
        def getData(self, event):
            iterator = event.CreateMessageIterator()
            while iterator.Next():
                message = iterator.Message  
                dataString = ''
                for fieldIndex, field in enumerate(constants.fields):           
                    if message.AsElement.HasElement(field):
                        element = message.GetElement(field)
                        if element.IsNull:
                            theValue = ''
                        else:
                            theValue = ', Value: ' + str(element.Value) 
                        dataString = dataString + ', (Type: ' + element.Name + theValue + ')'
                print strftime('%m/%d/%y %H:%M:%S') + ', MessageType: ' + message.MessageTypeAsString + ', CorrelationId: ' + str(message.CorrelationId) + dataString
        def getMisc(self, event):
            iterator = event.CreateMessageIterator()
            while iterator.Next():
                message = iterator.Message
                print strftime('%m/%d/%y %H:%M:%S') + ', MessageType: ' + message.MessageTypeAsString
        def getStatus(self, event):
            iterator = event.CreateMessageIterator()
            while iterator.Next():
                message = iterator.Message
                if message.AsElement.HasElement('reason'):
                    element = message.AsElement.GetElement('reason')
                    print strftime('%m/%d/%y %H:%M:%S') + ', MessageType: ' + message.MessageTypeAsString + ', CorrelationId: ' + str(message.CorrelationId) + ', Category: ' + element.GetElement('category').Value + ', Description: ' + element.GetElement('description').Value 
                if message.AsElement.HasElement('exceptions'):
                    element = message.AsElement.GetElement('exceptions')
                    exceptionString = ''
                    for n in range(element.NumValues):
                        exceptionInfo = element.GetValue(n)
                        fieldId = exceptionInfo.GetElement('fieldId')
                        reason = exceptionInfo.GetElement('reason')
                        exceptionString = exceptionString + ', (Field: ' + fieldId.Value + ', Category: ' + reason.GetElement('category').Value + ', Description: ' + reason.GetElement('description').Value + ') ' 
                    print strftime('%m/%d/%y %H:%M:%S') + ', MessageType: ' + message.MessageTypeAsString + ', CorrelationId: ' + str(message.CorrelationId) + exceptionString
    
    class bloombergSource:
        def __init__(self):
            session = win32com.client.DispatchWithEvents('blpapicom.Session' , EventHandler)
            session.Start()
            started = session.OpenService('//blp/mktdata')
            subscriptions = session.CreateSubscriptionList()
            for tickerIndex, ticker in enumerate(constants.tickers):
                if len(constants.interval) > 0:
                    subscriptions.AddEx(ticker, constants.fields, constants.interval, session.CreateCorrelationId(tickerIndex))
                else:
                    subscriptions.Add(ticker, constants.fields, session.CreateCorrelationId(tickerIndex))   
            session.Subscribe(subscriptions)
            endTime = time() + 2
            while True:
                PumpWaitingMessages()
                if endTime < time():                
                    break               
    
    if __name__ == "__main__":
        aBloombergSource = bloombergSource()
    

    constants.py:

    ADMIN = 1
    AUTHORIZATION_STATUS = 11
    BLPSERVICE_STATUS = 9
    PARTIAL_RESPONSE = 6
    PUBLISHING_DATA = 13
    REQUEST_STATUS = 4
    RESOLUTION_STATUS = 12
    RESPONSE = 5
    SESSION_STATUS = 2
    SUBSCRIPTION_DATA = 8
    SUBSCRIPTION_STATUS = 3
    TIMEOUT = 10
    TOKEN_STATUS = 15
    TOPIC_STATUS = 14
    UNKNOWN = -1
    fields = ['BID']
    tickers = ['AUD Curncy']
    interval = '' #'interval=5.0'
    

    For historical data I used this simple script:

    import win32com.client
    
    session = win32com.client.Dispatch('blpapicom.Session')
    session.QueueEvents = True
    session.Start()
    started = session.OpenService('//blp/refdata')
    dataService = session.GetService('//blp/refdata')
    request = dataService.CreateRequest('HistoricalDataRequest')
    request.GetElement('securities').AppendValue('5 HK Equity')
    request.GetElement('fields').AppendValue('PX_LAST')
    request.Set('periodicitySelection', 'DAILY')
    request.Set('startDate', '20090119')
    request.Set('endDate', '20090130')
    cid = session.SendRequest(request)
    ADMIN = 1
    AUTHORIZATION_STATUS = 11
    BLPSERVICE_STATUS = 9
    PARTIAL_RESPONSE = 6
    PUBLISHING_DATA = 13
    REQUEST_STATUS = 4
    RESOLUTION_STATUS = 12
    RESPONSE = 5
    SESSION_STATUS = 2
    SUBSCRIPTION_DATA = 8
    SUBSCRIPTION_STATUS = 3
    TIMEOUT = 10
    TOKEN_STATUS = 15
    TOPIC_STATUS = 14
    UNKNOWN = -1
    stayHere = True
    while stayHere:
        event = session.NextEvent();
        if event.EventType == PARTIAL_RESPONSE or event.EventType == RESPONSE:
            iterator = event.CreateMessageIterator()
            iterator.Next()
            message = iterator.Message
            securityData = message.GetElement('securityData')
            securityName = securityData.GetElement('security')
            fieldData = securityData.GetElement('fieldData')
            returnList = [[0 for col in range(fieldData.GetValue(row).NumValues+1)] for row in range(fieldData.NumValues)]
            for row in range(fieldData.NumValues):
                rowField = fieldData.GetValue(row)
                for col in range(rowField.NumValues+1):
                    colField = rowField.GetElement(col)
                    returnList[row][col] = colField.Value
            stayHere = False
            break
    element = None
    iterator = None
    message = None
    event = None
    session = None
    print returnList
    
    0 讨论(0)
提交回复
热议问题