Skip to content

About

Trade-Agent 是一个面向加密货币市场的AI Agent的自动化交易所,支持自定义数据训练和量化交易,AI Agent自动化交易。支持交易策略执行、数据处理与智能分析,适用于量化交易、自动化工作流以及 AI 驱动的金融应用开发。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Trade-Agent · 加密货币行情交易终端

基于 Bitget 实时行情与全球财经快讯的开源加密货币行情研究与交易终端 —— K 线终端、市场总览、筛币器、热力图、社区观点与快讯中心一体化。

License: GPL v3 Python React FastAPI TypeScript

中文 · English

免责声明:本项目仅用于学习与研究,不构成任何投资建议。当前版本聚焦行情数据与终端展示,不提供交易执行能力。


目录


项目简介

Trade-Agent 是一个全栈的加密货币行情研究与交易终端:

  • 后端(Python / FastAPI):通过 Bitget 官方 MCP 服务抓取 K 线历史并写入 PostgreSQL,通过公共 WebSocket 实时推送行情;提供指标 / 结构 / 支撑阻力分析,以及基于 AKShare / BlockBeats 的财经快讯管线。
  • 前端(React 19 / Vite / TypeScript):类 TradingView 的专业终端界面,包含行情仪表盘、市场总览、筛币器、热力图、社区观点、新闻中心等,全中文界面、支持暗/亮主题。

关于 AI Agent:本项目曾内置自研的 AI 交易智能体与 QUANT LAB 量化研究,二者已整体移除。现以 LangChain / LangGraph / Deep Agents 重建,遵循一条硬边界:LLM 只做前置的"深度市场研报与策略生成",下单执行与硬风控由零 LLM 的确定性 LangGraph 状态图接管。

当前为 Phase 1(纸面闭环):研究与执行均在独立 worker 进程内定时自治运行;执行走纸面 broker,不接实盘;checkpointer、JSON 存储(告警 / 图表配置 / BlockBeats 缓存 / 事件)与 K 线 / 智能体投影均已迁移到 PostgreSQL(独立的 compose postgres 服务,唯一持久层),作为跨进程恢复与查询的基础;人工审批(HITL)与跨进程恢复留待 Phase 2。启用研究层需提供模型凭据(MD_AGENT_MODEL + 对应 provider API Key);缺失时 worker 空转、不下单、不报错。

整个项目以 OpenSpec 规格驱动开发,历史功能均有对应规格与设计文档沉淀在 openspec/。

功能特性

  • 专业 K 线终端:klinecharts-pro 渲染,多周期 / 多图表联动、技术指标、SMC 结构分析、支撑阻力、绘图工具、价格预警线。
  • 实时行情:Bitget 公共 WebSocket 推送 K 线 / 盘口 / Ticker,前端 WS 订阅协议(candle / books / ticker)。
  • 市场总览与分析:市场总览、筛币器、热力图、社区观点;指标 / 结构 / 支撑阻力 REST 分析接口。
  • 全球财经快讯:AKShare 聚合东财 / 新浪 / 同花顺 / 财联社 7×24 快讯,SSE 实时推送,主题自动分类,瀑布流 UI,支持历史分页。
  • BlockBeats 快讯/数据:加密货币新闻流与数据缓存。
  • 价格提醒:本地 + 服务端持久化告警。
  • K 线历史:MCP / REST v2 / v3 深度历史回填,PostgreSQL 存储,增量调度,数据完整性校验。
  • 全中文界面,暗/亮主题,响应式多市场(SPOT / USDT-FUTURES)。

技术栈

层 技术
后端 Python ≥ 3.11 · FastAPI · uvicorn · APScheduler · pandas / pyarrow · numpy · pydantic-settings · akshare · PostgreSQL(唯一持久层:K 线 / 告警 / 图表配置 / 事件 / 快讯缓存 / 智能体投影 / LangGraph checkpointer)
数据接入 Bitget Agent MCP(stdio)· Bitget 公共 WebSocket · REST v2/v3
前端 React 19 · Vite 6 · TypeScript 5 · Tailwind CSS v4 · klinecharts + klinecharts-pro · Radix UI · motion · lucide-react · 自托管 Google Sans Flex / Noto Sans SC
测试 pytest(三层测试)· Vitest + Testing Library · Playwright(E2E)
工程 uv / pip · npm · OpenSpec 规格驱动开发 · GPL-3.0

