欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vnpy学习笔记1:Chart绘图功能相关

程序员文章站 2022-07-13 15:01:57
...

vnpy学习笔记:Chart绘图功能相关

Widget对象在鼠标移动时更新相关信息

Widget类的update_info方法在Cursor对象发生moved事件时被调用。第一天个for循环遍历_item_plot_map字典,这个字典是widget类的属性,为plot name和其对应的plot对象的映射。

get_info_text为具体plot对象的方法。比如CandleItem的get_info_text方法。入参为_x,即通过Cursor对象moved方法下得到的鼠标当前x坐标值。

def update_info(self) -> None:
        """"""
        buf = {}

        for item, plot in self._item_plot_map.items():
            item_info_text = item.get_info_text(self._x)

            if plot not in buf:
                buf[plot] = item_info_text
            else:
                if item_info_text:
                    buf[plot] += ("\n\n" + item_info_text)

        for plot_name, plot in self._plots.items():
            plot_info_text = buf[plot]
            info = self._infos[plot_name]
            info.setText(plot_info_text)
            info.show()

            view = self._views[plot_name]
            top_left = view.mapSceneToView(view.sceneBoundingRect().topLeft())
            info.setPos(top_left)

以k线对象CandleItem为例,找到该类的get_info_text方法:

    def get_info_text(self, ix: int) -> str:
        """
        Get information text to show by cursor.
        """
        bar = self._manager.get_bar(ix)

        if bar:
            words = [
                "Date",
                bar.datetime.strftime("%Y-%m-%d"),
                "",
                "Time",
                bar.datetime.strftime("%H:%M"),
                "",
                "Open",
                str(round(bar.open_price,2)),
                "",
                "High",
                str(round(bar.high_price,2)),
                "",
                "Low",
                str(round(bar.low_price,2)),
                "",
                "Close",
                str(round(bar.close_price,2))
            ]
            text = "\n".join(words)
        else:
            text = ""

        return text

入参为_x,_manager为widget类内部定义的BarManager对象,其下的get_bar方法的作用是通过水平坐标值获取该位置的BarData。所以CandleItem的get_info_text方法返回的是当前鼠标位置的k线的OHLC数值,此处我将OHLC数值取小数后两位。

下面代码为BarManager类的get_bar方法:

    def get_bar(self, ix: float) -> BarData:
        """
        Get bar data with index.
        """
        ix = to_int(ix)
        dt = self._index_datetime_map.get(ix, None)
        if not dt:
            return None

        return self._bars[dt]

其中_index_datetime_map为k线x轴坐标ix与对应k线的时间戳的映射字典。入参_x后,获得_x位置k线的时间戳dt,返回bars[dt],即该时间的BarData数据。

至此,整个代码逻辑为,鼠标移动 >> moved事件 >> widget对象调用update_info方法 >> 调用各个已加载的ChartItem内的get_info_text方法 >> 以CandleItem为例,通过传入鼠标位置_x获取_x位置时间,继而获得该时间的BarData >> 将鼠标位置的K线信息推送更新到屏幕左上角区域。结果如下图。

vnpy学习笔记1:Chart绘图功能相关

相关标签: 量化交易