2013-08-03 51 views
2

不幸的是,我在論壇上引導相信(但沒有100%確定性)彭博桌面API一次不允許多個IntradayBarRequest或IntradayTickRequest,這與HistoricalDataRequest或Subscriptions不同,其中多個同時請求是允許。Bloomberg API:如何將請求與IntradayBarRequest上的響應關聯?

這個問題是因此很可能沒有實際意義,除非有人告訴我,上面是不是真的

如果爲真,那麼處理以下問題的唯一辦法,就是隻有在發送每一個新的請求前一個已經處理完畢。


我使用Python彭博桌面API訪問訂閱(即時更新)和歷史每日數據爲金融證券。在這兩種情況下,我都可以發送多個同時發送的請求,並且在響應到達時(不一定按發送請求的順序),我可以使用msg.getElement(「securityData」)找出響應與哪個安全相關聯.getElementAsString(「security」)在歷史數據的情況下,或者在訂閱數據的情況下,通過使用msg.correlationIds()[0] .value()事先查詢我已經設置的correlationId(在訂閱請求時) 。

然而,我不知道如何爲IntradayBarResponse請求(和WAPI文檔沒有幫助)做到這一點。這些似乎沒有setable correlationId,也沒有上述「securityData」字段。如果我發送多個intradayBarRequests,我如何才能找出響應的安全性?

這是我的代碼(改編自API Python示例)。

import blpapi # interface to bloomberg 
import time # will need this for time parsing 
from optparse import OptionParser 
import pdb  # debugger, when necessary 
import csv  # for csv reading 
import string # for string parsing 
from pymongo import MongoClient 
import inspect 
from datetime import datetime 
from bson.son import SON 


def parseCmdLine(): 
    parser = OptionParser(description="Retrieve realtime data.") 
    parser.add_option("-a", 
         "--ip", 
         dest="host", 
         help="server name or IP (default: %default)", 
         metavar="ipAddress", 
         default="localhost") 
    parser.add_option("-p", 
         dest="port", 
         type="int", 
         help="server port (default: %default)", 
         metavar="tcpPort", 
         default=8194) 
    parser.add_option("--me", 
         dest="maxEvents", 
         type="int", 
         help="stop after this many events (default: %default)", 
         metavar="maxEvents", 
         default=100000000000) 
    parser.add_option("--mongohost", 
         dest="mongohost", 
         default="192.168.1.30") 
    parser.add_option("--mongoport", 
         dest="mongoport", 
         type="int", 
         default=27017) 

    (options, args) = parser.parse_args() 

    return options 


