0

我是 Pyxll 和 Asyncio 的新手,无法运行以下代码。我一直在电子表格上得到初始值 = 0 并且它没有刷新。你能帮忙让我知道我做错了什么吗?我在这里遵循了 Pyxll 教程中的示例: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)

真的很感激!

4

1 回答 1

0

我想出了用 xbbg blp.bdp 做类似事情的函数。如果您有一个巨大的 bbg 功能拉动 RT 价格,这是一个很好的替代品。PyXLL 允许您输入一系列代码,从而节省大量时间。我希望这可以节省一些时间:)

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)
于 2022-02-23T17:49:18.727 回答