def authorize(authService, identity, session, cid):
    tokenEventQueue = blpapi.EventQueue()
    session.generateToken(eventQueue=tokenEventQueue)

    # Process related response
    ev = tokenEventQueue.nextEvent()
    token = None
    if ev.eventType() == blpapi.Event.TOKEN_STATUS or \
            ev.eventType() == blpapi.Event.REQUEST_STATUS:
        for msg in ev:
            print(msg)
            if msg.messageType() == TOKEN_SUCCESS:
                token = msg.getElementAsString(TOKEN)
            elif msg.messageType() == TOKEN_FAILURE:
                break

    if not token:
        print("Failed to get token")
        return False

    # Create and fill the authorithation request
    authRequest = authService.createAuthorizationRequest()
    authRequest.set(TOKEN, token)

    # Send authorithation request to "fill" the Identity
    session.sendAuthorizationRequest(authRequest, identity, cid)

    # Process related responses
    startTime = datetime.datetime.today()
    WAIT_TIME_SECONDS = 10
    while True:
        event = session.nextEvent(WAIT_TIME_SECONDS * 1000)
        if event.eventType() == blpapi.Event.RESPONSE or \
            event.eventType() == blpapi.Event.REQUEST_STATUS or \
                event.eventType() == blpapi.Event.PARTIAL_RESPONSE:
            for msg in event:
                print(msg)
                if msg.messageType() == AUTHORIZATION_SUCCESS:
                    return True
                print("Authorization failed")
                return False

        endTime = datetime.datetime.today()
        if endTime - startTime > datetime.timedelta(seconds=WAIT_TIME_SECONDS):
            return False
Beispiel #2
0
def authorize(authService, identity, session, cid):
    with g_mutex:
        g_authorizationStatus[cid] = AuthorizationStatus.WAITING

    tokenEventQueue = blpapi.EventQueue()

    # Generate token
    session.generateToken(eventQueue=tokenEventQueue)

    # Process related response
    ev = tokenEventQueue.nextEvent()
    token = None
    if ev.eventType() == blpapi.Event.TOKEN_STATUS or \
            ev.eventType() == blpapi.Event.REQUEST_STATUS:
        for msg in ev:
            print msg
            if msg.messageType() == TOKEN_SUCCESS:
                token = msg.getElementAsString(TOKEN)
            elif msg.messageType() == TOKEN_FAILURE:
                break
    if not token:
        print "Failed to get token"
        return False

    # Create and fill the authorithation request
    authRequest = authService.createAuthorizationRequest()
    authRequest.set(TOKEN, token)

    # Send authorithation request to "fill" the Identity
    session.sendAuthorizationRequest(authRequest, identity, cid)

    # Process related responses
    startTime = datetime.datetime.today()
    WAIT_TIME_SECONDS = datetime.timedelta(seconds=10)
    while True:
        with g_mutex:
            if AuthorizationStatus.WAITING != g_authorizationStatus[cid]:
                return AuthorizationStatus.AUTHORIZED == \
                    g_authorizationStatus[cid]

        endTime = datetime.datetime.today()
        if endTime - startTime > WAIT_TIME_SECONDS:
            return False

        time.sleep(1)
    def generate(self, event_queue=None):
        """Generate a token."""

        token = None
        if event_queue is None:
            event_queue = blpapi.EventQueue()

        self._session.generateToken(blpapi.CorrelationId(), event_queue)

        event = event_queue.nextEvent()
        if event.eventType() == blpapi.Event.REQUEST_STATUS or \
                event.eventType() == blpapi.Event.TOKEN_STATUS:
            for msg in event:
                if msg.messageType() == TOKEN_SUCCESS:
                    token = msg.getElementAsString(TOKEN)
                    return token
                if msg.messageType() == TOKEN_FAILURE:
                    return None
        return None
