DLW
DLW

Reputation: 191

Using blp.live with Pyxll Asyncio RTD in python

I am new to Pyxll and Asyncio and having trouble get the following code going. I kept getting the initial value = 0 on the spreadsheet and it's not refreshing. Could you help and let me know what I did wrong? I followed the example from Pyxll's tutorial here: https://www.pyxll.com/docs/userguide/rtd.html#using-the-asyncio-event-loop

from pyxll import RTD, xl_func, xl_app
from xbbg import blp
import asyncio

class AsyncRTDExample(RTD):

    def __init__(self, ticker):
        super().__init__(value=0)
        self.__stopped = False
        self.__ticker = ticker

    async def connect(self):
        while not self.__stopped:
            # Yield to the event loop for 1s
            await asyncio.sleep(1)

            # Update value (which notifies Excel)
            async for t in blp.live(self.__ticker, flds = ['LAST_PRICE'], info=['LAST_PRICE']):
                self.value = t["LAST_PRICE"]

    async def disconnect(self):
        self.__stopped = True

@xl_func("string ticker: rtd<float>", recalc_on_open=True)
def async_rtd_price(ticker):
    return AsyncRTDExample(ticker)

Really appreciate it!

Upvotes: 0

Views: 586

Answers (1)

DLW
DLW

Reputation: 191

I figured out with xbbg blp.bdp function which does similar thing. This is a good substitute if you have a massive bbg function pulling RT price. PyXLL allows you to input an array of tickers which saves a lot of time. I hope this could save someone some time :)

from pyxll import RTD, xl_func, xl_app
import logging
import sys
from xbbg import blp
import asyncio

_log = logging.getLogger(__name__)

class AsyncPriceRTD(RTD):

    def __init__(self, ticker):
        self.__ticker = ticker
        super().__init__(value=blp.bdp(self.__ticker, flds=['Last_Price']))
        self.__stopped = False
        
    async def bdp(self):
        return (blp.bdp(self.__ticker, flds=['Last_Price']))

    async def connect(self):
        try:
            while not self.__stopped:
                await asyncio.sleep(0.5)
                self.value = await self.bdp()

        except:
            self.set_error(*sys.exc_info())

    async def disconnect(self):
        self.__stopped = True


@xl_func("string[] array: rtd<dataframe<index=False,columns=False>>", recalc_on_open=True)
def async_rtd_price(ticker):
    return AsyncPriceRTD(ticker)


@xl_func("int interval: var")
def rtd_set_interval(interval):
    """Set Excel's RTD throttle interval (in milliseconds).

    When real time data objects notify Excel that they have changed
    the displayed value in Excel doesn't actually update until
    Excel refreshes. How often Excel refreshes due to RTD updates
    defaults to every 2 seconds, and so to see data refresh more
    frequently this function may be used.
    """
    xl = xl_app()
    xl.RTD.ThrottleInterval = interval
    return "Refresh interval: {} seconds.".format(interval/1000)

Upvotes: 0

Related Questions