问题:如何从 Bloomberg API 持续接收美元/日元的最高价和最低价?目前仅从彭博社的初始化绘制消息中接收此信息,随后我仅收到返回的出价和要价(报价)。
概述: 大家好
我正在使用 Bloomberg API 开发实时金融数据应用程序,但遇到了一些障碍。虽然我可以收到买入价和卖出价的持续更新,但最高价和最低价似乎只在最初的订阅响应期间出现。我需要这些高价和低价随着买价和卖价不断更新。
这是我当前订阅美元/日元数据的简化版本:
from blpapi import SubscriptionList, SessionOptions, Session
def create_session():
session_options = SessionOptions()
session_options.setServerHost('localhost')
session_options.setServerPort(8194)
session = Session(session_options)
session.start()
session.openService('//blp/mktdata')
return session
def subscribe_to_data(session):
subscription_list = SubscriptionList()
subscription_list.add('USDJPY Curncy', ["BID","ASK","HIGH","LOW", ""] blpapi.CorrelationId('USDJPY'))
session.subscribe(subscription_list)
def process_message(msg):
if msg.hasElement('BID') and msg.hasElement('ASK'):
bid = msg.getElementAsFloat('BID')
ask = msg.getElementAsFloat('ASK')
if msg.hasElement('HIGH') and msg.hasElement('LOW'):
high = msg.getElementAsFloat('HIGH')
low = msg.getElementAsFloat('LOW')
# Update application state with new values
update_gui(bid, ask, high, low)
def main():
session = create_session()
subscribe_to_data(session)
while True:
event = session.nextEvent()
for msg in event:
process_message(msg)
if __name__ == "__main__":
main()
我仅在初始订阅响应期间收到高价和低价(事件类型init Paint / Summary),但在后续实时更新中不会收到高价和低价。我想确保美元/日元的每次更新中都包含最高价和最低价,或者至少在一天中最高价和最低价发生变化时包含在内。
我需要对我的订阅或数据处理进行哪些更改才能在每次实时更新中持续接收高价和低价以及买价和卖价?
我正在使用 Bloomberg Python API (
blpapi
)。任何有关如何正确配置订阅以确保持续的高价和低价更新的建议或示例将不胜感激,而不是目前我只是在从 BLPAPI 收到的初始化绘制消息期间收到此信息
预先感谢您的帮助!
已解决,感谢@DS_London
import blpapi
class RealTimePricing:
def __init__(self, security="EUR Curncy", interval=0.5):
self.security = security
self.interval = interval
self.session = None
def start_session(self):
options = blpapi.SessionOptions()
options.setServerHost("localhost")
options.setServerPort(8194)
self.session = blpapi.Session(options)
if not self.session.start():
print("Failed to start session.")
return False
if not self.session.openService("//blp/mktdata"):
print("Failed to open //blp/mktdata")
return False
return True
def subscribe(self):
subscription_list = blpapi.SubscriptionList()
subscription_list.add(self.security, "BID,ASK,HIGH,LOW,PRICE_HIGH_RT,HIGH_TDY,PX_HIGH_ASK_RT,PX_HIGH_BID_RT",
f"interval={self.interval}", blpapi.CorrelationId(self.security))
self.session.subscribe(subscription_list)
def process_message(self, msg):
fields = ["HIGH", "LOW", "PRICE_HIGH_RT", "HIGH_TDY", "PX_HIGH_ASK_RT", "PX_HIGH_BID_RT"]
for field in fields:
if msg.hasElement(field):
value = msg.getElementAsFloat(field)
print(f"{field}: {value}")
def event_loop(self):
try:
while True:
event = self.session.nextEvent(500)
if event.eventType() in [blpapi.Event.SUBSCRIPTION_DATA, blpapi.Event.SUBSCRIPTION_STATUS]:
for msg in event:
self.process_message(msg)
except KeyboardInterrupt:
print("Exiting...")
if __name__ == "__main__":
pricing = RealTimePricing()
if pricing.start_session():
pricing.subscribe()
pricing.event_loop()
关键问题
try:
high, low = msg.getElementAsFloat("HIGH"), msg.getElementAsFloat("LOW")
except Exception:
pass
尝试从同一条消息访问这两个值,因此它仅在初始化绘制期间有效
相反,后续消息首先来自高位,然后是低位,因此它会失败,因为它试图同时访问这两个消息并失败
以上代码块也可以完美运行,感谢@DS_London