Beispiel #4
0
    def _authorize(self, auth_service, identity, cid, event_queue=None):
        """Authorize the identity."""

        token = self._token_generator.generate()

        if token is None:
            print("Failed to get token")
            return False

        # Create and fill the authorization request
        auth_request = auth_service.createAuthorizationRequest()
        auth_request.set(TOKEN, token)

        if event_queue is None:
            event_queue = blpapi.EventQueue()

        # Send authorization request to "fill" the Identity
        self._session.sendAuthorizationRequest(auth_request, identity, cid,
                                               event_queue)

        # Process related responses
        start_time = datetime.datetime.today()
        WAIT_TIME_SECONDS = 10
        while True:
            event = event_queue.nextEvent(WAIT_TIME_SECONDS * 1000)
            if event.eventType() == blpapi.Event.RESPONSE or \
                    event.eventType() == blpapi.Event.REQUEST_STATUS or \
                    event.eventType() == blpapi.Event.PARTIAL_RESPONSE:
                for msg in event:
                    print(msg)
                    if msg.messageType() == AUTHORIZATION_SUCCESS:
                        return True
                    print("Authorization failed")
                    return False

            end_time = datetime.datetime.today()
            max_time_diff = datetime.timedelta(seconds=WAIT_TIME_SECONDS)
            if end_time - start_time > max_time_diff:
                return False
def main():
    global options
    options = parseCmdLine()

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

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

    myEventHandler = MyEventHandler()
    # Create a Session
    session = blpapi.Session(sessionOptions, myEventHandler.processEvent)

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

    if not session.openService("//blp/mktdata"):
        print "Failed to open //blp/mktdata"
        return

    if not session.openService("//blp/refdata"):
        print "Failed to open //blp/refdata"
        return

    print "Subscribing to IBM US Equity"
    cid = blpapi.CorrelationId(1)
    subscriptions = blpapi.SubscriptionList()
    subscriptions.add("IBM US Equity", "LAST_PRICE", "", cid)
    session.subscribe(subscriptions)

    print "Requesting reference data IBM US Equity"
    refDataService = session.getService("//blp/refdata")
    request = refDataService.createRequest("ReferenceDataRequest")
    request.append("securities", "IBM US Equity")
    request.append("fields", "DS002")

    cid2 = blpapi.CorrelationId(2)
    eventQueue = blpapi.EventQueue()
    session.sendRequest(request, correlationId=cid2, eventQueue=eventQueue)

    try:
        # Process received events
        while (True):
            # We provide timeout to give the chance to Ctrl+C handling:
            ev = eventQueue.nextEvent(500)
            for msg in ev:
                print msg
            # Response completly received, so we could exit
            if ev.eventType() == blpapi.Event.RESPONSE:
                break

        # Wait for enter key to exit application
        print "Press ENTER to quit"
        raw_input()
    finally:
        # Stop the session
        session.stop()
Beispiel #6
0
    def load_time_series(self, md_request):

        # if(BBGLowLevelTemplate._session is None):
        logger = LoggerManager().getLogger(__name__)

        session = self.start_bloomberg_session()

        # else:
        #    session = BBGLowLevelTemplate._session

        def download_data_frame(sess, eventQ, opt, ci):
            if opt.security is not None:
                self.send_bar_request(sess, eventQ, opt, ci)

                logger.info("Waiting for data to be returned...")

                return self.event_loop(sess)
            else:
                logger.warn("No ticker or field specified!")

                return None

        try:
            # if can't open the session, kill existing one
            # then try reopen (up to 5 times...)
            i = 0

            while i < 5:
                if session is not None:
                    if not session.openService("//blp/refdata"):
                        logger.info("Try reopening Bloomberg session... try " +
                                    str(i))
                        self.kill_session(
                            session)  # need to forcibly kill_session since
                        # can't always reopen
                        session = self.start_bloomberg_session()

                        if session is not None:
                            if session.openService("//blp/refdata"): i = 6
                else:
                    logger.info("Try opening Bloomberg session... try " +
                                str(i))
                    session = self.start_bloomberg_session()

                i = i + 1

            # Give error if still doesn't work after several tries..
            if not session.openService("//blp/refdata"):
                logger.error("Failed to open //blp/refdata")

                return

            logger.info("Creating request...")

            eventQueue = blpapi.EventQueue()
            # eventQueue = None

            # Create a request
            from blpapi import CorrelationId

            options = self.fill_options(md_request)

            # In some instances we might split the options if need to have
            # different overrides
            if isinstance(options, list):
                data_frame_list = []

                for op in options:
                    cid = CorrelationId()
                    data_frame_list.append(
                        download_data_frame(session, eventQueue, op, cid))

                data_frame = Calculations().join(data_frame_list)
            else:
                cid = CorrelationId()
                data_frame = download_data_frame(session, eventQueue, options,
                                                 cid)
        finally:
            # stop the session (will fail if NoneType)
            try:
                session.stop()
            except:
                pass

        return data_frame
