有谁知道如何使用Python通过Bloomberg的新数据API(COM v3)获取异步数据?我在wilmott.com上的下面找到了此代码,它可以正常工作,但适用于旧的API版本。
有人知道新版本的相应代码吗?
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()
我终于弄明白了。我做了一些combrowse.py侦探工作,并与BBG API下载中的JAVA,C,C ++和.NET示例进行了比较。有趣的是,当涉及到这些事情时,彭博服务台人员知道几乎为零,或者也许我只是在和错误的人交谈。
这是我的代码。
automationHandler.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'
对于历史数据,我使用了以下简单脚本:
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