Learning
VOL. VII · NO. 55 · OTC Derivatives · 19 JUL 2026

Code Map

OTC 衍生品 · 19 JUL 2026 · 12 min read · 2,323 words
· · ·

ODTS 06 — 代码地图:逐项目导航

这篇文档是 ~35 个项目(~/odts1/ 下)的导航索引。每个项目回答三个问题:这个项目做什么?→ 关键包是什么?→ 什么时候会动它?


1. 核心交易系统(三大件)

1.1 eds-web-app — 后端枢纽

系统中最重要的项目。95% 的业务逻辑在这。

业务含义: eds-web-app 宕机 = 交易台无法簿记新交易、无法生成确认书、无法推送 SAC 报告。一次 30 分钟的宕机意味着:交易员无法录入正在电话上敲定的交易,客户在电话里等一个合约号,系统就是给不出来。2018-2021 年间,eds-web-app 因内存泄漏导致的偶发宕机(每季度 1-2 次)平均恢复时间约 20 分钟——这段时间交易台”盲交易”(先做交易,后补录系统),但补录本身增加运营风险。

路径: ~/odts1/eds-web-app/
技术栈: Java 8, Gradle, Spring Boot (edsBoot), ActiveMQ, Protobuf, JFinal(老部分)
职责
controller.*REST API 端点(“新”Spring Boot 层)
action.*早期 Action 类(类 Struts 模式)
action.contract.*合约簿记、估值报告
action.contractFile.*确认书文档生成
action.sacReport.*SAC 监管报告
communication.*系统间通信(ACP、Dipper)
activeMQ.*消息队列集成

最常用的 Controllers:

  • ContractController.java — 簿记、确认书、文件生成
  • PreBookController.java — 预簿记工作流
  • OptionExecutionController.java — 期权行权/指派
  • CashVrController.java — 资金变动 CRUD
  • MarginController — 保证金查询
  • ReferenceDataController.java — 参考数据(标的、日历)

什么时候改这个项目: 任何业务规则变化——合约条款、确认书逻辑、报告、定价触发、保证金规则。

1.2 hedging-as — 定价与风险引擎

ODTS 的分析核心。处理所有定价、估值、保证金、EOD 计算。

业务含义: hedging-as 宕机 = EOD 跑不出来 = 第二天交易台的 Greeks 和保证金数据是前一晚的。2022 年曾经有一次 EOD 在凌晨 2 点才跑完,原因是 hedging-as 的估值线程池配置太小,5000 个合约排队处理。交易员第二天开盘用的保证金数据是 18 小时前的——在波动市里”18 小时前的保证金”几乎等于没有。

路径: ~/odts1/hedging-as/
技术栈: Java 8, Gradle, JFinal (web 框架), Protobuf, 0MQ, ActiveMQ
职责
pricing.*定价引擎:计算、数据、模型、保证金、压力测试
edslib.payoff.*收益函数——每个产品的数学定义
edslib.valuation.*估值方法(蒙特卡洛、解析解、PDE)
action.contract.*合约 CRUD(交易领域模型所在地)
action.quotation.*报价入口(PricingService 适配器)
action.valuation.*EOD 估值触发
action.margin.*保证金计算
action.eod.*日终批处理编排
service.contract.*核心交易领域Contract.javaContractHelper.java
service.margin.*保证金服务层
service.eod.*EOD 批处理服务
service.Fixing.*定盘/利率重置处理
service.event.*生命周期事件管理
service.stateMachine.*交易状态机 (ACTIVE→EXPIRED→TERMINATED)
cep.*复杂事件处理(实时风控)

关键领域类:

service/contract/model/
├── ContractLegStruct.java          — Leg 结构(收/付规则)
├── ContractNotional.java           — 名义本金
├── ContractWithLegs.java           — 合约 + 所有 leg 聚合
├── ContractInstrumentRelate.java
├── ContractUnderlyingRelate.java
└── ContractMonitor.java

edslib/payoff/
├── SnowballPayoff.java             — 雪球结构
├── TrsPayoff.java                  — 总收益互换
├── NdollarPayoff.java              — NDF
├── VanillaOptionPayoff.java
├── BarrierOptionPayoff.java
└── SwapPayoff.java

什么时候改: 加新产品类型、改定价公式、修 EOD batch bug、调保证金方法论。

1.3 edsWeb — 原始 JSP 前端

遗留前端。正在被 new-edsweb 逐步替代。

路径: ~/odts1/edsWeb/
技术栈: Java 8, JSP, Gradle, Struts 式 Action
职责
action.*UI 动作处理器(登录、导航)
communication.*后端 API 桥接
global.*全局配置
framework.*自定义框架(数据库、Protobuf)

什么时候改: 只修 bug。新功能写 new-edsweb + eds-web-app。


2. 前端项目

2.1 new-edsweb — 现代 Vue 2 SPA

核心 EDS 系统的活跃前端。

