#python #bloomberg #blpapi
#python #bloomberg #blpapi
Вопрос:
Я пытаюсь запросить моментальный снимок у Bloomberg через Python API, используя примеры программ, которые Bloomberg предоставил вместе с пакетом. Их собственная программа не работает должным образом, и я продолжаю получать сообщение об ошибке:
WARN blpapi_subscriptionmanager.cpp:1653 blpapi.session.subscriptionmanager.{1} Subscription management endpoints are required for snapshot request templates but none are available
blpapi.exception.UnsupportedOperationException: No subscription management endpoints for snapshot (0x00080013).
Часть кода, содержащая запрос моментального снимка, находится в main func:
def main():
"""main entry point"""
global options
options = parseCmdLine()
# Create a session and Fill SessionOptions
sessionOptions = blpapi.SessionOptions()
for idx, host in enumerate(options.hosts):
sessionOptions.setServerAddress(host, options.port, idx)
sessionOptions.setAuthenticationOptions(options.auth)
sessionOptions.setAutoRestartOnDisconnection(True)
print("Connecting to port %d on %s" % (
options.port, ", ".join(options.hosts)))
session = blpapi.Session(sessionOptions)
if not session.start():
print("Failed to start session.")
return
subscriptionIdentity = None
if options.auth:
subscriptionIdentity = session.createIdentity()
isAuthorized = False
authServiceName = "//blp/apiauth"
if session.openService(authServiceName):
authService = session.getService(authServiceName)
isAuthorized = authorize(authService, subscriptionIdentity,
session, blpapi.CorrelationId("auth"))
if not isAuthorized:
print("No authorization")
return
else:
print("Not using authorization")
# Snapshot Request Part:
fieldStr = "?fields=" ",".join(options.fields)
snapshots = []
nextCorrelationId = 0
for i, topic in enumerate(options.topics):
subscriptionString = options.service topic fieldStr
snapshots.append(session.createSnapshotRequestTemplate(
subscriptionString,
subscriptionIdentity,
blpapi.CorrelationId(i)))
nextCorrelationId = 1
requestTemplateAvailable = blpapi.Name('RequestTemplateAvailable')
eventCount = 0
try:
while True:
# Specify timeout to give a chance for Ctrl-C
event = session.nextEvent(1000)
for msg in event:
if event.eventType() == blpapi.Event.ADMIN and
msg.messageType() == requestTemplateAvailable:
for requestTemplate in snapshots:
session.sendRequestTemplate(
requestTemplate,
blpapi.CorrelationId(nextCorrelationId))
nextCorrelationId = 1
elif event.eventType() == blpapi.Event.RESPONSE or
event.eventType() == blpapi.Event.PARTIAL_RESPONSE:
cid = msg.correlationIds()[0].value()
print("%s - %s" % (cid, msg))
else:
print(msg)
if event.eventType() == blpapi.Event.RESPONSE:
eventCount = 1
if eventCount >= options.maxEvents:
print("%d events processed, terminating." % eventCount)
break
elif event.eventType() == blpapi.Event.TIMEOUT:
for requestTemplate in snapshots:
session.sendRequestTemplate(
requestTemplate,
blpapi.CorrelationId(nextCorrelationId))
nextCorrelationId = 1
Я не знаю, являются ли конечная точка и конечная точка управления подпиской двумя разными вещами, потому что у меня есть еще один код, работающий правильно, а конечной точкой является IP-адрес сервера, с которого я извлекаю данные.
Комментарии:
1. Вероятной причиной этого является подключение к API рабочего стола вместо API BPIPE или сервера. Вам также не хватает кода, который вызывает моментальные снимки; это просто раздел авторизации.
2. Я добавил часть запроса моментального снимка и удалил код для авторизации, поскольку я могу успешно пройти авторизацию. Кроме того, я выяснил, что конечная точка — это IP-адрес, такой же, как IP-адрес сервера. Поэтому я не понимаю, как он не может найти конечную точку. Является ли конечная точка управления подпиской чем-то совершенно другим?
3. Конечная точка управления подпиской — это ваш BPIPE. Если вы не подключаетесь к одному из них, моментальные снимки не будут работать.