您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

通过使用Python的Bloomberg新数据API(COM v3)异步数据?

通过使用Python的Bloomberg新数据API(COM v3)异步数据?

我终于弄明白了。我做了一些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
python 2022/1/1 18:27:46 有237人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