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

2022-04-27 11:07:54 +08:00
 hdjdjrjjfjdnee
最早是用 pyqtgraph 画 k 线的,这个库性能可以, 但是我感觉线条丑, 改用 qtchart 画图
发现 v2 不能上图, 那就算了
汇总下这几天的问题:
1 、k 线数据量有点大 2w 多根, 图形压缩严重 [后期用放大缩小处理]
2 、横坐标只能全部显示,这样每次放大缩小很卡, 只显示 30 个坐标点
3 、画十字线显示价格及买卖信息
2870 次点击
所在节点    Python
9 条回复
jones2000
2022-04-27 11:29:20 +08:00
绘图直接用 h5 绘制,更方便。py 用来做后台的指标的计算什么的比较方便。 另外通用的图形插件不适合做 K 线图。
ericgui
2022-04-28 00:05:26 +08:00
是实时数据,还是下载好了的数据?
hdjdjrjjfjdnee
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
2022-04-29 15:19:23 +08:00
@jones2000 ,h5 不会, 但是感觉 h5 功能控件比较多,但是感觉应该没有 qt 功能强大, 而且我写的是风控模块的部分,后续好扩展
hdjdjrjjfjdnee
2022-04-29 15:20:10 +08:00
@ericgui 目前是历史数据, 后续会绑定实盘的实时数据 [估计有点难, 不行就跑路]
hdjdjrjjfjdnee
2022-04-29 15:23:16 +08:00
开平买卖 5000 次, 要写个 5000 个连线, 目前想要不写 5000 个 series_, 不知道卡不卡, 有点不敢试。。。。
正在查 qtchart 有没有 分段的折线 函数
hdjdjrjjfjdnee
2022-04-29 16:00:45 +08:00
我刚试了 画 5000 个 series_, 也还好。。。。不算卡, 买卖信号连线解决了,
下周的问题是: 横坐标目前是 30 个数值, 要改成日期时间
jones2000
2022-04-30 00:23:19 +08:00
@hdjdjrjjfjdnee 开 GPU 加速, 双缓存, 十字光标使用异或绘制十字线,十字光标移动指标栏信息使用区域重绘,不要整个页面都刷,这样4-5 W 的数据都不卡。
yellowtail
2022-05-14 23:08:10 +08:00
推荐 finplot 库,网上很多 pyqt 花 k 线的例子,可以搜一下景色的 ctp 案例

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/849515

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX