2010-01-05 24 views
9

Có ai biết cách lấy dữ liệu không đồng bộ thông qua API dữ liệu mới của Bloomberg (COM v3) bằng Python không? Tôi tìm thấy mã này dưới đây trên wilmott.com và nó hoạt động tốt, nhưng nó cho phiên bản API cũ.Dữ liệu không đồng bộ thông qua API dữ liệu mới của Bloomberg (COM v3) bằng Python?

Có ai biết mã tương ứng cho phiên bản mới không?

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() 

Trả lời

19

Cuối cùng tôi đã tìm ra. Tôi đã làm một chút công bằng của công việc thám tử combrowse.py, và tôi so sánh với các ví dụ JAVA, C, C++ và .NET trong bản tải xuống BBG API. Điều thú vị là người trợ giúp của Bloomberg biết rất nhiều null khi nói đến những thứ này, hoặc có lẽ tôi chỉ đang nói chuyện với người sai.

Đây là mã của tôi.

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' 

Đối với dữ liệu lịch sử tôi đã sử dụng kịch bản đơn giản này:

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

tuyệt vời! Tôi đã tìm kiếm nó khắp nơi. Bây giờ tất cả những gì tôi cần là để nó cũng xử lý các yêu cầu dữ liệu lịch sử! Gọi cho tôi trên thiết bị đầu cuối bberg nếu bạn có thứ hai. –

+0

Tôi đã thêm tập lệnh dữ liệu lịch sử ở trên. Tôi đã không xem xét một thời gian, tôi đặt cược họ có thể được đơn giản hóa một chút. – c00kiemonster

+0

Nhận xét của Scooter: "Kể từ ngày 24 tháng 1 năm 2012, các hằng số được thay đổi.' RESPONSE = 6' 'PARTIAL_RESPONSE = 7'. Tôi đã xác định điều này bằng thử và sai." –

0

Để hoạt động, bạn cần cài đặt Bloomberg Desktop v3 API SDK, tôi đã làm điều đó, khởi động lại máy của mình, có vẻ như hoạt động. Nếu không có khởi động lại nó chỉ bị rơi.

Nếu bạn sử dụng trình khám phá Com, bạn sẽ thấy các phần tử nở hoa hiện có mặt

Các vấn đề liên quan