Beispiel #7
0
    def load_time_series(self, market_data_request):

        # if(BBGLowLevelTemplate._session is None):
        logger = LoggerManager().getLogger(__name__)

        session = self.start_bloomberg_session()
        # else:
        #    session = BBGLowLevelTemplate._session

        try:
            # if can't open the session, kill existing one
            # then try reopen (up to 5 times...)
            i = 0

            while i < 5:
                if session is not None:
                    if not session.openService("//blp/refdata"):
                        logger.info("Try reopening Bloomberg session... try " +
                                    str(i))
                        self.kill_session(
                            session
                        )  # need to forcibly kill_session since can't always reopen
                        session = self.start_bloomberg_session()

                        if session is not None:
                            if session.openService("//blp/refdata"): i = 6
                else:
                    logger.info("Try opening Bloomberg session... try " +
                                str(i))
                    session = self.start_bloomberg_session()

                i = i + 1

            # give error if still doesn't work after several tries..
            if not session.openService("//blp/refdata"):
                logger.error("Failed to open //blp/refdata")

                return

            logger.info("Creating request...")

            eventQueue = blpapi.EventQueue()
            # eventQueue = None

            # create a request
            from blpapi import CorrelationId
            cid = CorrelationId()
            options = self.fill_options(market_data_request)

            if options.security is not None:
                self.send_bar_request(session, eventQueue, options, cid)

                logger.info("Waiting for data to be returned...")

                data_frame = self.event_loop(session)
            else:
                logger.warn("No ticker or field specified!")

                data_frame = None
        finally:
            # stop the session (will fail if NoneType)
            try:
                session.stop()
            except:
                pass

        return data_frame
def clientRun(session, options):
    print "Client is starting------"

    if not session.start():
        print "Failed to start client session."
        return

    identity = session.createIdentity()

    if options.auth:
        isAuthorized = False
        authServiceName = "//blp/apiauth"
        if session.openService(authServiceName):
            authService = session.getService(authServiceName)
            isAuthorized = authorize(
                authService, identity, session,
                blpapi.CorrelationId("cauth"))
        if not isAuthorized:
            print "No authorization"
            return

    if not session.openService(options.service):
        print "Failed to open", options.service
        return

    service = session.getService(options.service)
    request = service.createRequest("ReferenceDataRequest")

    # append securities to request
    # Add securities to request
    securities = request.getElement("securities")
    for security in options.securities:
        securities.appendValue(security)

    # Add fields to request
    fields = request.getElement("fields")
    for field in options.fields:
        fields.appendValue(field)

    request.set("timestamp", time.time())

    print "Sendind Request:", request

    eventQueue = blpapi.EventQueue()
    session.sendRequest(request, identity, blpapi.CorrelationId("AddRequest"),
                        eventQueue)

    while True:
        # Specify timeout to give a chance for Ctrl-C
        event = eventQueue.nextEvent(500)

        if event.eventType() == blpapi.Event.TIMEOUT:
            continue

        print "Client received an event"
        for msg in event:
            with g_mutex:
                if event.eventType() == blpapi.Event.RESPONSE:
                    if msg.hasElement("timestamp"):
                        responseTime = msg.getElementAsFloat("timestamp")
                        print "Response latency =", time.time() - responseTime
                print msg

        if event.eventType() == blpapi.Event.RESPONSE:
            break
