通过彭博的新的数据API(COM V3)与Python异步数据? [英] Asynchronous data through Bloomberg's new data API (COM v3) with Python?
问题描述
有谁知道如何通过彭博的新的数据API(COM V3)使用Python获取异步数据?我发现这个code以下的wilmott.com,它工作得很好,但它是旧的API版本。
有谁知道相应的code的新版本?
从win32com.client进口DispatchWithEvents
从pythoncom进口PumpWaitingMessages,空,缺少
从时间导入时间类BBCommEvent:
高清昂达(个体经营,安全,饼干,字段,数据,状态):
打印昂达:'+'Data` 高清的onStatus(个体经营,状态,子状态,状态说明):
打印'的onStatus类TestAsync:
高清__init __(个体经营):
CLSID ='{F2303261-4969-11D1-B305-00805F815CBF}
进程id ='Bloomberg.Data.1 打印连接到BBComm
BLP = DispatchWithEvents(CLSID,BBCommEvent)
blp.AutoRelease = FALSE
blp.Subscribe('EUR Curncy',1,'LAST_PRICE',结果=空)
blp.Flush() END_TIME =时间()+ 5 而1:
PumpWaitingMessages()
如果END_TIME<时间():
打印'超时'
打破如果__name__ ==__main__:
TA = TestAsync()
我终于想通了。我做的combrowse.py的侦查工作公平一点,我与Java,C,C ++,并在BBG API下载.NET的例子进行比较。有趣的是彭博服务台人都知道pretty很多空的时候遇到这些事情,也许我只是说给错了人。
下面是我的code。
asynchronousHandler.py:
进口win32com.client
从pythoncom进口PumpWaitingMessages
从时间导入时间,的strftime
进口常量一流的事件处理程序:
高清OnProcessEvent(个体经营,结果):
事件= win32com.client.gencache.EnsureDispatch(结果)
如果event.EventType == constants.SUBSCRIPTION_DATA:
self.getData(事件)
ELIF event.EventType == constants.SUBSCRIPTION_STATUS:
self.getStatus(事件)
其他:
self.getMisc(事件)
高清的getData(个体经营,事件):
迭代= event.CreateMessageIterator()
而iterator.Next():
消息= iterator.Message
dataString =''
对于字段索引,在历数(constants.fields)领域:
如果message.AsElement.HasElement(场):
元素= message.GetElement(场)
如果element.IsNull:
theValue =''
其他:
theValue =',值:+ STR(element.Value)
dataString = dataString +',(型号:'+ element.Name + theValue +')'
打印的strftime(%M /%D /%Y%H:%M:%S')+',消息类型:'+ message.MessageTypeAsString +',的correlationID:+ STR(message.CorrelationId)+ dataString
高清getMisc(个体经营,事件):
迭代= event.CreateMessageIterator()
而iterator.Next():
消息= iterator.Message
打印的strftime(%M /%D /%Y%H:%M:%S')+',消息类型:'+ message.MessageTypeAsString
的getStatus高清(个体经营,事件):
迭代= event.CreateMessageIterator()
而iterator.Next():
消息= iterator.Message
如果message.AsElement.HasElement(理由):
元素= message.AsElement.GetElement(理由)
打印的strftime(%M /%D /%Y%H:%M:%S')+',消息类型:'+ message.MessageTypeAsString +',的correlationID:+ STR(message.CorrelationId)+',类别: '+ element.GetElement('类')值+',说明:'+ element.GetElement(说明)值
如果message.AsElement.HasElement('例外'):
元素= message.AsElement.GetElement('例外')
exceptionString =''
在范围(element.NumValues)N:
exceptionInfo = element.GetValue(N)
fieldId = exceptionInfo.GetElement('fieldId')
原因= exceptionInfo.GetElement(理由)
exceptionString = exceptionString +',(现场:'+ fieldId.Value +'类别:'+ reason.GetElement('类')值+',说明:'+ reason.GetElement(说明)值+' )
打印的strftime(%M /%D /%Y%H:%M:%S')+',消息类型:'+ message.MessageTypeAsString +',的correlationID:+ STR(message.CorrelationId)+ exceptionString类bloombergSource:
高清__init __(个体经营):
会话= win32com.client.DispatchWithEvents('blpapicom.Session',事件处理程序)
session.Start()
开始= session.OpenService('// BLP / mktdata')
订阅= session.CreateSubscriptionList()
对于tickerIndex,股票在历数(constants.tickers):
如果len(constants.interval)GT; 0:
subscriptions.AddEx(股票,constants.fields,constants.interval,session.CreateCorrelationId(tickerIndex))
其他:
subscriptions.Add(股票,constants.fields,session.CreateCorrelationId(tickerIndex))
session.Subscribe(订阅)
ENDTIME =时间()+ 2
而真正的:
PumpWaitingMessages()
如果ENDTIME<时间():
打破如果__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
响应= 5
SESSION_STATUS = 2
SUBSCRIPTION_DATA = 8
SUBSCRIPTION_STATUS = 3
TIMEOUT = 10
TOKEN_STATUS = 15
TOPIC_STATUS = 14
UNKNOWN = -1
域= ['出价']
代号= ['AUD Curncy']
间隔=''#'间隔= 5.0'
有关历史资料我用这个简单的脚本:
进口win32com.client会话= win32com.client.Dispatch('blpapicom.Session')
session.QueueEvents = TRUE
session.Start()
开始= session.OpenService('// BLP / refdata')
DataService的= session.GetService('// BLP / refdata')
请求= dataService.CreateRequest('HistoricalDataRequest')
request.GetElement('证券')。AppendValue('5 HK公平)
request.GetElement('场')。AppendValue('PX_LAST')
request.Set('periodicitySelection','日报)
request.Set('的startDate','20090119')
request.Set('结束日期','20090130')
CID = session.SendRequest(要求)
ADMIN = 1
AUTHORIZATION_STATUS = 11
BLPSERVICE_STATUS = 9
PARTIAL_RESPONSE = 6
PUBLISHING_DATA = 13
REQUEST_STATUS = 4
RESOLUTION_STATUS = 12
响应= 5
SESSION_STATUS = 2
SUBSCRIPTION_DATA = 8
SUBSCRIPTION_STATUS = 3
TIMEOUT = 10
TOKEN_STATUS = 15
TOPIC_STATUS = 14
UNKNOWN = -1
stayHere = TRUE
而stayHere:
事件= session.NextEvent();
如果event.EventType == PARTIAL_RESPONSE或event.EventType ==回应:
迭代= event.CreateMessageIterator()
iterator.Next()
消息= iterator.Message
securityData = message.GetElement('securityData')
securityName = securityData.GetElement(安全)
fieldData = securityData.GetElement('fieldData')
returnList = [0有效范围内的山坳(fieldData.GetValue(行).NumValues + 1)]为行范围(fieldData.NumValues)
在范围(fieldData.NumValues)行:
rowField = fieldData.GetValue(行)
有效范围内的山口(rowField.NumValues + 1):
colField = rowField.GetElement(COL)
returnList [行] [山口] = colField.Value
stayHere = FALSE
打破
元素=无
迭代器=无
消息=无
事件=无
会话=无
打印returnList
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's for the old API version.
Does anyone know the corresponding code for the new version?
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()
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
这篇关于通过彭博的新的数据API(COM V3)与Python异步数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!