前面写了 vnpy抽离candle_chart_永远的麦田的博客-CSDN博客
基本完成了脱离vnpy形成K线图,存在几个问题:
1、使用的vnpy的数据结构,这一点没啥不好,主要是灵活度太低
2、只有K线和成交量,弄这个主要想将算法图呈现出来,类型缺少
3、增加一个plot做成三格而不是两格时发现其中无法做成,细查是由于数据结构是dict引发,把item与plot互相完全绑死。
4、指标如何叠加,这一点看起来没有实现,看到有个人写了相应方法,贴了图一堆人要但没有对应的代码
由于目标就是算法图形化,因此上面的问题解决了和我要的东西就基本接近了:
1.一组数据显示一个图形,如果增加了一组数据,直接增加对应的图形就好了
2.不同的数据根据其类型显示成不同的形状,K线,线型,柱状图
3.不同类型的图可以叠加,就像在不同图层上画图一样,可以一层一层叠罗汉
4.数据结构松散化,没有就不画,数据通过外层类型控制,相同的数据表示类型是K线,则画K线,如果表示类型是柱状,则生成柱状,如果是线型,则生成曲线
由于当前的数据结构绑死在一起,一轮大的改动不太现实,先实现一个极小的功能,线形
方法很简单klinechart.klinechart.chart.item.py中有实现的candle和volume的功能,仿照volume的实现即可,另外由于曲线的话肯定是从前一个画到后一个,所以这儿
_draw_bar_picture函数
原先是画的每一个item,现在得有所改变,每次画的时候需要知道前一个item,方法也很简单,直接增加一个参数
def _draw_bar_picture(self, ix: int, old_bar: BarData, bar: BarData) -> QtGui.QPicture:
所有用到这个函数的一起改了
然后在
_draw_item_picture
增加相应代码:
附上LineItem的实现代码:
class LineItem(ChartItem):
"""
线图
"""
def __init__(self, manager: BarManager):
""""""
super().__init__(manager)
def _draw_bar_picture(self, ix: int, old_bar: BarData, bar: BarData) -> QtGui.QPicture:
""""""
# Create objects
line_picture = QtGui.QPicture()
painter = QtGui.QPainter(line_picture)
line = QtCore.QLine(ix-1, old_bar.close_price, ix, bar.close_price)
painter.drawLine(line)
# Finish
painter.end()
return line_picture
def boundingRect(self) -> QtCore.QRectF:
""""""
min_price, max_price = self._manager.get_price_range()
rect = QtCore.QRectF(
0,
min_price,
len(self._bar_picutures),
max_price - min_price
)
return rect
def get_y_range(self, min_ix: int = None, max_ix: int = None) -> Tuple[float, float]:
"""
Get range of y-axis with given x-axis range.
If min_ix and max_ix not specified, then return range with whole data set.
"""
min_price, max_price = self._manager.get_price_range(min_ix, max_ix)
return min_price, max_price
def get_info_text(self, ix: int) -> str:
"""
Get information text to show by cursor.
"""
bar = self._manager.get_bar(ix)
if bar:
text = f"Volume {bar.volume}"
else:
text = ""
return text
然后贴出main中相应代码的修改:
最后展示效果图:
图很粗糙,不过意思图已经达到,至于加粗或是换色后面可以进一步细化
最后还是附上gitee上的工程:klinechart: 股票K线图表 - Gitee.com