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线信息推送更新到屏幕左上角区域。结果如下图。
下一篇: iOS集成融云即时通讯详细教程