def main(): 
    options = parseCmdLine() 

    # connect to MongoDB MONGO MONGO MONGO MONGO ---------------- 
    print "Connecting to MongoDB" 
    print options.mongohost 
    print options.mongoport 
    client = MongoClient(options.mongohost, options.mongoport) # connect to MongoDB 
    db = client.bb # connect to the DB database 
    bbsecs = db.bbsecs 
    bbticks = db.bbticks 
    # now get the securities list 


    # Fill SessionOptions 
    sessionOptions = blpapi.SessionOptions() 
    sessionOptions.setServerHost(options.host) 
    sessionOptions.setServerPort(options.port) 

    print "connecting to Bloomberg" 
    print "Connecting to %s:%d" % (options.host, options.port) 

    # Create a Session 
    session = blpapi.Session(sessionOptions) 

    # Start a Session 
    if not session.start(): 
     print "Failed to start session." 
     return 

    # open the market data subscription service 
    if not session.openService("//blp/mktbar"): 
     print "Failed to open //blp/mktbar" 
     return 
    if not session.openService("//blp/refdata"): 
     print "Failed to open //blp/refdata" 
     return 



    # now startup the subscription list 
    # Now open the secs.dat file and read it, append each to subscription list 
    maxtimes = bbticks.aggregate([{'$group': {'_id':'$ticker', 'maxtime':{'$max': '$time'}}}]) # get the last updates by ticker 
    refDataService = session.getService("//blp/refdata") # start the ref 
    for i in maxtimes["result"]: 
     ticker = i["_id"] 
     tstamp = i["maxtime"] 
     request = refDataService.createRequest("IntradayBarRequest") 
     request.set("security", ticker) 
     request.set("eventType", "TRADE") 
     request.set("interval", 1) 
     request.set("startDateTime", tstamp) 
     request.set("endDateTime", datetime.now()) 
     print "Sending Request:", ticker 
     session.sendRequest(request) 

    subscriptions = blpapi.SubscriptionList() 
    secdic = dict() # a new dictionary 
    for post in bbsecs.find(): 
     print(post["ticker"]) 
     # subscribe tick 
     #subscriptions.add(str(post["ticker"]), "LAST_PRICE", [], blpapi.CorrelationId("TICK:" + str(post["ticker"]))) 
     #subscribe 1 minute bars 
     subscriptions.add("//blp/mktbar/ticker/"+str(post["ticker"]), 
          "LAST_PRICE", 
          "interval=1.0", 
          blpapi.CorrelationId(str(post["ticker"]))) 
     # setup the dictionary 
     secdic[post["bbsecnum"]] = post["ticker"] 
    if not session.openService("//blp/refdata"): 
     print "Failed to open //blp/refdata" 
     return 
    # now subscribe 
    session.subscribe(subscriptions) 


    # HISTORICALHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 
    # Obtain previously opened service 
    #refDataService = session.getService("//blp/refdata") 
    # Create and fill the request for the historical data 
    #request = refDataService.createRequest("HistoricalDataRequest") 
    #for post in bbsecs.find(): 
    # request.getElement("securities").appendValue(str(post["ticker"])) 
    #request.getElement("fields").appendValue("LAST_PRICE") 
    #request.set("periodicityAdjustment", "ACTUAL") 
    #request.set("periodicitySelection", "DAILY") 
    #request.set("startDate", "20100101") 
    #request.set("endDate", "20121231") 
    #request.set("maxDataPoints", 2000) 
    #print "Sending Request:", request 
    # Send the request 
    #session.sendRequest(request) 
    #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 


    try: 
     # Process received events 
     eventCount = 0 
     while(True): 
      # We provide timeout to give the chance to Ctrl+C handling: 
      event = session.nextEvent(500) 
      for msg in event: 
       if event.eventType() == blpapi.Event.SUBSCRIPTION_STATUS: 
        #print "%s - %s" % (msg.correlationIds()[0].value(), msg) 
        print "subscription status" 
       elif event.eventType() == blpapi.Event.SUBSCRIPTION_DATA: 
        key = msg.correlationIds()[0].value() 
        if msg.messageType() == "MarketBarStart": 
         open = msg.getElementAsFloat("OPEN") 
         high = msg.getElementAsFloat("HIGH") 
         low = msg.getElementAsFloat("LOW") 
         close = msg.getElementAsFloat("CLOSE") 
         btstamp = msg.getElementAsDatetime("TIME") 
         tstamp = datetime.now() 
         print "bar", key, close, tstamp 
         bbticks.insert({"type": "BAR", "ticker": key, "value": close, \ 
           "open": open, "high": high, "low": low, "close": close, \ 
           "time": tstamp}) 
        elif msg.messageType() == "MarketBarUpdate": 
         close = msg.getElementAsFloat("CLOSE") 
         #print "tick", close, 
         #bbticks.insert({"type": "TICK", "ticker": key, "value": close, "time": tstamp}) 

        #if etype == "TRADE": 
        # if msg.hasElement("LAST_TRADE"): 
        #  key = msg.correlationIds()[0].value(), 
        #  keytype = key[:(key.index(":"))] 
        #  key = key[(key.index(":") + 1):] 
        #  value = msg.getElementAsString("LAST_TRADE") 
        #  timestamp = msg.getElementAsDatetime("TRADE_UPDATE_STAMP_RT") 
        #  print key, value, 
        #  bbticks.insert({"ticker": key, "value": value, "timestamp": timestamp}) 

       else: 
        if msg.messageType() == "HistoricalDataResponse": 
         securityData = msg.getElement("securityData") 
         security = securityData.getElementAsString("security") 
         fieldDataArray = securityData.getElement("fieldData") 
         for j in range(0, fieldDataArray.numValues()): 
          fieldData = fieldDataArray.getValueAsElement(j) 
          field = fieldData.getElement(0) 
          tstamp = field.getValueAsDatetime() 
          tstamp = datetime(tstamp.year, tstamp.month, tstamp.day) 
          field = fieldData.getElement(1) 
          close = field.getValueAsFloat() 
          #print "history", security, close, 
          #bbticks.insert({"type": "DAILY", "ticker": security, "value": close, "close": close, \ 
          #  "time": tstamp}) 
        elif msg.messageType() == "IntradayBarResponse": 
         print "IntradayBarResponse" 
         data = msg.getElement("barData").getElement("barTickData") 
         numvals = data.numValues() 
         print numvals 
         if numvals > 0: 
          print data.getValueAsElement(1).getElement(1).getValueAsFloat() 



      if event.eventType() == blpapi.Event.SUBSCRIPTION_DATA: 
       eventCount += 1 
       if eventCount >= options.maxEvents: 
        break 
    finally: 
     # Stop the session 
     session.stop() 

if __name__ == "__main__": 
    try: 
     main() 
    except KeyboardInterrupt: 
     print "Ctrl+C pressed. Stopping..." 

我已經看過了eidData,即使我要求它被返回,它也是空的。我正在研究貨幣,而不是股票,所以不需要交換權利。

> (Pdb) print eid._Element__dataHolder IntradayBarResponse = { 
>  barData = { 
>   eidData[] = { 
>   } 
>   barTickData[] = { 
>    barTickData = { 
>     time = 2013-08-02T18:36:00.000 
>     open = 4.233100 
>     high = 4.233600 
>     low = 4.233100 
>     close = 4.233400 
>     volume = 0 
>     numEvents = 119 
>     value = 0.000000 
>    } 
>    barTickData = { 
>     time = 2013-08-02T18:37:00.000 
>     open = 4.233400 
>     high = 4.233700 
>     low = 4.233100 
>     close = 4.233500 
>     volume = 0 
>     numEvents = 96 
>     value = 0.000000 
>    } 
>    barTickData = { 
>     time = 2013-08-02T18:38:00.000 
>     open = 4.233500 
>     high = 4.233600 
>     low = 4.233300 
>     close = 4.233500 
>     volume = 0 
>     numEvents = 135 
>     value = 0.000000 
>    } 
>    barTickData = { 
>     time = 2013-08-02T18:39:00.000 

我仍然在尋找一種方式,以響應請求,而無需做效率低下的請求關聯....等待迴應....要求等。我不知道,如果彭博社提供此功能但是。此限制似乎也存在於歷史記錄數據中。

+0

鑑於此服務每月需要花費數千美元,所以我建議您詢問提供商。 –

+2

相信與否,這已經發生在我身上。但是,如果您要進一步調查,您將知道SERVER api每月需要花費數千美元,並且這是「提供商」提供官方API支持的唯一API。使用臺式機API,確實花費數千美元,但遠低於服務器,但沒有支持(可疑的彭博商業戰略讓人們支付更多費用)。因此我的問題。謝謝。 –

+1

我沒有使用Python API,我使用的是.Net,但是我知道你可以同時有幾個IntradayBarRequests「在空中」。我使用CorrelID,它工作正常。據我所知, – ytoledano

回答

2

托馬斯,您應該始終使用響應的correlationId來查找它與哪個請求相關聯。 IIRC,參考數據和歷史數據請求支持多種證券,但市場數據和日內條形圖每個請求可能只有一個安全性。

這就是爲什麼refdata和歷史響應中存在額外的「securityData」字段的原因。對於市場數據和盤中酒吧而言,相關ID足以識別請求並從而確定安全性。

希望它有幫助。

+0

歷史盤中線條(API中的「IntradayBarRequest」)不支持可設置的相關ID。那就是問題所在。答案* do *有一個相關ID,是的,但它不是用戶可以設置的,據我所知,因此是無用的。一個人被迫請求,處理直到完成,然後再次請求。與歷史日常數據(securityData)或實時訂閱(settable correlationId)不同,在這裏可以進行批量處理,這要歸功於將響應與請求鏈接起來。 –

2

我不知道python API,但我使用Java API。

我仍在尋找一種將請求與響應相關聯的方式,而不必執行低效率請求....等待響應....請求等。

當你發現,你不能將查詢發送多個證券IntradayBarRequests和飼料不包含安全ID(如行情)方便地返回映射到您的查詢。

最簡單的解決方案是使用關聯ID。向會話提交請求時,您可以提供自己的關聯標識。下面的例子是在Java中,但我認爲,蟒蛇API是相似的:

Session session = ...; //Bloomberg Session 
CorrelationId cId = new CorrelationId(); //Unique ID 
session.sendRequest(bbRequest, cId); //provide your own ID 

然後,如果您使用的是異步會話,您將收到該有一個鏈接到原來的correlationID異步消息:

public void processEvent(Event event, Session session) { 
    for (Message msg : event) { 
     CorrelationID cId = msg.correlationID(); 
     //here you can link the result back to your original query 
    } 
} 
+0

謝謝,但我試過了,並且在Python API中出現了重複的關聯ID錯誤。我將在明天致電彭博社的支持,試圖解決這個問題。 –

+0

每個關聯應該是唯一的。您也可以提供您自己的ID。在Java中:'new CorrelationID(1);'例如Id爲1。 – assylias

+0

@ThomasBrowne你是否設法使它工作? – assylias

0

我不相信你可以下標勾選或禁止數據。這就是爲什麼... 對於定價數據,您會在每次更改值時收到回覆。不是勾選數據只是這些價格的歷史?對於小節數據,這不是一個價格的歷史記錄,通過按照一段時間(即10分鐘,1小時)進行分組來刪除一些細節。所以如果你可以訂閱,你應該什麼時候收到彭博社的每一個新回覆?本質上,您可以創建自己的偵聽器來完成分組,然後從偵聽器以您自己選擇的頻率發出響應。

順便說一句:我使用CLR與python的.net blp對象交談。我的解決方案早於任何支持彭博的Python,基本上做了'不能做'的事情。

相關問題