Pregunta

¿Alguien sabe cómo conseguir los datos asíncronos través de la nueva API de datos de Bloomberg (v3 COM) con Python? He encontrado este código a continuación en wilmott.com y funciona muy bien, pero es para la versión de la API de edad.

¿Alguien sabe el código correspondiente a la nueva versión?

from win32com.client import DispatchWithEvents
from pythoncom import PumpWaitingMessages, Empty, Missing
from time import time

class BBCommEvent:
    def OnData(self, Security, cookie, Fields, Data, Status):
        print 'OnData: ' + `Data`

    def OnStatus(self, Status, SubStatus, StatusDescription):
        print 'OnStatus'

class TestAsync:
    def __init__(self):
        clsid = '{F2303261-4969-11D1-B305-00805F815CBF}'
        progid = 'Bloomberg.Data.1'

        print 'connecting to BBComm'        
        blp = DispatchWithEvents(clsid, BBCommEvent)
        blp.AutoRelease = False
        blp.Subscribe('EUR Curncy', 1, 'LAST_PRICE', Results = Empty)
        blp.Flush()

        end_time = time() + 5

        while 1:
            PumpWaitingMessages()
            if end_time < time():
                print 'timed out'
                break

if __name__ == "__main__":
    ta = TestAsync()
¿Fue útil?

Solución

Finalmente descubierto. Hice un poco de trabajo de detective combrowse.py, y en comparación con el de Java, C, C ++, .NET y ejemplos de la API de descarga BBG. Es interesante que la gente Bloomberg Helpdesk sabían prácticamente nula cuando se trata de estas cosas, o tal vez estaba hablando con la persona equivocada.

Aquí está mi código.

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'

Para los datos históricos He utilizado este sencillo 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

Otros consejos

Para que funcione es necesario instalar Bloomberg escritorio v3 SDK API, lo hice, reiniciar mi máquina, parece que funciona. Sin el reinicio se acaba de estrellarse.

Si utiliza Com explorador, verá los elementos de Bloomberg están ahora presentes

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top