Files
ai-exchange/docs/AI_ICT_Codebase_Skeleton_Spec_v1.md
T
2026-04-24 13:39:01 +08:00

873 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI ICT Codebase Skeleton Spec v1
## 1. 文档目标
本文档用于把 AI ICT 项目第一阶段的总体设计进一步落到“代码骨架”粒度,明确:
1. 目录结构
2. 模块职责
3. 配置文件分工
4. 服务边界
5. 运行入口
6. 第一轮实现顺序
目标不是一次把全部业务写完,而是先把后续开发要长期承载的工程骨架固定下来,确保数据库、规则引擎、信号、执行、回测和 AI 报告都能在同一套结构下持续推进。
---
## 2. 设计原则
代码骨架应遵循以下原则:
1. 先支撑基础数据与基础规则,再支撑信号与执行
2. 规则判定与 AI 解释分层,不混在一个模块里
3. 数据入库、规则计算、信号生成、执行管理职责分离
4. 所有核心输出都应能回写 PostgreSQL
5. 第一阶段优先单体代码仓库,模块清晰即可,不急于微服务拆分
因此,第一版更适合采用:
- 单仓库
- 单进程多入口
- 共享 `config` / `db` / `models` / `services` / `rules`
- 后续再按实际负载拆服务
---
## 3. 推荐目录结构
建议第一版代码仓库采用以下结构:
```text
ai-ict/
src/
app/
config/
db/
migrations/
seeds/
repositories/
domain/
market/
session/
structure/
signal/
execution/
backtest/
report/
services/
market-data/
rule-engine/
signal/
execution/
report/
backtest/
rules/
swings/
ranges/
liquidity/
sweep/
displacement/
structure/
fvg/
bias/
jobs/
api/
runtime/
utils/
types/
scripts/
tests/
unit/
integration/
fixtures/
docs/
.env.example
package.json
tsconfig.json
README.md
```
说明:
- `src/domain/` 放领域对象与核心数据结构,不放外部 API 细节
- `src/services/` 放跨模块编排逻辑
- `src/rules/` 放纯规则判定逻辑
- `src/db/` 放 migration、seed、repository 和数据库接入
- `src/runtime/` 放各类启动入口
- `src/jobs/` 放定时任务、重算任务、数据同步任务
- `src/api/` 放 HTTP 接口或内部管理接口
---
## 4. 目录职责拆分
## 4.1 `src/app/`
用于放应用装配层。
建议内容:
- 容器初始化
- 配置加载
- 日志初始化
- 数据库初始化
- 服务注册
- runtime 共享启动辅助
这个目录不负责业务规则本身,只负责把系统拼起来。
---
## 4.2 `src/config/`
用于集中管理配置。
建议拆分:
```text
src/config/
env.ts
database.ts
market.ts
sessions.ts
timeframes.ts
risk.ts
models.ts
```
职责建议:
- `env.ts`
- 读取环境变量
- 做最小边界校验
- `database.ts`
- PostgreSQL 连接参数
- pool 配置
- `market.ts`
- 交易所、品种、symbol 映射
- `sessions.ts`
- ASIA / LONDON / NY_AM / NY_LUNCH / NY_PM 定义
- `timeframes.ts`
- bias/setup/trigger 周期配置
- `risk.ts`
- 单笔风险、日亏损、新闻窗口、会话限制
- `models.ts`
- 各策略模型编码,例如 `SWEEP_MSS_FVG`
要求:
- 配置模块只负责提供配置值
- 不在配置模块里写业务查询或数据库逻辑
---
## 4.3 `src/db/`
用于统一管理数据库接入。
建议结构:
```text
src/db/
client.ts
migrations/
seeds/
repositories/
venues-repository.ts
instruments-repository.ts
candles-repository.ts
market-sessions-repository.ts
swings-repository.ts
dealing-ranges-repository.ts
liquidity-pools-repository.ts
sweep-events-repository.ts
displacement-events-repository.ts
structure-events-repository.ts
fvg-zones-repository.ts
bias-snapshots-repository.ts
trade-signals-repository.ts
trade-executions-repository.ts
backtest-runs-repository.ts
backtest-results-repository.ts
```
职责:
- `client.ts` 负责 PostgreSQL 连接与事务入口
- `migrations/` 放正式 migration 文件
- `seeds/` 放初始种子数据
- `repositories/` 只负责表读写,不负责业务判断
建议约束:
- repository 不直接做规则识别
- 复杂业务编排交给 `services/`
- 规则计算交给 `rules/`
---
## 4.4 `src/domain/`
用于放领域模型与跨模块共享结构。
建议子目录:
```text
src/domain/
market/
session/
structure/
signal/
execution/
backtest/
report/
```
可承载内容:
- Candle
- SessionWindow
- Swing
- DealingRange
- LiquidityPool
- SweepEvent
- DisplacementEvent
- StructureEvent
- FvgZone
- BiasSnapshot
- TradeSignal
- TradeExecution
- BacktestRun
- BacktestResult
要求:
- 领域层表达“数据是什么”
- 不表达“从哪个 API 拉来的”
- 不耦合具体数据库客户端
---
## 4.5 `src/rules/`
这是第一阶段最关键的纯规则层。
建议结构:
```text
src/rules/
swings/
detect-swings.ts
ranges/
detect-dealing-range.ts
classify-price-location.ts
liquidity/
detect-liquidity-pools.ts
sweep/
detect-sweeps.ts
displacement/
detect-displacement.ts
structure/
detect-msb.ts
detect-mss.ts
fvg/
detect-fvg.ts
update-fvg-status.ts
bias/
build-bias-snapshot.ts
```
职责:
- 输入标准化市场数据或上游结构对象
- 输出结构化判定结果
- 尽量保持纯函数、可回测、可重复执行
设计要求:
- `rules/` 不直接调用交易所 API
- `rules/` 不直接控制下单
- `rules/` 可以被实时运行和回测共用
这层是后续“规则口径与回测口径一致”的核心。
---
## 4.6 `src/services/`
服务层负责把 repository、rules、外部数据源串起来。
建议结构:
```text
src/services/
market-data/
ingest-okx-candles.ts
sync-instruments.ts
generate-market-sessions.ts
rule-engine/
rebuild-market-structure.ts
run-swing-pipeline.ts
run-liquidity-pipeline.ts
run-structure-pipeline.ts
signal/
build-bias.ts
generate-trade-signals.ts
update-signal-state.ts
execution/
run-risk-check.ts
create-paper-order.ts
create-semi-auto-order.ts
manage-open-position.ts
report/
build-pre-market-report.ts
build-intraday-report.ts
build-post-trade-review.ts
backtest/
run-backtest.ts
summarize-backtest.ts
```
服务层职责是:
- 组织调用顺序
- 控制事务边界
- 调用 repository 落库
- 调用 rules 计算
- 处理任务入口与失败恢复
要求:
- service 可以依赖多个 repository 和 rule 模块
- service 不应把 SQL 写得到处都是
- service 不应承载底层公共工具函数
---
## 4.7 `src/jobs/`
用于放异步任务与定时任务入口。
建议首批任务:
- `sync-okx-candles-job.ts`
- `generate-sessions-job.ts`
- `rebuild-swings-job.ts`
- `rebuild-liquidity-job.ts`
- `generate-signals-job.ts`
- `run-backtest-job.ts`
职责:
- 作为 cron 或手动触发入口
- 调用 `services/` 完成任务
- 记录任务执行日志
---
## 4.8 `src/api/`
第一阶段即使不做完整前端,也建议预留轻量 API 层。
建议提供:
- health check
- recent candles query
- current sessions query
- current structure query
- candidate signals query
- backtest summary query
作用:
- 供后续 Web 控制台使用
- 供人工验证与调试使用
- 避免所有数据检查都依赖直接查库
---
## 4.9 `src/runtime/`
用于放程序入口。
建议结构:
```text
src/runtime/
worker.ts
api-server.ts
market-data-runner.ts
rule-engine-runner.ts
signal-runner.ts
backtest-runner.ts
```
每个入口只负责:
- 启动应用上下文
- 选择要跑的 service 或 job
- 处理进程级日志与退出码
不建议把核心业务直接堆在入口文件里。
---
## 4.10 `src/utils/`
只放通用工具。
例如:
- 时间处理
- 数值精度处理
- 时区转换
- 分页工具
- 幂等键生成
要求:
- 不把业务规则偷偷塞进 `utils`
- 与 ICT 规则直接相关的逻辑应留在 `rules/`
---
## 4.11 `src/types/`
用于放跨层共享类型。
例如:
- DTO
- job payload
- service input/output
- API response shape
如果某类型已经明显属于领域对象,应优先放回 `domain/`,不要全堆在 `types/`。
---
## 5. 服务边界
结合总体设计,第一阶段建议保留 5 条主要服务边界。
## 5.1 market-data-service
职责:
- 拉取 OKX / LMAX 行情
- 规范化 candles
- 维护 instruments 元数据
- 生成 market sessions
- 持续写入 PostgreSQL
核心输入:
- 交易所 API
- 品种配置
- session 配置
核心输出:
- `venues`
- `instruments`
- `candles`
- `market_sessions`
---
## 5.2 rule-engine-service
职责:
- 基于 candles 和 sessions 识别结构
- 生成 swings、ranges、liquidity、sweep、displacement、MSS、FVG
- 维护结构对象的更新与重算
核心输入:
- `candles`
- `market_sessions`
- 参数配置
核心输出:
- `swings`
- `dealing_ranges`
- `liquidity_pools`
- `sweep_events`
- `displacement_events`
- `structure_events`
- `fvg_zones`
---
## 5.3 signal-service
职责:
- 汇总 higher timeframe context
- 生成 bias snapshot
- 把结构链路组合成 trade signal
- 维护 signal 状态流转
核心输出:
- `bias_snapshots`
- `trade_signals`
---
## 5.4 execution-service
职责:
- 风控检查
- 模拟盘执行
- 半自动下单编排
- 持仓与订单状态更新
核心输出:
- `trade_executions`
- 风控结论
- 审计记录
---
## 5.5 report-service
职责:
- 盘前计划
- 盘中解释
- 盘后复盘
- 回测摘要
- 为 LLM 准备结构化输入
核心要求:
- 只解释规则层和执行层的结构化结果
- 不绕过规则直接生成裸建议
---
## 6. 配置文件与环境变量建议
第一阶段建议至少具备以下配置文件:
### 6.1 `.env.example`
建议包含:
```text
DATABASE_URL=
OKX_API_KEY=
OKX_API_SECRET=
OKX_PASSPHRASE=
LMAX_BASE_URL=
APP_TIMEZONE=UTC
DEFAULT_SESSION_TIMEZONE=America/New_York
LOG_LEVEL=info
```
说明:
- 第一阶段至少把数据库和 OKX 接入所需变量明确下来
- 未实际接入的供应商变量也可以预留,但不要提前绑定太多无用项
### 6.2 `package.json`
建议承载:
- dev 启动命令
- migration 命令
- seed 命令
- ingest 命令
- rule rebuild 命令
- backtest 命令
### 6.3 `tsconfig.json`
建议固定:
- 路径别名
- strict 模式
- source map
- 测试目录纳入方式
### 6.4 日志与格式配置
若使用:
- ESLint / Biome
- Prettier
- Vitest / Jest
应在项目启动初期固定,避免中期频繁改工程规范。
---
## 7. 数据库层与代码层映射建议
第一阶段建议先把数据库对象与代码模块稳定映射:
| 数据表 | repository | 主要服务 | 主要规则 |
|---|---|---|---|
| `venues` | `venues-repository.ts` | `sync-instruments.ts` | - |
| `instruments` | `instruments-repository.ts` | `sync-instruments.ts` | - |
| `candles` | `candles-repository.ts` | `ingest-okx-candles.ts` | - |
| `market_sessions` | `market-sessions-repository.ts` | `generate-market-sessions.ts` | - |
| `swings` | `swings-repository.ts` | `run-swing-pipeline.ts` | `detect-swings.ts` |
| `dealing_ranges` | `dealing-ranges-repository.ts` | `run-structure-pipeline.ts` | `detect-dealing-range.ts` |
| `liquidity_pools` | `liquidity-pools-repository.ts` | `run-liquidity-pipeline.ts` | `detect-liquidity-pools.ts` |
| `displacement_events` | `displacement-events-repository.ts` | `run-structure-pipeline.ts` | `detect-displacement.ts` |
| `structure_events` | `structure-events-repository.ts` | `run-structure-pipeline.ts` | `detect-msb.ts` / `detect-mss.ts` |
| `fvg_zones` | `fvg-zones-repository.ts` | `run-structure-pipeline.ts` | `detect-fvg.ts` |
| `bias_snapshots` | `bias-snapshots-repository.ts` | `build-bias.ts` | `build-bias-snapshot.ts` |
| `trade_signals` | `trade-signals-repository.ts` | `generate-trade-signals.ts` | 组合规则 |
| `trade_executions` | `trade-executions-repository.ts` | `create-paper-order.ts` | 风控规则 |
| `backtest_runs` | `backtest-runs-repository.ts` | `run-backtest.ts` | - |
| `backtest_results` | `backtest-results-repository.ts` | `run-backtest.ts` | 回放逻辑 |
这样可以避免后续代码增长后职责混乱。
---
## 8. 运行入口建议
第一阶段建议至少提供以下运行入口。
## 8.1 API server
用途:
- 健康检查
- 查询当前市场结构
- 查询候选信号
- 查询回测摘要
建议入口:
- `src/runtime/api-server.ts`
---
## 8.2 market data runner
用途:
- 定时拉取 OKX candles
- 同步 instruments
- 驱动 session 生成
建议入口:
- `src/runtime/market-data-runner.ts`
---
## 8.3 rule engine runner
用途:
- 重算 swings
- 重算 dealing range
- 重算 liquidity
- 重算 displacement / MSS / FVG
建议入口:
- `src/runtime/rule-engine-runner.ts`
---
## 8.4 signal runner
用途:
- 生成 bias snapshot
- 生成 trade signal
- 更新 signal 状态
建议入口:
- `src/runtime/signal-runner.ts`
---
## 8.5 backtest runner
用途:
- 执行指定模型、品种、周期范围的回测
- 输出 backtest summary
建议入口:
- `src/runtime/backtest-runner.ts`
---
## 9. 第一轮实现顺序
结合路线图与总体设计,建议第一轮按以下顺序实现。
## 9.1 Step 1:项目骨架初始化
先完成:
- `src/config/`
- `src/db/client.ts`
- `src/runtime/`
- `src/services/market-data/` 基础空壳
- `.env.example`
- 日志模块
完成标准:
- 项目可启动
- 配置可加载
- PostgreSQL 可连接
---
## 9.2 Step 2:基础 migration 落地
先建:
- `venues`
- `instruments`
- `candles`
- `market_sessions`
- `swings`
- `dealing_ranges`
- `liquidity_pools`
说明:
- 这是第一阶段共享底座
- 后续所有规则与信号都依赖这些表
---
## 9.3 Step 3:OKX 数据接入
优先接通:
- BTC
- ETH
完成内容:
- candles 拉取
- 标准化
- 入库
- 去重
---
## 9.4 Step 4:session generator
完成内容:
- ASIA / LONDON / NY_AM / NY_LUNCH / NY_PM 切分
- session high / low / midpoint 生成
- 状态更新
---
## 9.5 Step 5:基础规则层
优先实现:
1. swings
2. dealing_ranges
3. liquidity_pools
原因:
- 它们是 sweep / MSS / FVG 的共同前提
---
## 9.6 Step 6:核心信号链
按链路推进:
- sweep
- displacement
- MSB / MSS
- FVG
- bias snapshot
- trade signal
主链路保持为:
`Sweep -> MSS -> FVG Retrace -> IRL/ERL`
---
## 9.7 Step 7:回测与执行
在信号链稳定后,再进入:
- backtest
- paper trading
- semi-auto execution
- report generation
不建议跳过回测直接做执行自动化。
---
## 10. 第一阶段最小启动文件清单
若现在要直接开始建项目,建议先落以下最小文件:
```text
src/config/env.ts
src/config/database.ts
src/config/sessions.ts
src/db/client.ts
src/db/migrations/001_create_venues.sql
src/db/migrations/002_create_instruments.sql
src/db/migrations/003_create_candles.sql
src/db/migrations/004_create_candles_partitions_and_indexes.sql
src/db/migrations/005_create_market_sessions.sql
src/services/market-data/ingest-okx-candles.ts
src/services/market-data/generate-market-sessions.ts
src/runtime/market-data-runner.ts
src/runtime/api-server.ts
.env.example
```
若以上文件稳定,再继续进入 swing / dealing range 实现。
---
## 11. 验证与关闭标准
根据执行检查清单,代码骨架文档完成至少应满足:
- 文档已写入本地 `.md`
- 路径存在
- 已读取前部内容检查格式正常
- 标题、章节结构、核心内容完整
后续代码真正开始落地时,每个骨架模块也应满足:
- 有目标文件
- 有最小启动或导入验证
- 与当前阶段目标直接相关
---
## 12. 当前结论
AI ICT 项目第一阶段最合适的代码组织方式,不是上来拆成很多独立服务,而是:
> 先建立单仓库、清晰分层、可多入口运行的工程骨架,再按 `数据 -> 基础规则 -> 核心信号 -> 回测 -> 执行 -> 报告` 顺序推进。
只要骨架按本文档固定下来,后续 migration、OKX 接入、session generator、swings、dealing range、liquidity、MSS、FVG 和 signal 都可以在同一套结构下稳定扩展。