路径: ~/odts1/new-edsweb/
技术栈: Vue 2, Element UI, VxeTable, Vuex, Vue Router, Axios
目录职责
src/views/页面级组件
src/api/后端 API 调用
src/components/common/共享 UI 组件
src/components/VxeTable/高级表格组件
src/store/Vuex 状态管理
src/router/路由定义

关键页面:

src/views/option-contract/        — 合约簿记
src/views/confirmationStamp/      — 确认书盖章
src/views/cashTransfer/           — 资金变动
src/views/customerInfo/           — 对手方详情
src/views/valuationReport/        — 客户估值报告
src/views/riskIndicators/         — 风控指标仪表盘
src/views/eod/                    — EOD 操作视图
src/views/eventManagerNew/        — 生命周期事件管理
src/views/tradingCal/             — 交易日历
src/views/balanceCheckInfo/       — 余额检查
src/views/foreignExchange/        — 外汇敞口
src/views/blackOrWhiteList/       — 制裁/限制名单

什么时候改: 添加或修改核心 EDS 业务流程的 UI。

2.2 odts-option-web — 期权与风控 SPA

独立的 Vue 2 SPA,专注期权合约管理、对冲监控和风险分析。

重复的代价: 两个前端项目加起来约 14 万行 Vue 代码,其中大约 30% 的功能是重复的(合约列表、保证金展示、搜索过滤)。保守估算:一个功能在两套前端各做一遍,每次多花 3-7 天。2021-2023 年间,约 20+ 个功能被做了两遍——这意味着浪费了大约 60-140 人天(3-7 人月),足够做一个完整的共享组件库。

路径: ~/odts1/odts-option-web/
技术栈: Vue 2, Element UI, VxeTable, KoiUI(自研组件库), Axios
目录职责
modules/option-contract/期权合约管理
modules/hedge-monitor/对冲监控仪表盘
modules/counterparty/对手方头寸视图
modules/market/报价、估值报告、限制名单
modules/stress-testing/压力测试 UI
modules/system/管理后台(用户、角色、菜单、字典)
components/KoiUI/自研 UI 组件库

什么时候改: 建风控/对冲/期权专用的 UI、管理工具。


3. 市场数据与定价基础设施

3.1 eds-price-server

市场数据服务。从外部供应商(路透、彭博)和内部源聚合价格、波动率、利率。

路径: ~/odts1/eds-price-server/
技术栈: Java

什么时候改: 加新市场数据源、修数据源连接问题。

3.2 eds-utility / eds-utilitysrc

跨项目共享的工具库。

什么时候改: 加共享工具类(日期计算、数字格式化等)。


4. CRM 与客户端系统

4.1 AccessApp (accessapp-new)

客户使用的应用程序。用于查看投资组合和头寸、访问交易确认书、管理担保品和保证金追缴、查看对账单和报告。

路径: ~/odts1/accessapp-new/
技术栈: Java, Spring Boot

什么时候改: 客户端功能(不是核心 ODTS API)。

4.2 UnionLogin (unionLogin)

ODTS 生态的统一登录/单点登录 (SSO)。

什么时候改: 认证、SSO 集成。


5. 监管与报告

5.1 ofareg (ofareg-path)

监管报告子系统。处理 SAC 和其他监管报送。

路径: ~/odts1/ofareg-path/
技术栈: Java

做什么:CtrContract 读取活跃交易 → 转换为 SAC 标准 XML → 通过 API 提交到监管系统 → 跟踪提交状态并处理重试。

什么时候改: 新监管要求、报告格式变化。


6. 消息队列与通信

6.1 ActiveMQ 基础设施

ActiveMQ 宕机的连锁反应: 每天 ~50 万条消息通过 ActiveMQ 流转。如果 ActiveMQ 挂了(2019-2020 年间发生过 3-4 次),定价结果传不到 eds-web-app,确认书生成请求发不出去,客户门户看不到更新。最严重的一次 ActiveMQ 宕机(2020 年)持续了 2 小时,导致 EOD 延迟到晚上 23:00 才完成——因为积压的 30 万条消息恢复后洪水般涌入,新消息又被堵住。修复方案是重启 ActiveMQ 并清空部分队列——但清队列意味着丢失了未处理的消息。此后团队给关键队列增加了持久化配置,但 ActiveMQ 的稳定性仍是系统的阿喀琉斯之踵。

多个项目通过 ActiveMQ 做异步消息:

edsWeb (UI 请求) → ActiveMQ → eds-web-app (业务逻辑)
hedging-as (定价) → ActiveMQ → eds-web-app (结果)
eds-web-app → ActiveMQ → AccessApp (客户通知)

6.2 Dipper 通信协议

eds-web-app/src/com/cicc/communication/dipper/ — 用 Protobuf 搭建的自研消息协议。早于 ActiveMQ 迁移,正在逐步淘汰。


7. 数据与存储

7.1 数据库

主要 RDBMS: MySQL / Oracle

关键表:

CtrContract               — 交易/合约(核心表)
CtrContractLeg            — 交易 legs
CtrContractLegCashFlow    — 现金流计划
ContractFile              — 确认书文档
CounterParty              — 对手方主数据
MarginCall                — 保证金追缴记录
ValuationResult           — 每日估值快照

7.2 S3 对象存储

存储:确认书 PDF、报告文件、上传的文档。

7.3 Redis

用于:缓存参考数据、会话管理、限流。


8. Protobuf Schema 与代码生成

跨系统的数据合约定义在 Protobuf 中。每个业务领域有自己的 .proto 命名空间:

hedging-as/src/com/framework/protobuf/
├── bookingAs/       — 簿记系统消息
├── gateway/         — 网关协议
├── hedgingAs/       — 对冲应用服务器消息
├── pricingAS/       — 定价 AS 消息
├── reckoning/       — 结算消息
├── trade/           — 交易消息
└── util/            — 共享工具类型

9. 支撑工具

项目用途
applog/应用日志配置
config/共享配置文件
diagrams.net/架构图
ice/ICE 集成(期货/期权交易所)
jzmq/JeroMQ (ZeroMQ Java) 集成
new-quota/额度管理
tradedesign/交易设计文档

快速参考:按业务关注点

关注点项目包/路径
交易簿记eds-web-appContractController.java
定价hedging-aspricing/service/PricingService.java, edslib/payoff/
确认书eds-web-appaction/contractFile/
估值 (EOD)hedging-asaction/valuation/
保证金hedging-asaction/margin/, service/margin/
定盘hedging-asaction/Fixing/, service/Fixing/
公司行为hedging-asContractDividendHelper.java
SAC 报告ofareg, eds-web-appaction/sacReport/
客户门户accessapp-new
对冲监控odts-option-webmodules/hedge-monitor/
资金管理eds-web-appCashVrController.java
风控仪表盘new-edswebviews/riskIndicators/
参考数据eds-web-appReferenceDataController.java
对手方eds-web-appEdsCounterpartyController.java

内行才知道的:两个服务共享一个 eds-utility,但它不是”免费午餐”

ODTS 的模块边界靠一个共享 JAR 维持:eds-utility(也叫 com.cicc.utils)。hedging-as 和 eds-web-app 都依赖它,里面装着日期工具、金额格式化、全局参数读取、合约字段生成器等”公共件”。

它长什么样

eds-utility/
├── DateUtil.java              — 交易日/节假日计算
├── CommonUtil.java            — 全局参数读取 (getGlobalParaValueByParaId)
├── MoneyUtil.java             — 金额格式化、舍入
└── contract/generator/        — 确认书/交易书字段填充器
    ├── CommonParamProvider.java
    └── SuperAdditionConfoGenerator.java

真实踩坑:改了日期工具,两个系统一起炸

DateUtil 里有一组”交易日历”方法(判断某天是不是交易日、往前推 N 个交易日)。2020 年一个开发者在 DateUtil 里修了一个”清明节调休”的边缘判断,本意是让 hedging-as 的 EOD 定盘日计算更准。但他没意识到 eds-web-app 也在用同一个 DateUtil 算簿记截止日和确认书生成日。

结果:EOD 修对了,但当周的簿记”同日截止”逻辑也跟着变了——有几笔应该在 T+0 截止的交易被系统判定为”已过期需走 T+1”,交易员当天无法簿记,只能走线下特批。更糟的是 CommonParamProvider 里那段 SELECT ELEMENTVALUE AS BSIGNEDPRODUCTSAC 的 SQL 是从全局参数表读”已签署产品”,这类全局读取一旦被 CommonUtil 的缓存改动影响,确认书生成会静默拿到旧产品名——确认书照常出,但产品名字是错的,客户拿到后才发现。

业务启示: 共享库看起来省事,但它把两个系统的”爆炸半径”绑在了一起。在 ODTS 里改 eds-utility 任何东西,正确的做法不是改完自己测一遍,而是同时回归 hedging-as 和 eds-web-app 两条线。这也是为什么很多”只动了一行工具方法”的发布,反而要拉上定价团队和簿记团队一起验。

一个反直觉的事实:common 包里不全是共享的

新人 grep contractFile 时经常误以为所有”合约文件”逻辑都在 eds-web-app 的 action/contractFile/。其实确认书的字段填充发生在 eds-utilitygenerator/,而 eds-web-app 只是调用方。也就是说,确认书”显示什么文字”的真相在共享库,不在业务项目。修确认书模板 bug 时,如果你只改 template/ 下的 docx 却没效果,八成是 SuperAdditionConfoGenerator 里硬编码了某个字段映射——这种 bug 在业务项目里 grep 一整天都找不到。

下一篇:07-Business-Concepts.md —— TRS、NDF、雪球、Swap 到底是什么