以AI量化为生:20.实时图表交易系统开发


title: 以AI量化为生:20.实时图表交易系统开发 cover: ./以AI量化为生:20.实时图表交易系统开发-cover.png

本文是《以AI量化为生》系列的第20篇,我们将在实时K线图表的基础上集成完整的交易功能。从ChartWizard到ChartTrader的改造,从交易面板到风控监控,从多合约Tab管理到快捷键操作,实现"所见即所得"的图表化交易体验。

写在前面

上一篇讲了多周期K线系统的完善,图表可以实时更新了,指标也能正常显示了。有朋友留言问,这些图表看起来挺专业的,但怎么在上面下单交易呢?总不能看着图表,再切到别的软件下单吧。

这个问题确实很实际。做日内交易,看到机会要马上下单,在图表和交易界面之间切来切去,效率太低。而且官方的ChartWizard虽然能看实时K线,但没有下单功能,只能看不能交易。

所以这篇就来讲讲怎么把ChartWizard改造成ChartTrader,直接在图表上集成交易功能。内容包括订单管理、持仓跟踪、风控监控、价格预警,持仓线、委托线这些可视化提示。

多合约Tab管理

系统支持同时打开多个品种的图表,用Tab页签进行切换。这个设计跟浏览器的多标签页很像------每个标签就是一个合约的图表,可以在rb2605(螺纹钢)和sn2602(沪锡)之间快速切换。

新建图表流程

点击工具栏的"新建图表"按钮(快捷键Ctrl+N),会弹出对话框:

输入合约代码(例如rb2605.SHFE),点击确定后,系统会:

  1. 创建新的Tab页签,输入合约代码
  2. 加载图表组件(EnhancedChartWidget)
  3. 查询历史K线数据(默认最近10000条分钟K线)
  4. 订阅实时tick数据
  5. 创建对应的交易面板和风控面板
  6. 延迟2秒后自动同步持仓数据

这样新标签就创建好了,可以开始交易了。Tab页签上会显示合约代码,点击就能切换到对应的图表。

三层架构设计

交易系统的复杂度较高,涉及订单管理、持仓跟踪、风控监控等多个模块。为了保证系统的可维护性和扩展性,采用了清晰的三层架构设计:

UI层负责界面展示和用户交互。包括TradingPanel(交易面板)、RiskControlPanel(风控面板)等组件。用户操作通过Qt信号传递给业务逻辑层,保持界面代码的简洁性。

业务逻辑层是系统的核心,包含四个核心管理器:

  • TradingManager:处理交易订单的创建、发送和状态跟踪
  • PositionManager:管理持仓数据并在图表上进行可视化
  • RiskMonitor:监控止损止盈条件和价格预警
  • AIAnalysisCoordinator:协调AI分析功能(下篇文章详细介绍)

vnpy框架层提供底层支持。MainEngine负责与CTP等交易网关通信,EventEngine负责事件分发。系统通过vnpy提供的标准API进行交互,不直接修改框架代码。

交易功能

交易面板设计

交易面板集成在图表顶部,提供完整的交易操作功能。界面采用紧凑的横向布局,包含以下核心元素:

交易类型切换:支持市价单和限价单两种模式。市价单直接使用当前tick价格快速成交,限价单可以指定价格挂单等待。

交易操作

  • 买开:买入开仓,建立多头持仓
  • 卖开:卖出开仓,建立空头持仓
  • 平多:卖出平仓,平掉多头持仓
  • 平空:买入平仓,平掉空头持仓
  • 全平:一键平掉所有持仓(多头和空头)
  • 撤单:撤销该合约的所有活动委托

交易面板通过颜色区分不同操作:买开使用金黄色,卖开使用深粉色,平仓使用红色,方便快速识别,降低误操作风险。

交易操作指引

买入开仓流程

  1. 选择交易类型:点击"市价"或"限价"单选按钮

    • 市价单:系统自动使用当前最新价格,快速成交
    • 限价单:可在价格输入框中指定挂单价格
  2. 设置交易数量:点击数量下拉框,选择开仓手数(默认1手)

  3. 点击买开按钮:点击金黄色的"买开"按钮发送订单

  4. 确认订单状态

    • 委托成功后,图表上会显示淡蓝色的买入委托线
    • 成交后,委托线消失,显示金黄色的持仓线

