2010-01-05 15 views
9

¿Alguien sabe cómo obtener datos asincrónicos a través de la nueva API de datos de Bloomberg (COM v3) con Python? Encontré este código a continuación en wilmott.com y funciona muy bien, pero es para la versión anterior de la API.Datos asincrónicos a través de la nueva API de datos de Bloomberg (COM v3) con Python?

¿Alguien sabe el código correspondiente para 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() 

Respuesta

19

finalmente lo he descubierto. Hice un poco de trabajo detectivesco combrowse.py, y comparé con los ejemplos JAVA, C, C++ y .NET en la descarga BBG API. Curiosamente, la gente del servicio de asistencia de Bloomberg sabía casi nulo cuando se trataba de estas cosas, o tal vez solo 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 script sencillo:

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

fantástico! He estado buscando en todas partes esto. ¡Ahora todo lo que necesito es que también maneje las solicitudes de datos históricos! Llámame a la terminal bberg si tienes segundo. –

+0

Agregué el script de datos históricos anterior. No los he visto por un tiempo, apuesto a que se pueden simplificar un poco. – c00kiemonster

+0

Comentario de Scooter: "A partir del 24 de enero de 2012, las constantes cambian." RESPUESTA = 6 "' PARTIAL_RESPONSE = 7'. Lo he determinado por ensayo y error ". –

0

Para que funcione necesita instalar Bloomberg Desktop v3 API SDK, lo hice, reinicié mi máquina, parece que funciona. Sin el reinicio, simplemente se bloqueó.

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

Cuestiones relacionadas