跳转到内容

35. Stock Trading 股票交易

你想学炒股但不想亏真钱,做一个模拟交易器,看K线、练买卖。

  • 用硬编码数据模拟股票价格波动
  • 显示K线图(开高低收)
  • 模拟买入/卖出,计算盈亏
用纯HTML+JS实现一个股票模拟交易器:
功能:
1. 硬编码5只股票的基础数据(名称、代码、初始价格)
2. 每秒随机波动价格(±0.5%以内),模拟实时行情
3. K线图:用Chart.js画最近30根1分钟K线(开高低收)
4. 交易功能:
- 初始资金10万
- 买入:输入股数,扣减资金,增加持仓
- 卖出:输入股数,增加资金,减少持仓
5. 持仓面板:显示每只股票持仓数量、成本价、当前价、盈亏
6. 所有数据存localStorage
技术:纯HTML+CSS+JavaScript,Chart.js
单个index.html文件
  • 价格每秒波动,数字实时变化
  • K线图正确显示开高低收
  • 买入后资金减少、持仓增加
  • 卖出后资金增加、持仓减少
  • 盈亏计算正确(当前价-成本价)×持仓数
  • 刷新页面后数据不丢失
  • K线图数据结构(OHLC)→ Module: 数据可视化
  • 定时器模拟实时数据 → Module: JavaScript异步
  • 简单交易逻辑 → Module: 业务建模

V2 — 10个用户:真实行情+持仓管理

Section titled “V2 — 10个用户:真实行情+持仓管理”

想看真实的股票行情,记录自己的交易操作,分析历史盈亏。

  • 调用免费行情API获取真实数据
  • 后端管理持仓和交易记录
  • 盈亏统计和交易历史
用Go+Gin实现股票交易后端:
行情数据:
1. 调用免费API(如Alpha Vantage或Yahoo Finance)获取实时报价
2. 定时拉取(每分钟),缓存到内存避免频率限制
3. API:GET /api/quotes — 返回所有关注股票的最新价格
交易系统:
1. SQLite表:
- accounts(id, balance)— 账户余额
- positions(id, account_id, symbol, quantity, avg_cost)— 持仓
- trades(id, account_id, symbol, side, quantity, price, total, created_at)— 交易记录
2. API:
- POST /api/trades — 下单(买入/卖出)
- GET /api/positions — 当前持仓
- GET /api/trades — 交易历史
- GET /api/pnl — 盈亏统计
买入逻辑:检查余额 → 扣款 → 更新持仓(加权平均成本)
卖出逻辑:检查持仓 → 增加余额 → 减少持仓 → 记录实现盈亏
前端:React页面,显示行情、持仓、交易表单、盈亏图表
技术:Go+Gin, SQLite, React
  • 真实行情数据正确获取
  • 买入后余额和持仓正确更新
  • 卖出后实现盈亏正确计算
  • 交易历史完整记录
  • 加权平均成本计算正确
  • API频率限制内正常工作
  • 外部API调用与缓存 → Module: API集成
  • 加权平均成本算法 → Module: 金融计算
  • 事务保证数据一致性 → Module: 数据库事务

V3 — 100个用户:实时行情与订单撮合

Section titled “V3 — 100个用户:实时行情与订单撮合”

多用户同时交易,需要实时行情推送和基本的订单撮合机制。

  • WebSocket推送实时行情
  • 限价单和市价单支持
  • 基本撮合逻辑
在V2基础上实现实时行情和订单撮合:
实时行情:
1. WebSocket连接,服务端定时推送行情变化
2. 前端收到推送后实时更新K线和价格
3. 支持订阅/取消订阅指定股票
订单系统:
1. PostgreSQL表:
- orders(id, account_id, symbol, type, side, price, quantity, filled_qty, status, created_at)
- type: market(市价单)/ limit(限价单)
- status: pending / partial / filled / cancelled
2. 市价单:立即以当前价成交
3. 限价单:买单价格>=卖方 或 卖单价格<=买方 时成交
撮合引擎(简化版):
1. 内存中维护每只股票的买卖队列
2. 新订单进来时尝试撮合
3. 撮合成功 → 更新双方订单状态、持仓、余额
4. 未完全成交的限价单留在队列中
前端:行情页面+下单面板+订单列表(含状态)
技术:Go+Gin, PostgreSQL, WebSocket(gorilla/websocket), React
  • WebSocket连接稳定,行情实时推送
  • 市价单立即成交
  • 限价单在价格匹配时成交
  • 部分成交状态正确
  • 撮合后双方持仓和余额正确
  • 取消未成交限价单正常
  • WebSocket实时通信 → Module: 实时系统
  • 订单状态机 → Module: 状态管理
  • 基本撮合逻辑 → Module: 交易系统

V4 — 1000个用户:订单薄与撮合引擎

Section titled “V4 — 1000个用户:订单薄与撮合引擎”

交易量增大,需要高性能的撮合引擎和完整的订单薄展示。

  • 标准订单薄(价格优先-时间优先)
  • 高效内存撮合引擎
  • 深度图和交易历史实时展示
在V3基础上实现完整的订单薄撮合引擎:
订单薄:
1. 买单队列:按价格从高到低排,同价按时间先后
2. 卖单队列:按价格从低到高排,同价按时间先后
3. 数据结构:TreeMap(有序映射)存价格层级,每层一个FIFO队列
4. 撮合算法:
- 新买单:从卖单最低价开始匹配
- 新卖单:从买单最高价开始匹配
- 价格交叉则成交,否则挂单
深度图:
1. 前端实时展示买卖盘深度
2. 聚合显示(价格区间内的总量)
3. WebSocket推送深度变化(增量更新)
交易历史:
1. 最近成交记录实时滚动显示
2. 成交价走势图
3. Redis缓存最近成交记录(最新500条)
性能:
1. 撮合引擎用单独goroutine,通过channel接收订单
2. 避免锁竞争,订单薄操作串行化
3. 撮合结果异步写数据库
技术:Go+Gin, PostgreSQL, Redis, WebSocket, React
  • 订单薄价格优先-时间优先排序正确
  • 大量订单下撮合性能可接受
  • 深度图实时更新
  • 增量推送减少数据传输
  • 交易历史实时滚动
  • channel串行化无竞态问题
  • 订单薄数据结构 → Module: 数据结构
  • 价格优先-时间优先撮合 → Module: 交易系统
  • channel串行化并发 → Module: Go并发模式
  • 增量推送优化 → Module: 实时系统

交易规模大了,需要风控防止异常交易,每日结算保证数据准确。

  • 下单前风控检查
  • 异步清算系统
  • 每日结算与对账
在V4基础上实现风控和清算系统:
风控引擎:
1. 下单前检查(同步,必须通过才能下单):
- 持仓限制:单只股票持仓不超过总资产30%
- 涨跌停限制:价格触及涨跌停不允许对应方向下单
- 频率限制:每分钟下单不超过10次
- 金额限制:单笔不超过总资产50%
2. 风控规则可配置(管理后台)
3. 风控拦截日志记录
异步清算:
1. 成交记录先写入消息队列
2. 清算服务消费消息:
- 更新持仓
- 计算手续费
- 更新账户余额
- 生成清算流水
3. 清算失败 → 重试 + 告警
每日结算:
1. 每日收盘后触发结算任务
2. 计算每个账户当日盈亏
3. 持仓市值重新估算
4. 生成每日结算报告
5. 与交易流水对账,差异告警
技术:Go, PostgreSQL, Redis(消息队列用Stream), 定时任务(cron)
  • 超限下单被风控拦截
  • 风控规则动态生效
  • 拦截日志完整记录
  • 清算消息不丢失
  • 清算失败正确重试
  • 每日结算报告数据准确
  • 对账发现差异能告警
  • 前置风控 vs 后置风控 → Module: 风控系统
  • 消息队列保证最终一致性 → Module: 消息队列
  • 对账系统设计 → Module: 金融系统
  • 定时任务调度 → Module: 任务调度

追求极致交易性能,微秒级撮合,多市场同时交易。

  • 超低延迟撮合引擎
  • 无锁队列和内存优化
  • 多市场支持
在V5基础上实现高频低延迟交易系统:
LMAX Disruptor模式:
1. 环形缓冲区(Ring Buffer)替代channel
- 预分配固定大小内存,避免GC
- 单生产者写入,多消费者读取
- 序号机制实现无锁同步
2. 事件处理流水线:
- 接收 → 风控 → 撮合 → 清算 → 推送
- 各阶段并行处理不同事件
无锁优化:
1. 订单薄用无锁跳表(skip list)
2. 账户余额用atomic操作
3. 减少内存分配:对象池复用订单对象
4. 关键路径避免系统调用
行情组播:
1. 行情变化通过UDP组播分发(内网)
2. 可靠组播:序号+重传机制
3. 行情压缩:只发变化字段(delta encoding)
多市场:
1. 每个市场独立撮合引擎实例
2. 跨市场套利监控
3. 统一风控(跨市场持仓汇总)
4. 统一清算
技术:Go, 无锁数据结构, UDP组播, 对象池, 多核绑定
  • Ring Buffer正确实现,无数据竞争
  • 撮合延迟降低到微秒级
  • 无锁跳表操作正确
  • 对象池减少GC压力(pprof验证)
  • 行情组播正确接收
  • 多市场独立运行互不影响
  • 跨市场风控正确汇总
  • Disruptor模式(环形缓冲区)→ Module: 高性能系统
  • 无锁数据结构 → Module: 并发编程
  • UDP组播 → Module: 网络编程
  • GC优化与对象池 → Module: 性能调优