卖出开仓流程

操作步骤与买入开仓类似,只需点击深粉色的"卖开"按钮。成交后图表上会显示金黄色的空头持仓线。

平仓操作

系统提供了平多和平空两个独立按钮,避免误操作:

  1. 平多:点击红色的"平多"按钮,发送卖出平仓单,平掉多头持仓,可设置交易手数
  2. 平空:点击红色的"平空"按钮,发送买入平仓单,平掉空头持仓,可设置交易手数
  3. 一键全平:点击红色"全平"按钮,自动平掉该合约的所有持仓(多头和空头)

撤单操作

点击"撤单"按钮,系统会撤销该合约的所有未成交委托。委托撤销后,图表上的委托线会自动消失。

TradingManager核心逻辑

TradingManager负责处理所有交易相关的业务逻辑:

python 复制代码
def buy(self, vt_symbol: str, price: float, volume: int,
        order_type: OrderType) -> Optional[str]:
    """买入开仓"""
    # 获取合约信息
    contract = self.main_engine.get_contract(vt_symbol)

    # 创建订单请求
    req = OrderRequest(
        symbol=contract.symbol,
        exchange=contract.exchange,
        direction=Direction.LONG,
        type=order_type,
        volume=volume,
        price=price,
        offset=Offset.OPEN
    )

    # 发送订单并返回订单ID
    vt_orderid = self.main_engine.send_order(req, contract.gateway_name)
    return vt_orderid

TradingManager监听EVENT_ORDER和EVENT_TRADE事件,实时更新订单状态和持仓数据,并通过Qt信号通知UI层更新显示。

持仓管理与可视化

PositionManager负责持仓的跟踪和图表可视化。传统的持仓列表以数字形式展示,不够直观。系统通过在图表上绘制可视化线条,让持仓信息一目了然。

持仓线显示:使用黄色虚线标识持仓价格和方向

  • 多头持仓:标签显示"多头持仓 @ 价格"
  • 空头持仓:标签显示"空头持仓 @ 价格"
  • 持仓手数会在面板上实时更新

委托单线显示

  • 买入委托:淡蓝色点线
  • 卖出委托:淡粉色点线

委托单成交或撤销后,对应的线条会自动从图表上移除。这样可以清晰地看到当前价格与持仓价格的距离,以及挂单的分布情况。

持仓同步功能

系统提供从CTP网关自动同步持仓的功能。图表创建时,延迟2秒后自动查询持仓数据:

python 复制代码
QtCore.QTimer.singleShot(2000,
    lambda: self.position_manager.sync_position_from_gateway(vt_symbol))

同时提供快捷键Ctrl+P手动触发同步,确保持仓数据的准确性。PositionManager会查询所有持仓,计算净持仓(多头-空头),并在图表上绘制持仓线。

持仓同步操作指引

自动同步

图表创建后,系统会自动延迟2秒查询持仓。如果你在程序启动前已经有持仓,稍等片刻就能在图表上看到金黄色的持仓线。

手动同步

  1. 按下快捷键:按Ctrl+P触发手动同步
  2. 查看日志输出:控制台会显示"正在从网关同步持仓..."
  3. 确认持仓线:同步成功后,图表上会显示持仓线和

风控功能

风控面板设计

风控是实盘交易的核心保障。系统提供了完整的风控面板,集成止损、止盈和价格预警功能:

风控面板与图表无缝结合,设置风控规则的同时,在图表上显示对应的可视化线条:

  • 止损线:亮绿色虚线
  • 止盈线:红色虚线
  • 预警线:橙色虚线

止损止盈机制

RiskMonitor负责风控规则的监控和执行。系统注册EVENT_TICK事件,每个tick到达时检查是否触发风控条件:

  • 多头止损:当价格跌破止损价格时,自动发送卖出平仓订单
  • 空头止损:当价格涨破止损价格时,自动发送买入平仓订单
  • 多头止盈:当价格涨破止盈价格时,自动发送卖出平仓订单
  • 空头止盈:当价格跌破止盈价格时,自动发送买入平仓订单
