vnpy抽离candle_chart2 - 实现line

前面写了  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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值