Beispiel #9
0
def get_calc_ref_data(identifier, identifier_value, fields_map, df):
    data = df.copy()
    for rid, row in df.iterrows():

        date = pd.to_datetime(rid)
        settlement_date = list(rrule(DAILY, count=3, byweekday=(MO, TU, WE, TH, FR), dtstart=date))[2]
        refdate = date.strftime("%Y%m%d")
        settlment_dt = settlement_date.strftime("%Y%m%d")
        for key, field in fields_map.items():
            sessionOptions = blpapi.SessionOptions()
            sessionOptions.setServerAddress('localhost', 8194, 0)
            sessionOptions.setNumStartAttempts(1)
            sessionOptions.setAutoRestartOnDisconnection(True)
            session = blpapi.Session(sessionOptions)
            if not session.start():
                print("Failed to start session.")
                return 0
            session.openService("//blp/refdata")
            service = session.getService("//blp/refdata")
            sec = "/%s/%s" % (identifier, identifier_value)
            request = service.createRequest("ReferenceDataRequest")
            request.append("securities", sec)
            all_fields = []
            request.append("fields", field)
            identity = session.createIdentity()
            if field == 'INT_ACC':
                override_elements = [
                    ["USER_LOCAL_TRADE_DATE", refdate]
                ]
            elif key == "ASW$":
                override_elements = [
                    ["SETTLE_DT", settlment_dt],
                    ["OAS_CURVE_DT", refdate],
                    ["ASW_SWAP_CURRENCY", "USD"],
                    ["ASW_SWAP_PAY_RESET_FREQ", "SA"],
                    ["YAS_BOND_PX", row.PX_LAST]
                ]
            elif key == "ASW FX":
                override_elements = [
                    ["SETTLE_DT", settlment_dt],
                    ["OAS_CURVE_DT", refdate],
                    ["YAS_BOND_PX", row.PX_LAST],
                    ["ASW_SWAP_PAY_RESET_FREQ", 4]
                ]
            elif field == "DUR_MID":
                override_elements = [
                    ["PX_BID", row.PX_BID],
                    ["PX_ASK", row.PX_ASK],
                    ["YAS_BOND_PX", row.PX_LAST],
                    ["YLD_YTM_ASK", row.YLD_YTM_ASK],
                    ["YLD_YTM_BID", row.YLD_YTM_BID],
                    ["USER_LOCAL_TRADE_DATE", refdate],
                    ["SETTLE_DT", settlement_date]
                ]
            else:
                override_elements = []
            overrides = request.getElement("overrides")
            for elem in override_elements:
                override = overrides.appendElement()
                override.setElement("fieldId", elem[0])
                override.setElement("value", elem[1])

            eventQueue = blpapi.EventQueue()
            session.sendRequest(request, identity, blpapi.CorrelationId("AddRequest"),
                                eventQueue)
            while True:
                # Specify timeout to give a chance for Ctrl-C
                event = eventQueue.nextEvent(500)

                if event.eventType() == blpapi.Event.TIMEOUT:
                    continue

                for msg in event:
                    securityData = msg.getElement(SECURITY_DATA)
                    securityDataList = [securityData.getValueAsElement(i) for i in range(securityData.numValues())]

                    for sec in securityDataList:
                        fieldData = sec.getElement(FIELD_DATA)
                        fieldDataList = [fieldData.getElement(i) for i in range(fieldData.numElements())]

                        if len(fieldDataList):
                            for fld in fieldDataList:
                                col = "ASW$" if key == "ASW$" else str(fld.name())
                                data.loc[date, col] = fld.getValue()
                        else:
                            col = "ASW$" if key == "ASW$" else field
                            data.loc[date, col] = np.nan
                if event.eventType() == blpapi.Event.RESPONSE:
                    break
            session.stop()
    if len(data):
        return (data)
    else:
        print("No Data found")
