V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hdjdjrjjfjdnee
V2EX  ›  Python

记录一下:用 pyqt5 画 K 线及信号

  •  
  •   hdjdjrjjfjdnee · 2022-04-27 11:07:54 +08:00 · 2909 次点击
    这是一个创建于 967 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最早是用 pyqtgraph 画 k 线的,这个库性能可以, 但是我感觉线条丑, 改用 qtchart 画图
    发现 v2 不能上图, 那就算了
    汇总下这几天的问题:
    1 、k 线数据量有点大 2w 多根, 图形压缩严重 [后期用放大缩小处理]
    2 、横坐标只能全部显示,这样每次放大缩小很卡, 只显示 30 个坐标点
    3 、画十字线显示价格及买卖信息
    9 条回复    2022-05-14 23:08:10 +08:00
    jones2000
        1
    jones2000  
       2022-04-27 11:29:20 +08:00
    绘图直接用 h5 绘制,更方便。py 用来做后台的指标的计算什么的比较方便。 另外通用的图形插件不适合做 K 线图。
    ericgui
        2
    ericgui  
       2022-04-28 00:05:26 +08:00
    是实时数据,还是下载好了的数据?
    hdjdjrjjfjdnee
        3
    hdjdjrjjfjdnee  
    OP
       2022-04-29 15:14:58 +08:00
    昨天 v2 上不了,
    昨天解决的问题:
    数据量上 2w 多跟 K 线的时候超级卡:
    1 、series.append(QCandlestickSet(o, h, l, c, ind)) , 导入的 o, h, l, c, ind , 千万不要用 pandas 数据的.iloc 取值,2w 行数据:
    o = data.iloc[ind]['o'] 要了 4 秒,
    o = data['o'].iloc[ind] 要了 0.47 秒
    o = data[ind, 0] 用 numpy 取值只要了 0.0099 秒
    2 、第二个图形卡的原因是:
    2w 个数据 ,setGridLineVisible 必须设置 False , 不然图像卡死了
    chart.axisX().hide() 横坐标最好是隐藏或者设置具体个数在 30 个以内, 不然刷新图形卡死了

    自己定义鼠标滚轮事件 wheelEvent , 用来放大缩小图形, 做是做好了, 但是卡死了:因为滚轮每次滚动一下就刷新一次, 但是我们用滚轮滑一下会触发非常多下, 导致 1 秒内会刷新 3 次以上的图形,
    1 、解决办法是:找到滚轮结束的时候状态去更新, 这个问题找了一个上午没找到, 放弃了
    2 、最后用 setRubberBand , 发现他会跟我现有的鼠标事件 mouseMoveEvent 、mousePressEvent 、mouseReleaseEvent 冲突了。。。。。

    昨天的问题:

    1 、图都画好了, 卡在了 setRubberBand (橡皮筋控件上),QChartView 这个类没有 RubberBandchange 响应函数,画图选取矩形后 k 线 Y 轴没有跟着曲线变化, 最后曲线扭曲了,于是想从 QGraphicsView 父类自己造个梯子。。。搞了我快一天了, 发现 QGraphicsView 无法叠加在 k 线,放弃了, 最后发现 QChartView 可以自己定义一个自己的 RubberBand , 然后重写鼠标事件就搞定了
    self.rb = QRubberBand(QRubberBand.Rectangle, self.chartview) # 橡皮筋控件
    2 、十字线及鼠标所在 k 线显示价格信号数据,用 QGraphicsLineItem 这个类定义 2 条直线

    现在的问题:
    卡在了买卖信号连线。。。已经找了一个上午了。。。。
    hdjdjrjjfjdnee
        4
    hdjdjrjjfjdnee  
    OP
       2022-04-29 15:19:23 +08:00
    @jones2000 ,h5 不会, 但是感觉 h5 功能控件比较多,但是感觉应该没有 qt 功能强大, 而且我写的是风控模块的部分,后续好扩展
    hdjdjrjjfjdnee
        5
    hdjdjrjjfjdnee  
    OP
       2022-04-29 15:20:10 +08:00
    @ericgui 目前是历史数据, 后续会绑定实盘的实时数据 [估计有点难, 不行就跑路]
    hdjdjrjjfjdnee
        6
    hdjdjrjjfjdnee  
    OP
       2022-04-29 15:23:16 +08:00
    开平买卖 5000 次, 要写个 5000 个连线, 目前想要不写 5000 个 series_, 不知道卡不卡, 有点不敢试。。。。
    正在查 qtchart 有没有 分段的折线 函数
    hdjdjrjjfjdnee
        7
    hdjdjrjjfjdnee  
    OP
       2022-04-29 16:00:45 +08:00
    我刚试了 画 5000 个 series_, 也还好。。。。不算卡, 买卖信号连线解决了,
    下周的问题是: 横坐标目前是 30 个数值, 要改成日期时间
    jones2000
        8
    jones2000  
       2022-04-30 00:23:19 +08:00
    @hdjdjrjjfjdnee 开 GPU 加速, 双缓存, 十字光标使用异或绘制十字线,十字光标移动指标栏信息使用区域重绘,不要整个页面都刷,这样4-5 W 的数据都不卡。
    yellowtail
        9
    yellowtail  
       2022-05-14 23:08:10 +08:00
    推荐 finplot 库,网上很多 pyqt 花 k 线的例子,可以搜一下景色的 ctp 案例
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:38 · PVG 13:38 · LAX 21:38 · JFK 00:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.