3

残念ながら、私はフォーラムで、ブルームバーグ デスクトップ API は同時に複数の IntradayBarRequest または IntradayTickRequest を許可しないと信じています (ただし、100% 確実ではありません)。これは、複数の同時要求が許可されている HistoricalDataRequest またはサブスクリプションとは異なります。

したがって、誰かが上記が真実ではないと私に言わない限り、この質問はおそらく意味がありません

true の場合、以下の質問を処理する唯一の方法は、前の要求が処理された後にのみ、新しい要求をそれぞれ送信することです。


私は Python Bloomberg Desktop API を使用して、定期購読 (ライブ更新) と金融証券の過去の日次データにアクセスしています。どちらの場合も、複数のリクエストを同時に送信できます。レスポンスが返ってきた場合 (必ずしもリクエストが送信された順序である必要はありません)、msg.getElement("securityData") を使用して、レスポンスが関連付けられているセキュリティを確認できます。 .getElementAsString("security") 履歴データの場合、またはサブスクリプション データの場合は、事前に (サブスクリプション要求時に) msg​​.correlationIds()[0].value() を使用して設定したcorrelationId をクエリします。 .

ただし、IntradayBarResponse リクエストに対してこれを行う方法がわかりません (WAPI ドキュメントは役に立ちません)。これらには設定可能なcorrelationIdがないようで、上記の「securityData」フィールドもありません。複数の intradayBarRequest を送信した場合、応答がどのセキュリティに対するものであるかを確認するにはどうすればよいですか?

これが私のコードです(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

非効率なリクエストを実行することなく、リクエストをレスポンスに関連付ける方法をまだ探しています....レスポンスを待つ....リクエストなど.ただし、ブルームバーグがこの機能を提供しているかどうかはわかりません. この制限は、ヒストリカル ティック データにも存在するようです。

4

3 に答える 3

2

Python API はわかりませんが、Java API は使用しています。

非効率的なリクエストを実行することなく、リクエストをレスポンスに関連付ける方法をまだ探しています....レスポンスを待ちます....リクエストなど.

お気づきのように、IntradayBarRequests の複数の証券のクエリを送信することはできず、フィードにはクエリに簡単にマップできるセキュリティ ID (ティッカーなど) が含まれていません。

最も簡単な解決策は、相関 ID を使用することです。セッションに要求を送信するときに、独自の相関 ID を指定できます。以下の例は Java ですが、Python 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
    }
}
于 2013-08-03T21:45:44.653 に答える
2

トーマス、応答のcorrelationIdを使用して、それが関連付けられている要求を見つける必要があります。IIRC、参照データ、履歴データのリクエストは複数の証券をサポートしていますが、市場データと日中バーはリクエストごとに 1 つの証券しか持たない場合があります。

そのため、refdata と履歴応答に追加の「securityData」フィールドがあります。市場データと日中バーの場合、correlationId は要求を識別してセキュリティを確認するのに十分です。

それが役に立てば幸い。

于 2013-08-03T15:16:54.510 に答える
0

ティックまたはバーのデータに添字を付けることができるとは思いません。理由の 1 つを次に示します。価格データの場合、値が変更されるたびに応答が返されます。ティックデータは単にそれらの価格の履歴ではありませんか? バー データの場合、期間 (つまり、10 分、1 時間) でグループ化することによって、一部の詳細が削除された価格の履歴ではありませんか。では、どちらかを購読できるとしたら、ブルームバーグからのそれぞれの新しい応答をいつ受信する必要がありますか? 基本的に、グループ化を行う独自のリスナーを作成し、リスナーからの応答を自分で選択した頻度で送信できます。

ところで: CLR を使用して、Python から .net blp オブジェクトと通信します。私のソリューションは、Bloomberg for Python のサポートよりも前にあり、本質的に「できない」ことを行っています。

于 2013-11-23T18:14:13.133 に答える