本文是《以AI量化为生》系列的第十六篇,我们将实现两个实用的图表交互功能:X轴向右延伸和双击专注模式。从突破vnpy基类限制到状态管理设计,从API调用踩坑到需求把握的权衡,让你掌握图表交互优化的核心思路。

X轴向右延伸

写在前面

上一篇讲了双图和四图视图的开发,有读者私信说,多周期图表确实方便了,但还是有个问题:K线图右边总是紧贴着最新价格,想在右边标注点什么都没空间。

这个问题说实话我也遇到过。做复盘的时候,经常想在最新K线右边画几根预测线,或者标注一下关键价位,但图表右边界总是死死卡在最后一根K线上。

还有个事,就是副图太多的问题。系统里现在有MACD、RSI、DMI、成交量好几个指标,全开的话每个都挤成一条缝,想仔细看某个指标得拼命拉窗口。第三方软件像文华财经、博易大师都有双击隐藏副图的功能,用起来确实方便。

这一篇就来解决这两个问题。

X轴向右延伸

实际使用场景

做量化的时候,经常遇到这样的情况:

你看到一个三角形整理形态,想延长上下边线看看突破位大概在哪。或者发现某个价格区间反复震荡,想标注一下关键的支撑阻力位。但图表右边界紧贴最新K线,鼠标一移过去就自动滚动,根本没法标注。

还有做回测的时候,想在未来位置标记预期的止盈止损点,也需要右边有空间。

问题分析

其实之前代码里已经有 ExtendableViewBox 这个类,理论上拖拽就能延伸X轴。但测试的时候发现,拖完松手图表立刻回弹,就像被橡皮筋拉住一样。

问题出在vnpy的 ChartWidget 基类。基类里写死了X轴不能超出数据范围的限制。中间层虽然有拖拽逻辑,但调用的是基类方法,功能还是被限制住了。

突破限制

解决办法就是在 EnhancedChartWidget 里重写几个关键方法,突破这个限制:

def _update_plot_limits(self) -> None:
    """允许x轴扩展到数据范围之外"""
    view = plot.getViewBox()
    if view:
        view.setLimits(
            xMax=self._manager.get_count() + 100  # 向右延伸100个单位
        )

这里把 xMax 设置为数据数量加100,允许X轴向右延伸100个K线的宽度。改完之后,鼠标在最右边往右拖,空白区域就出来了。按键盘右箭头也能延伸。

双击专注模式

副图太多的困扰

副图太多真的很影响观察。比如你想仔细看MACD的零轴穿越,但窗口里还挤着RSI、DMI、成交量,每个都只有一条缝那么高。

第三方软件像文华财经、博易大师都有双击隐藏副图的功能,用起来特别顺手。双击主图,副图全收起来,K线占满整个屏幕。双击某个副图,其他副图都隐藏,只留这一个。

我们也实现了这个功能。

功能效果

场景1:双击主图,专注K线

双击主图全屏

双击主图后,所有副图都隐藏,K线图占满整个窗口。再次双击恢复。

场景2:双击副图,专注指标

双击副图专注

双击成交量副图,其他副图都隐藏,只留主图和成交量。想看RSI就双击RSI,自动切换过去。

做复盘的时候这个功能特别实用。你可以先双击主图看K线形态,再双击MACD看动能变化,最后双击成交量看量能配合。整个流程很顺畅。

实现思路

这个功能的核心是状态管理。需要记住当前处于什么模式,以及进入专注模式之前哪些副图是显示的。

self.focus_mode = None  # None/main/plot_name
self.saved_plot_visibility = {}  # 保存副图可见性状态

双击主图的逻辑:

def _toggle_main_focus(self):
    if self.focus_mode == "main":
        self._restore_plot_visibility()  # 恢复所有副图
        self.focus_mode = None
    else:
        self._save_plot_visibility()     # 保存状态
        self._hide_all_sub_plots()       # 隐藏所有副图
        self.focus_mode = "main"

双击副图的逻辑类似,只是隐藏的时候保留当前副图。做这个功能的时候还迭代了一版,一开始觉得应该把专注的副图高度放大。加了放大逻辑后发现,副图一放大整个布局跳动太明显,反而不太好用。最后还是只做显示隐藏,保持简洁。

写在最后

到这里,图表交互优化的两个核心功能就讲完了。X轴延伸解决了标注和预测的空间问题,专注模式让观察变得更聚焦。

这两个功能说起来不复杂,但确实能明显提升使用体验。特别是做复盘分析的时候,能在右边延伸出空间画点东西,或者双击快速切换观察重点,整个流程就顺畅多了。

先写到这,有问题欢迎留言交流。


本文是《以AI量化为生》系列文章的第16篇,完整代码已开源至GitHub:https://github.com/seasonstar/atmquant

本文内容仅供学习交流,不构成任何投资建议。交易有风险,投资需谨慎。


加入「量策堂·AI算法指标策略」

想系统性掌握策略研发、指标可视化与回测优化?加入我的知识星球,获得持续、体系化的成长支持:


往期文章回顾

《量化指标解码》系列

《以AI量化为生》系列


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