系统架构

┌────────────────────── 浏览器 · React 19 + Vite ──────────────────────┐
│  SuperCharts │ Markets │ Screener │ Heatmaps │ Community │ News       │
│  klinecharts-pro · i18n(中文) · Tailwind v4 · dark/light             │
└───────────────────────┬─────────────────────────┬──────────────────┘
                        │ /api (vite proxy)       │ /ws
┌───────────────────────▼─────────────────────────▼──────────────────┐
│                     FastAPI · uvicorn (:8000)                      │
│   REST:/candles /analyze /structure /levels /tickers /news ...    │
│   WS:candle / ticker / books / trade / mark-price / funding-time  │
│   SSE:/news/stream(全球快讯实时流)                               │
├────────────────────────────────────────────────────────────────────┤
│  Bitget MCP (stdio) │ Bitget 公共 WS │ AKShare │ BlockBeats API    │
│  K线抓取/回填        │ 实时bar/盘口    │ 快讯4源 │ 加密快讯/数据   │
│                        ▼  单一持久层(PostgreSQL)                 │
│  candles · alerts · chart_config · blockbeats_cache · events ·     │
│  proposals · runs · stream_events · LangGraph 检查点表             │
└────────────────────────────────────────────────────────────────────┘

持久层只有 PostgreSQL:candles / alerts / chart_config / blockbeats_cache / events / proposals / runs / stream_events(外加 LangGraph checkpointer 建的表)。 旧文件 —— backend/data/parquet 的日分区与 backend/data/agent 下的 JSON / JSONL (runs.jsonl、stream.jsonl 等)—— 是迁移前的存储,留在磁盘上仅供审计与重跑, 运行时不再读写。

快速开始

环境要求

  • Python ≥ 3.11
  • Node.js ≥ 20(含 npm)
  • Windows / macOS / Linux 均可

1. 启动后端

cd backend
python -m venv .venv

# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate

pip install -e .
cp .env.example .env   # 按需修改(默认无 Key 也可启动)