Beispiel #10
0
def get_historical_ref_data(identifier, identifier_value, fields_map, startDate, endDate):
    """

    @string identifier: 'isin', 'cusip', etc.
    @string identifier_value: value corresponding to identifier
    @map fields_map:
    @string startDate: YYYYMMDD
    @string endDate: YYYYMMDD
    @return: pandas.DataFrame()

    Getting histoical data for given identifier and for multiple fields in dataframe
    """
    sessionOptions = blpapi.SessionOptions()
    sessionOptions.setServerAddress('localhost', 8194, 0)
    sessionOptions.setNumStartAttempts(1)
    sessionOptions.setAutoRestartOnDisconnection(True)
    session = blpapi.Session(sessionOptions)
    if not session.start():
        print("Failed to start session.")
        return 0
    identity = session.createIdentity()
    if not session.openService("//blp/refdata"):
        print("Failed to open service")
        return 0
    service = session.getService("//blp/refdata")
    request = service.createRequest("HistoricalDataRequest")
    sec = "/%s/%s" % (identifier, identifier_value)
    request.append("securities", sec)
    all_fields = []
    for fields in fields_map.values():
        if type(fields) == str:
            request.append("fields", fields)
            all_fields.append(fields)
        else:
            for field in fields:
                request.append("fields", field)
                all_fields.append(field)
    request.set("periodicitySelection", "DAILY")
    request.set("startDate", startDate)
    request.set("endDate", endDate)
    eventQueue = blpapi.EventQueue()
    session.sendRequest(request, identity, blpapi.CorrelationId("AddRequest"),
                        eventQueue)
    outDF = pd.DataFrame()
    while True:
        # Specify timeout to give a chance for Ctrl-C
        event = eventQueue.nextEvent(500)

        if event.eventType() == blpapi.Event.TIMEOUT:
            continue

        for msg in event:
            output = blpapi.event.MessageIterator(event).next().getElement(SECURITY_DATA)
            security = output.getElement(SECURITY).getValueAsString()
            fieldDataArray = output.getElement(FIELD_DATA)
            fieldDataList = [fieldDataArray.getValueAsElement(i) for i in range(0, fieldDataArray.numValues())]
            dates = map(lambda x: x.getElement(DATE).getValueAsString(), fieldDataList)
            outDF = pd.DataFrame(index=dates, columns=all_fields)
            outDF.index = pd.to_datetime(outDF.index)

            for field in all_fields:
                data = []
                for row in fieldDataList:
                    if row.hasElement(field):
                        data.append(row.getElement(field).getValueAsFloat())
                    else:
                        data.append(pd.np.nan)

                outDF[field] = data

        if event.eventType() == blpapi.Event.RESPONSE:
            break
    session.stop()
    if len(outDF):
        return outDF
    else:
        print("No Data found")
Beispiel #11
0
def get_rating_ref_data(identifier, identifier_value, fields_map, dates):
    sessionOptions = blpapi.SessionOptions()
    sessionOptions.setServerAddress('localhost', 8194, 0)
    sessionOptions.setNumStartAttempts(1)
    sessionOptions.setAutoRestartOnDisconnection(True)
    session = blpapi.Session(sessionOptions)
    if not session.start():
        print("Failed to start session.")
        return 0
    session.openService("//blp/refdata")
    data = pd.DataFrame()

    for date in dates:
        refdate = pd.to_datetime(date).strftime("%Y%m%d")
        service = session.getService("//blp/refdata")
        request = service.createRequest("ReferenceDataRequest")
        sec = "/%s/%s" % (identifier, identifier_value)
        request.append("securities", sec)
        all_fields = []
        for fields in fields_map.values():
            if type(fields) == str:
                request.append("fields", fields)
                all_fields.append(fields)
            else:
                for field in fields:
                    request.append("fields", field)
                    all_fields.append(field)
        identity = session.createIdentity()
        override_elements = [
            ["RATING_AS_OF_DATE_OVERRIDE", refdate]
        ]
        overrides = request.getElement("overrides")
        for elem in override_elements:
            override = overrides.appendElement()
            override.setElement("fieldId", elem[0])
            override.setElement("value", elem[1])

        eventQueue = blpapi.EventQueue()
        session.sendRequest(request, identity, blpapi.CorrelationId("AddRequest"),
                            eventQueue)
        while True:
            # Specify timeout to give a chance for Ctrl-C
            event = eventQueue.nextEvent(500)

            if event.eventType() == blpapi.Event.TIMEOUT:
                continue

            for msg in event:
                securityData = msg.getElement(SECURITY_DATA)
                securityDataList = [securityData.getValueAsElement(i) for i in range(securityData.numValues())]

                for sec in securityDataList:
                    fieldData = sec.getElement(FIELD_DATA)
                    fieldDataList = [fieldData.getElement(i) for i in range(fieldData.numElements())]

                    for fld in fieldDataList:
                        data.loc[date, str(fld.name())] = fld.getValue()
            if event.eventType() == blpapi.Event.RESPONSE:
                break
    session.stop()
    if len(data):
        return (data)
    else:
        print("No Data found")