通过彭博的新的数据API(COM V3)与Python异步数据? [英] Asynchronous data through Bloomberg's new data API (COM v3) with Python?

查看:786
本文介绍了通过彭博的新的数据API(COM V3)与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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