启动 API 服务(默认 http://127.0.0.1:8000):

# 方式一:uvicorn(开发)
uvicorn market_data.webapi:create_app --factory --port 8000

# 方式二:CLI 入口
market-data serve

公开行情(K 线、实时 WebSocket)无需任何 API Key。仅 BlockBeats 快讯需要 BB_API_KEY,缺失时相关接口自动降级。

2. 启动前端

cd frontend
npm install
npm run dev

打开 http://127.0.0.1:5173 即可(/api 与 /ws 自动代理到后端 8000 端口)。

3. 可选:CLI 数据抓取

# 查看可用 MCP 工具
market-data discover
# 抓取一段 K 线并导出 Excel
market-data pull --symbol BTCUSDT --timeframe 5m --start 2024-01-01 --end 2024-01-02 --export
# 增量拉取
market-data incremental --symbol BTCUSDT --timeframe 5m --start 2024-01-01 --end 2024-01-03
# 数据缺口检查
market-data gaps --symbol BTCUSDT --timeframe 5m
# 指标 + 支撑阻力分析
market-data analyze --symbol BTCUSDT --timeframe 1h

4. 可选:Docker 开发容器

仓库附带一套基于 Docker Compose 的 Debian 开发环境(compose.yaml / Dockerfile / docker/entrypoint.sh / scripts/dev-sync.sh),采用原生工作副本(native working copy)模型:仓库不再 bind-mount 进容器,容器在 ext4 命名卷里维护自己的工作副本, Windows 侧仓库只读挂载为 /src-ro 作为单向 rsync 源;git / pytest / vitest / pnpm 全部在 容器内运行。旧设计把仓库 bind-mount 进 9p 挂载,容器内 git 会 SIGBUS / Bus error、pytest 慢到 462–547 s,新设计下 git 正常、pytest 实测 69.5 s(pytest 自报;端到端 74.4 s)。

# 构建 + 启动(唯一容器,自动常驻 backend/frontend)+ 首次同步
wsl.exe -d Ubuntu-26.04 -- bash -lc 'cd /mnt/d/work/project/trade && scripts/dev-sync.sh up'
# 进入容器(可选)
wsl.exe -d Ubuntu-26.04 -- bash -lc 'cd /mnt/d/work/project/trade && scripts/dev-sync.sh shell'

始终在线 · 两服务(dev + postgres):整栈现在由 dev 容器(trade-dev-1)与 postgres 服务(trade-postgres-1)组成,使用镜像 trade_agent_img 与 postgres:16 及命名卷。 入口脚本 docker/entrypoint.sh 在同一 dev 容器内常驻拉起 backend(8181 → http://127.0.0.1:8181)与 frontend(5173 → http://127.0.0.1:5173),**这两个端口都发布在 dev 容器上**;postgres 提供 LangGraph checkpointer 后端,宿主端口 5433(数据卷 trade-pgdata),凭据来自仓库根 gitignored .env,dev 经 depends_on: service_healthy 等待其健康后就绪。 日常:宿主编辑 → scripts/dev-sync.sh sync → 浏览器直接看(单向:宿主 → 容器);只想起工具箱(不起服务器)用 SERVICES=0 docker compose up -d。

自动恢复:WSL 发行版由用户自行启动;/etc/wsl.conf 的 systemd=true 会让 dockerd 随发行版启动(docker.service 已 enabled),因此带 restart: unless-stopped 的容器会在 dockerd / 发行版重启后自动恢复——本环境不注册任何 Windows 计划任务 / 自启项。

scripts/dev-sync.sh 另提供 sync / up / shell / down / logs / backend / frontend / test-backend / test-frontend / test-e2e / hub-e2e / doctor 子命令(backend / frontend 现在只跟随常驻服务日志,不会另起进程抢端口;test-e2e 在容器内跑 Playwright E2E, 用空闲端口另起 vite + 后端,不与常驻服务冲突)。完整说明(单容器始终在线栈、入口脚本等待/自愈行为、 SERVICES=0 工具箱模式、自启链、同步语义、.git 双工作副本注意事项、backend/data 与 backend/.env、命名卷、镜像来源)见 docs/docker-dev.md。

PostgreSQL checkpointer(Phase 2 基础):两张 LangGraph 图共用 postgres 服务的同步 PostgresSaver(按 thread_id 隔离,worker 唯一写者)。旧 backend/data/agent/checkpoints.sqlite 为 legacy(不再写入、保留可审计),用一次性脚本迁移(幂等、支持 --dry-run):

docker compose exec dev bash -lc \
  'cd /workspace/backend && .venv/bin/python scripts/migrate_checkpoints_sqlite_to_pg.py'

⚠️ docker compose down -v 会删除 trade-workspace 卷,等于销毁整个工作副本——请只用 docker compose down。

环境限制(详见文档):本环境 docker.io 不可达,基础镜像经镜像源 (docker.m.daocloud.io)拉取并 retag 为 python:3.12-slim-bookworm;容器内的 git 与宿主 git 是两份独立工作副本,git 写操作请在 Windows 宿主完成。

环境变量

后端配置前缀为 MD_(backend/.env 加载),全部可选:

变量 默认值 说明
BB_API_KEY 空 BlockBeats 新闻/数据 API Key(缺失时快讯接口降级)
BITGET_API_KEY / SECRET / PASSPHRASE 空 预留,公开行情无需
MD_DATA_DIR ./data 数据根目录;live 数据在 PostgreSQL,此目录只放 legacy 文件(Parquet / Excel / 旧 JSON 缓存)
MD_POSTGRES_DSN postgresql://trade@postgres:5432/trade 唯一持久层的 PostgreSQL 连接串(K 线 / 告警 / 图表配置 / 事件 / BlockBeats 缓存 / 智能体投影 / LangGraph checkpointer);compose 从仓库根 .env 注入(宿主进程改用 localhost:5433)
MD_SYMBOLS BTCUSDT,ETHUSDT,SOLUSDT 默认抓取标的
MD_TIMEFRAMES 1m,5m,…,1d 默认周期
MD_CATEGORY USDT-FUTURES 默认产品线
MD_CATEGORIES SPOT,USDT-FUTURES 交易所行情中枢覆盖的产品线列表
MD_SCHEDULE_INTERVAL_SECONDS 300 定时增量拉取周期
MD_MCP_COMMAND / MD_MCP_ARGS npx / @bitget-ai/bitget-agent-mcp Bitget MCP 启动命令
MD_CANDLE_PAGE_LIMIT 100 单请求 K 线页大小
MD_REST_CANDLE_PAGE_LIMIT 500 REST v2 深回填页大小
MD_V3_CANDLE_PAGE_LIMIT 100 REST v3 深回填页大小
MD_BACKFILL_PAGE_DELAY 0.05 深回填页间节流延时(秒)
MD_NEWS_POLL_SECONDS 60 全球快讯轮询周期
MD_NEWS_BUFFER_SIZE 500 快讯环形缓冲条数
MD_WS_PUBLIC_URL Bitget 官方 公共 WebSocket 地址
MD_WS_HEARTBEAT_SECONDS 30 WS 心跳间隔
MD_WS_RECONNECT_SECONDS 5 WS 断线重连间隔
MD_BLOCKBEATS_REFRESH_HOUR / MD_BLOCKBEATS_REFRESH_MINUTE 12 / 0 BlockBeats 数据缓存每日刷新时刻
MD_LOG_LEVEL INFO 日志级别

测试

项目采用三层测试金字塔(全部可本地运行,online 子集需外网):

层 命令 覆盖
L1 数据完整性 cd backend && python -m pytest -m integrity PostgreSQL candles 全序列质量(单调性 / OHLC / 缺口白名单;需已导入的测试库,无 Postgres 时跳过)
L2 实时 API/WS cd backend && python -m pytest -m live --run-live 真实 uvicorn 进程的 REST + WS 全通道
L3 浏览器旅程 cd frontend && npm run test:e2e Playwright 用户旅程(自动起 vite + 后端)

单元回归:

cd backend && python -m pytest -q
cd frontend && npm run test && npm run typecheck

标记说明:--run-online 启用需外网的 online 用例(缺省跳过);--run-live 启动真实 uvicorn 进程运行 L2 子集(缺省不选中,pytest -q 保持快速全绿); 服务启动超时可用环境变量 MD_TEST_SERVER_START_TIMEOUT(默认 180s)调整。

质量门禁

CI(.github/workflows/ci.yml)在 push / PR 时执行:后端 ruff + 单元回归 + L1 (+ L2 独立 job)、前端 Biome + typecheck + 单测 + 覆盖率。online 外网用例 保持 skip,不在 CI 中启用;Playwright E2E 需安装浏览器,暂不纳入 CI。

本地等价命令:

# 后端:静态检查 + 格式化检查 + 覆盖率
cd backend && ruff check . && ruff format --check .
ruff check --fix . && ruff format .          # 自动修复 / 格式化
python -m pytest -q --cov=market_data --cov-report=term-missing

# 前端:静态检查 + 格式化检查 + 覆盖率
cd frontend && npm run lint && npm run format:check && npm run typecheck
npm run format                               # 自动格式化
npm run test:coverage

覆盖率采取只升不降的棘轮策略:初次启用时的实测基线,阈值取不超过基线的值, 后续变更只允许上调。

端 工具 初始基线 门禁阈值
后端 pytest-cov(--cov=market_data) 81% fail_under = 80
前端 @vitest/coverage-v8(src/**) 55.69% lines / statements lines = 55、statements = 55

提交前可用 pre-commit 在本地复现同一套检查:

pip install pre-commit && pre-commit install && pre-commit run --all-files

项目结构

├── backend/
│   └── src/market_data/
│       ├── webapi.py            # FastAPI 路由(REST / WS / SSE)
│       ├── realtime.py          # Bitget 公共 WebSocket 实时行情
│       ├── streamhub.py         # WS 订阅路由与推送
│       ├── ingestion.py         # MCP / REST 历史抓取与回填
│       ├── mcp_client.py        # Bitget Agent MCP 客户端
│       ├── store.py / scheduler.py        # PostgreSQL K 线存储 / 增量持久化调度
│       ├── indicators.py / levels.py      # 技术指标 / 支撑阻力
│       ├── smc.py / structure.py          # 市场结构与流动性位
│       ├── newsfeed.py / news_broker.py   # 全球快讯(AKShare → SSE)
│       ├── blockbeats.py / blockbeats_cache.py # BlockBeats 快讯/数据 + 每日本地缓存
│       ├── chartstore.py / alertstore.py  # 图表配置 / 告警存储
│       └── cli.py               # market-data 命令行
├── frontend/
│   └── src/
│       ├── components/views/    # 页面视图(SuperCharts/Markets/Screener/Heatmaps/Community/News…)
│       ├── components/bottom/   # 底部停靠栏(筛选器 / 文本备注)
│       ├── lib/                 # 数据层与工具(globalNews/useMasonry…)
│       ├── api/client.ts        # REST 客户端
│       ├── hooks/ types/ utils/ data/
│       └── vendor/klinecharts-pro
├── openspec/                    # OpenSpec 规格驱动的开发文档(specs + 归档)
├── agent_hub-main/              # 参考项目(MIT,非本仓库主体)
├── LICENSE                      # GNU GPL v3
└── README.md

主要 API

行情

  • GET /health、GET /candles、GET /candles/recent、POST /candles/backfill
  • GET /analyze、GET /levels、GET /structure
  • GET /tickers、GET /books/{symbol}、GET /books/{category}/{symbol}、GET /trades/{symbol}、GET /trades/{category}/{symbol}、GET /funding、GET /mark-price、GET /instruments
  • WS /ws:candle / ticker / books / trade / mark-price / funding-time 订阅推送

新闻

  • GET /news/categories、GET /news/history?offset=&limit=&category=
  • GET /news/stream(SSE:快照 → 实时条目 → 心跳)
  • GET /news/context?hours=&category=、GET /news/health
  • GET /blockbeats/newsflash/{type}、GET /blockbeats/data/{endpoint}、POST /blockbeats/data/refresh

其他

  • GET/PUT /chart-config、GET/POST/PUT/DELETE /alerts

数据与新闻源

数据 来源 说明
K 线历史 Bitget(MCP / REST v2 / v3) 深度历史回填,PostgreSQL 存储
实时行情 Bitget 公共 WebSocket K 线 / 盘口 / Ticker,无需鉴权
全球财经快讯 AKShare(东财 / 新浪 / 同花顺 / 财联社) 7×24 快讯,SSE 推送,主题分类,免费无 Key
加密新闻 BlockBeats API 快讯 / 数据,需 BB_API_KEY

开发与贡献

  • 本仓库使用 OpenSpec 规格驱动开发:功能先写 openspec/changes/<change>/(proposal → design → specs → tasks),实现后归档合并到 openspec/specs/。
  • 提交前请通过三层测试回归(见测试)。
  • 欢迎 Issue 与 PR。建议先讨论设计再提交代码。

许可证

本项目以 GNU General Public License v3.0(GPL-3.0)开源,完整文本见 LICENSE。

  • 你可以自由使用、修改与再分发本软件(含商用),但任何基于本项目的衍生作品必须同样以 GPL-3.0 授权并开放源代码。
  • 本软件按“现状”提供,不附带任何担保(详见 LICENSE 第 15–17 条)。
  • 仓库内的 agent_hub-main/ 为引入的参考项目,采用 MIT License(Copyright (c) 2025 Bitget),不受本仓库 GPL-3.0 约束。

仅供学习研究使用。加密货币市场风险极高,本项目不构成投资建议。

About

Trade-Agent 是一个面向加密货币市场的AI Agent的自动化交易所,支持自定义数据训练和量化交易,AI Agent自动化交易。支持交易策略执行、数据处理与智能分析,适用于量化交易、自动化工作流以及 AI 驱动的金融应用开发。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages