本文是《以AI量化为生》系列的第17篇,记录ATMQuant系统的一次架构升级。

今天花了一天时间重构了指标系统,主要解决了目录结构混乱、扩展困难和macOS崩溃三个问题。一共做了6次提交,下面直接说改了什么。

1. 目录重构:分离图表和指标

以前core/charts/目录里既有图表容器(enhanced_chart_widget.py、dual_chart_widget.py),又有指标实现(boll_item.py、rsi_item.py),混在一起不好管理。

现在拆成两个目录:

core/
├── charts/          # 图表容器和UI组件
└── indicators/      # 技术指标实现

职责清晰了,找代码也快了。涉及15个文件的导入路径调整。

2. 条件导入:解决兼容性问题

新的core/indicators/__init__.py分两部分:

# 基础指标 - 直接导入
from .boll_item import BollItem
from .rsi_item import RsiItem
# ...

# 扩展指标 - try-except
try:
    from .enhanced_volume_item import EnhancedVolumeItem
    __all__.append("EnhancedVolumeItem")
except ImportError:
    pass

这样基础版用户不会因为缺少扩展指标文件而报错,高级版用户有文件就自动导入。

3. .gitignore:否定模式

用否定模式管理指标文件:

core/indicators/*                # 忽略所有
!core/indicators/__init__.py     # 保留基础文件
!core/indicators/boll_item.py
# ... 其他基础指标

以后新增的指标自动被忽略,不用手动维护列表。

4. 动态加载:配置字典管理

enhanced_chart_widget.py里用配置字典管理扩展指标:

EXTENDED_INDICATORS_CONFIG = {
    "fibonacci": {
        "module": "fibonacci_entry_bands_item",
        "class": "FibonacciEntryBandsItem",
        "type": "main",
        "default_visible": False,
    },
    "zlema": {...},
    "adaptive_macd": {...},
    # 共8个扩展指标
}

启动时自动尝试加载,文件存在就注册到图表,不存在就跳过。用户只需复制文件,不用改代码。

5. 成交量指标:智能降级

try:
    from core.indicators.enhanced_volume_item import EnhancedVolumeItem
    VolumeItem = EnhancedVolumeItem
except ImportError:
    from vnpy.chart import VolumeItem

优先用增强版(带买卖量分解),没有就降级到基础版。

6. 崩溃修复:移除emoji

macOS平台打开K线图会bus error,排查发现是Qt渲染emoji字符的问题。

批量替换:

  • ⚠️[ALERT]
  • [BUY]
  • [SELL]

涉及zlema_item.py、supertrend_item.py等指标文件,还有widget.py的注释。测试代码保留了emoji用于复现问题。

7. 其他调整

  • X轴显示优化:只有最后一个可见副图显示X轴
  • 主图高度:从300调整为250
  • 配置按钮:从"…“改为”[x]"

总结

这次重构的核心是:

  1. 目录结构更清晰
  2. 扩展机制更灵活
  3. 兼容性更好
  4. macOS不崩溃了

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

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


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

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


往期文章回顾

《以AI量化为生》系列

《量化指标解码》系列


Logo

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

更多推荐