python 复制代码
def check_stop_conditions(self, tick: TickData) -> None:
    """检查止损止盈条件"""
    position = self.position_manager.get_position(vt_symbol)

    if position > 0:  # 多头持仓
        # 价格跌破止损价格
        if tick.last_price <= self.stop_loss_price:
            self.trading_manager.sell(vt_symbol, tick.last_price, abs(position))
            alert_manager.send_alert(
                content=f"触发多头止损: 价格 {tick.last_price}",
                symbol=vt_symbol,
                force_send=True
            )
            self.stop_loss_triggered.emit(vt_symbol, tick.last_price)

止损止盈触发后,系统会自动重置风控配置,移除图表上的风控线条,避免下次开仓时误触发。

价格预警功能

价格预警提供非强制性的价格提醒功能。可以设置多个预警价位,当价格穿过预警线时,系统通过飞书发送通知,但不会自动平仓。预警触发后自动从预警列表中移除,对应的橙色预警线也会从图表上消失。

预警操作指引
  1. 输入预警价格:在预警价格输入框中输入目标价格
  2. 点击设置按钮:点击"设置"按钮添加预警
  3. 查看预警线:图表上会显示橙色的预警虚线
  4. 接收通知:价格触及预警线时,飞书/钉钉会收到通知消息

快捷键支持

为了提高交易效率,系统提供了完整的快捷键支持:

  • Ctrl+N:新建图表
  • Ctrl+B:买入开仓
  • Ctrl+Shift+S:卖出开仓
  • Ctrl+Shift+C:平仓
  • Ctrl+P:同步持仓

系统会自动识别当前激活的图表,确保快捷键只对当前图表生效。即使同时打开多个图表,快捷键也不会在所有图表上重复下单,避免了误操作的风险。

实战经验与避坑指南

第一,持仓同步时机要把握好。CTP网关连接需要时间,程序启动后立即查询持仓往往失败。延迟2秒查询,同时提供Ctrl+P手动同步。

第二,可视化线条要及时清理。订单线和持仓线需要根据交易状态动态更新。活动订单显示委托线,非活动订单移除委托线,避免图表上线条无限增长。

第三,风控规则触发后必须重置。止损止盈触发后要清空配置、移除风控线,防止旧规则对新持仓造成影响。

写在最后

到这里,实时图表交易系统的核心内容基本讲完了。从ChartWizard到ChartTrader的改造,从多合约Tab管理到交易面板实现,从持仓可视化到风控监控,对日内交易来说,这种"所见即所得"的体验确实能让效率提升不少。

下一篇准备讲AI分析功能的集成。当前交易面板和风控面板已经基本满足日常需求了,但AI分析能帮你更好地理解市场。多模型对比、多周期智能分析,两个功能配合起来,决策效率能上一个台阶。

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


本文是《以AI量化为生》系列的第20篇,ATMQuant量化交易系统已开源至GitHub:https://github.com/seasonstar/atmquant

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


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

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


往期文章回顾

《以AI量化为生》系列


相关标签:#量化交易 #实盘交易 #K线图表 #Python #vnpy

相关推荐
搜狐技术产品小编20232 小时前
端侧Python动态算法策略的部署与运行
开发语言·python
时光书签2 小时前
了解脚本语言
python·bash·batch命令
ID_180079054732 小时前
Python 采集转转二手商品详情:API 接口与爬虫实战全方案(2026 最新)
开发语言·爬虫·python
m0_747124532 小时前
LangChain 索引增强对话链详解
python·ai·langchain
智算菩萨2 小时前
【Pygame】第19章 网络多人游戏基础与局域网联机原理
网络·python·游戏·pygame
MarsBighead3 小时前
VSCode Python 调试故障排查:`justMyCode` 配置项引发的血案
ide·vscode·python
迷藏4943 小时前
**发散创新:基于Python与深度学习的情绪识别实战全流程解析**在人工智能快速发展的今天,**情绪识别(Emoti
java·人工智能·python·深度学习
羊小猪~~3 小时前
LLM--SFT简介
python·考研·算法·ai·大模型·llm·微调
无心水3 小时前
17、Java内存溢出(OOM)避坑指南:三个典型案例深度解析
java·开发语言·后端·python·架构·java.time·java时间处理