arbitrage-engine/docs/API_CONTRACTS.md

1365 lines
30 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.

# Arbitrage Engine API Contracts前端使用接口契约
> 本文从“前端页面需要什么数据”的角度,描述各接口的请求参数和响应结构。
> 后端实现细节和数据库字段说明仍以 `docs/arbitrage-engine-full-spec.md` 为准;如有冲突,以 full-spec 为权威。
约定:
- 所有接口路径均以 `/api` 开头;
- 响应示例使用 TypeScript 风格的类型定义 + 简单字段说明;
- 未特别说明时时间戳字段单位为毫秒ms
---
## 1. 首页 `/` 仪表盘相关接口
### 1.1 GET /api/rates
用途:
首页顶部两张资金费率卡片BTC/ETH的数据源用于展示当前资金费率、标记价格、指数价格等。
请求:
- Method: `GET`
- Query: 无
响应示例:
```ts
type RatesResponse = {
BTC: {
symbol: "BTCUSDT";
markPrice: number; // 标记价格
indexPrice: number; // 指数价格
lastFundingRate: number; // 最新资金费率0.0001 = 0.01%
nextFundingTime: number; // 下次资金费率结算时间(毫秒时间戳)
timestamp: number; // 当前数据时间(毫秒时间戳)
};
ETH: {
symbol: "ETHUSDT";
markPrice: number;
indexPrice: number;
lastFundingRate: number;
nextFundingTime: number;
timestamp: number;
};
};
```
被使用位置:
- 首页 `/``RateCard` 组件。
### 1.2 GET /api/stats
用途:
首页中部三张“套利统计”卡片BTC 套利 / ETH 套利 / 50/50 组合)的数据源。
请求:
- Method: `GET`
- Query: 无
响应示例:
```ts
type StatsResponse = {
BTC: {
mean7d: number; // 过去7天平均日收益率例如 0.0005 = 0.05%/d
annualized: number; // 折算年化收益率(百分数,例如 12.34
};
ETH: {
mean7d: number;
annualized: number;
};
combo: {
mean7d: number;
annualized: number;
};
};
```
被使用位置:
- 首页 `/`:三张 `StatsCard`
### 1.3 GET /api/history
用途:
首页的“历史费率走势过去7天”折线图以及“历史费率明细最近30条”表格。
请求:
- Method: `GET`
- Query: 可选full-spec 中定义),前端通常使用默认 7 天窗口。
响应示例(简化版):
```ts
type HistoryPoint = {
fundingTime: number; // 资金费率结算时间(秒或毫秒时间戳,详见实现)
fundingRate: number; // 当前时间点资金费率小数0.0001 = 0.01%
timestamp: string; // ISO8601 时间字符串,例如 "2026-03-10T15:00:00Z"
};
type HistoryResponse = {
BTC: HistoryPoint[];
ETH: HistoryPoint[];
};
```
被使用位置:
- 首页 `/`
- 将 BTC/ETH 的 `fundingRate` 转成百分比,绘制 7 天折线图;
- 截取最近 30 条记录,填充历史明细表(时间 + BTC% + ETH%)。
### 1.4 GET /api/signals/history
用途:
首页右下角“信号历史”表格,用于展示最近触发的套利机会(满足一定年化阈值)。
请求:
- Method: `GET`
- Query: 可选,例如 `limit`,具体见 full-spec。
响应示例:
```ts
type SignalHistoryItem = {
id: number;
symbol: string; // 币种简称,如 "BTC" / "ETH"
rate: number; // 当时资金费率(小数)
annualized: number; // 触发时对应的年化收益率(百分数)
sent_at: string; // 发送时间ISO8601 字符串)
message: string; // 文本说明,用于展示/推送
};
type SignalsHistoryResponse = {
items: SignalHistoryItem[];
};
```
被使用位置:
- 首页 `/`:信号历史表,显示时间 / 币种 / 年化。
### 1.5 GET /api/stats/ytd
用途:
`RateCard` 等组件提供 YTD年初至今统计用于资金费率卡片上的补充信息。
请求:
- Method: `GET`
- Query: 无
响应示例(示意):
```ts
type YtdStats = {
mean: number; // 年初至今平均日收益率
annualized: number; // 折算年化
days: number; // 统计天数
};
type YtdStatsResponse = {
BTC: YtdStats;
ETH: YtdStats;
};
```
被使用位置:
- 首页 `/``RateCard` 内部展示 YTD 指标。
### 1.6 GET /api/kline
用途:
首页 K 线卡片,用于绘制资金费率 K 线和标记价格 K 线。
请求:
- Method: `GET`
- Query
```ts
{
symbol: "BTC" | "ETH"; // 前端传 BTC/ETH无 USDT
interval: string; // "1m" | "5m" | "30m" | "1h" | "4h" | "8h" | "1d" | "1w" | "1M"
limit?: number; // 可选K 线数量
}
```
响应示例:
```ts
type KBar = {
time: number; // K 线起始时间(秒级时间戳或 ms前端按 full-spec 与实现处理)
open: number;
high: number;
low: number;
close: number;
price_open: number; // 标记价格的 OHLC
price_high: number;
price_low: number;
price_close: number;
};
type KlineResponse = {
symbol: string; // "BTC"
interval: string; // 请求时的 interval
count: number; // 实际返回的 bar 数量
data: KBar[];
};
```
被使用位置:
- 首页 `/``MiniKChart` 组件两次使用:
- mode="rate":使用 `open/high/low/close` 作为资金费率蜡烛;
- mode="price":使用 `price_*` 作为价格蜡烛。
---
## 2. /trades 成交流页面接口
### 2.1 GET /api/trades/latest
用途:
`/trades` 页面左侧“实时成交”表格的数据源,拉取最近若干条逐笔成交。
请求:
- Method: `GET`
- Query
```ts
{
symbol: "BTC" | "ETH" | "XRP" | "SOL"; // 币种简称
limit?: number; // 返回条数,默认 20
}
```
响应示例:
```ts
type LatestTradesResponse = {
data: Array<{
agg_id: number; // Binance aggTrade ID
price: number; // 成交价格
qty: number; // 成交量(合约单位)
time_ms: number; // 成交时间(毫秒)
is_buyer_maker: 0 | 1; // 0=主动买(多方), 1=主动卖(空方)
}>;
};
```
被使用位置:
- `/trades``LiveTrades` 组件。
### 2.2 GET /api/trades/summary
用途:
`/trades` 页面右侧“成交流分析”图表的数据源,按时间窗口聚合买/卖量、Delta、VWAP 等信息。
请求:
- Method: `GET`
- Query
```ts
{
symbol: "BTC" | "ETH" | "XRP" | "SOL";
start_ms: number; // 统计窗口起始时间(毫秒)
end_ms: number; // 统计窗口结束时间(毫秒)
interval: "1m" | "5m" | "15m" | "1h"; // 聚合粒度
}
```
响应示例:
```ts
type TradeSummaryBar = {
time_ms: number; // 时间段起始时间(毫秒)
buy_vol: number; // 该段主动买入量
sell_vol: number; // 该段主动卖出量
delta: number; // buy_vol - sell_vol
total_vol: number; // 总成交量
trade_count: number;// 成交笔数
vwap: number; // 成交量加权平均价
max_qty: number; // 单笔最大成交量
};
type TradeSummaryResponse = {
data: TradeSummaryBar[];
};
```
被使用位置:
- `/trades``FlowAnalysis` 组件,绘制 Delta + 价格双轴图和“主动买 vs 主动卖”面积图,并算总买卖量、买方占比等摘要。
---
## 3. /live 实盘交易页面接口
> 本节仅列出被 `/live` 页面使用的接口,详细业务规则参考 full-spec。
### 3.1 GET /api/live/risk-status
用途:
L0 风险条和 L6 风控状态,用于展示日内 R 使用情况、熔断状态、规则是否触发等。
请求:
- Method: `GET`
- Query: 无
响应字段示意:
```ts
type LiveRiskStatus = {
status: "normal" | "warning" | "circuit_break" | string; // 当前风险状态
today_realized_r: number; // 今日已实现收益R
today_unrealized_r: number; // 今日未实现收益R
today_total_r: number; // 今日总 R含未实现
consecutive_losses: number; // 连续亏损笔数
block_new_entries: boolean; // 是否禁止新开仓
reduce_only: boolean; // 是否只减仓
circuit_break_reason?: string | null; // 熔断原因(如有)
auto_resume_time?: number | null; // 预计自动恢复时间(秒或毫秒时间戳,详见实现)
};
```
被使用位置:
- `/live``L0_RiskBar`、`L6_RiskStatus`。
### 3.2 GET /api/live/reconciliation
用途:
对账与清算距离计算,确保本地持仓与交易所真实持仓一致。
请求:
- Method: `GET`
响应字段示意:
```ts
type ReconPositionLocal = {
id: number;
symbol: string; // 如 "BTCUSDT"
direction: "LONG"|"SHORT";
entry_price: number;
};
type ReconPositionExchange = {
symbol: string;
direction: "LONG"|"SHORT";
amount: number;
mark_price: number;
liquidation_price: number;
};
type ReconDiff = {
symbol: string;
severity: "warn" | "critical" | string;
detail: string;
};
type ReconciliationStatus = {
status: "ok" | "mismatch" | string;
local_positions: ReconPositionLocal[];
exchange_positions: ReconPositionExchange[];
local_orders: number;
exchange_orders: number;
diffs: ReconDiff[];
};
```
被使用位置:
- `/live``L0_RiskBar`(对账状态)、`L3_Positions`(清算距离)、`L5_Reconciliation`。
### 3.3 GET /api/live/account
用途:
实盘账户整体情况,包括权益、保证金使用、今日 PnL 等。
请求:
- Method: `GET`
响应字段示意:
```ts
type LiveAccount = {
equity: number; // 总账户权益
available_margin: number; // 可用保证金
used_margin: number; // 已用保证金
effective_leverage: number; // 有效杠杆
today_realized_r: number;
today_realized_usdt: number;
// 其它字段按实现扩展
};
```
被使用位置:
- `/live``L0_RiskBar`、`L2_AccountOverview`。
### 3.4 GET /api/live/config
用途:
读取实盘配置,用于 L1.5 实盘配置面板与 L3 用于计算 1R 对应 USD。
请求:
- Method: `GET`
响应示例:
```ts
type LiveConfigField = {
label: string; // 展示名,如 "每笔风险(USDT)"
value: string; // 配置值,统一为字符串表示
};
type LiveConfigResponse = {
risk_per_trade_usd: LiveConfigField; // 每笔风险金额
initial_capital: LiveConfigField;
risk_pct: LiveConfigField;
max_positions: LiveConfigField;
leverage: LiveConfigField;
enabled_strategies: LiveConfigField;
trade_env: LiveConfigField;
};
```
被使用位置:
- `/live``L15_LiveConfig`、`L3_Positions`(读取 risk_per_trade_usd
### 3.5 PUT /api/live/config
用途:
更新实盘配置,来自 L1.5 配置面板的保存操作。
请求:
- Method: `PUT`
- BodyJSON
```ts
type LiveConfigUpdate = {
risk_per_trade_usd?: string;
initial_capital?: string;
risk_pct?: string;
max_positions?: string;
leverage?: string;
enabled_strategies?: string;
trade_env?: string;
};
```
响应:
- 通常返回更新后的配置或简单的 `{ ok: true }`,以实际实现为准。
被使用位置:
- `/live``L15_LiveConfig`。
### 3.6 实盘控制操作接口
用途:
L1 一键止血面板使用的控制接口。
#### POST /api/live/emergency-close
- 功能:立即平掉所有实盘持仓;
- 请求:无 body
- 响应:包含执行结果信息,例如:
```ts
{ ok: boolean; message?: string; error?: string }
```
#### POST /api/live/block-new
- 功能:阻止新开仓(维持只减仓模式);
- 请求/响应结构同上。
#### POST /api/live/resume
- 功能:恢复正常交易(允许新开仓);
- 请求/响应结构同上。
被使用位置:
- `/live``L1_EmergencyPanel`。
### 3.7 其他 /live 页面接口
下面补充 `/live` 页面中其他接口的前端契约(只列出前端实际使用到的字段)。
#### 3.7.1 GET /api/live/summary?strategy=
用途:
L2 账户概览中策略层面的汇总统计(总净 R、总净 USDT、费用、资金费率贡献、胜率等
请求:
- Method: `GET`
- Query
```ts
{
strategy: string; // 策略标识,例如 "v52_8signals" 或某个 strategy_id 映射
}
```
响应示例(仅包含前端用到字段):
```ts
type LiveSummary = {
total_pnl_r: number; // 总净 R含历史所有平仓
total_pnl_usdt: number; // 总净 USDT
total_fee_usdt: number; // 手续费总额USDT
total_funding_usdt: number; // 资金费率贡献USDT可为正/负)
win_rate: number; // 胜率(百分数)
profit_factor: number; // 盈亏比Gross 赢 / Gross 亏)
// 可以包含更多分解字段(按 symbol、按方向等前端当前未使用
};
```
被使用位置:
- `/live``L2_AccountOverview`。
#### 3.7.2 GET /api/live/positions?strategy=
用途:
L3 当前持仓列表用于展示实盘持仓、TP/SL、水位、执行质量指标等。
请求:
- Method: `GET`
- Query
```ts
{
strategy: string; // 当前关注策略,如 "v52_8signals"
}
```
响应示例(前端用到字段):
```ts
type LivePosition = {
id: number;
symbol: string; // 如 "BTCUSDT"
direction: "LONG"|"SHORT";
tier: "light"|"standard"|"heavy";
entry_price: number;
fill_price?: number | null;
current_price?: number | null;
entry_ts: number; // 入场时间(毫秒)
hold_time_min?: number; // 持仓分钟数(可选,前端如不存在则按 now-entry_ts 计算)
score: number; // 开仓评分
risk_distance: number; // 1R 对应的价格距离
tp1_price: number;
tp2_price: number;
sl_price: number;
tp1_hit: boolean;
// 执行质量指标(以 R 或 ms 为单位)
slippage_bps?: number; // 滑点(基点)
protection_gap_ms?: number; // 裸奔时间(毫秒)
signal_to_order_ms?: number; // 信号触发到下单的延迟
order_to_fill_ms?: number; // 下单到成交的延迟
binance_order_id?: string | null;
};
type LivePositionsResponse = {
data: LivePosition[];
};
```
被使用位置:
- `/live``L3_Positions`。
#### 3.7.3 GET /api/live/execution-quality
用途:
L4 执行质量面板,总体和按币种统计滑点、延迟、裸奔时间。
请求:
- Method: `GET`
- Query: 无
响应示例(简化为前端用到字段):
```ts
type MetricStats = {
avg: number;
p50: number;
p95: number;
};
type ExecutionQualityResponse = {
total_trades: number;
overall: {
slippage_bps: MetricStats;
signal_to_order_ms: MetricStats;
order_to_fill_ms: MetricStats;
protection_gap_ms: MetricStats;
};
by_symbol?: Record<string, {
count: number;
slippage_bps?: MetricStats;
protection_gap_ms?: MetricStats;
}>;
error?: string; // 如存在错误则 overall/by_symbol 可能为空
};
```
被使用位置:
- `/live``L4_ExecutionQuality`。
#### 3.7.4 GET /api/live/events?limit=&level=
用途:
L7 实时事件流,用于查看交易、风险、系统、对账等事件日志。
请求:
- Method: `GET`
- Query
```ts
{
limit?: number; // 默认约 30
level?: "all"|"critical"|"warn"|"info";
}
```
响应示例:
```ts
type LiveEvent = {
id: number;
ts: number | string; // 事件时间(秒/毫秒时间戳或 ISO 字符串)
level: "info"|"warn"|"error"|"critical"|string;
category?: "trade"|"risk"|"system"|"reconciliation"|string;
symbol?: string | null; // 如 "BTCUSDT"
message: string;
};
type LiveEventsResponse = {
data: LiveEvent[];
};
```
被使用位置:
- `/live``L7_EventStream`。
#### 3.7.5 GET /api/live/paper-comparison?limit=
用途:
L8 实盘 vs 模拟盘对比,比较同一信号在实盘与模拟盘的入场/收益差异。
请求:
- Method: `GET`
- Query
```ts
{
limit?: number; // 默认约 20
}
```
响应示例:
```ts
type PaperComparisonRow = {
symbol: string; // 如 "BTCUSDT"
direction: "LONG"|"SHORT";
live_entry?: number | null; // 实盘入场价
paper_entry?: number | null; // 模拟盘入场价
entry_diff_bps?: number | null; // 入场价差(基点)
live_pnl?: number | null; // 实盘 R 或 USDT前端仅格式化
paper_pnl?: number | null; // 模拟盘 R 或 USDT
pnl_diff_r?: number | null; // 实盘 vs 模拟盘的 R 差
};
type PaperComparisonResponse = {
avg_pnl_diff_r: number; // 平均 R 差
data: PaperComparisonRow[];
};
```
被使用位置:
- `/live``L8_PaperComparison`。
#### 3.7.6 GET /api/live/equity-curve?strategy=
用途:
L9 权益曲线 + 回撤图,按时间展示累计 R 和回撤。
请求:
- Method: `GET`
- Query
```ts
{
strategy: string; // 如 "v52_8signals" 或相关策略 ID 映射
}
```
响应示例:
```ts
type EquityPoint = {
ts: number; // 时间戳(毫秒),前端按北京时间格式化展示
pnl: number; // 截至当前的累计 R
};
type EquityCurveResponse = {
data: EquityPoint[];
};
```
前端会基于 `pnl` 计算回撤 `dd` 字段,并绘制两条 area 曲线累计PnL 和 回撤),因此响应中无需直接提供回撤值。
被使用位置:
- `/live``L9_EquityCurve`。
#### 3.7.7 GET /api/live/trades?symbol=&result=&strategy=&limit=
用途:
L10 历史交易表,用于按币种和结果(盈/亏)筛选实盘历史交易。
请求:
- Method: `GET`
- Query
```ts
{
symbol?: "all"|"BTC"|"ETH"|"XRP"|"SOL";
result?: "all"|"win"|"loss";
strategy: string; // 当前策略标识,如 "v52_8signals"
limit?: number; // 默认约 50
}
```
响应示例(前端用到字段):
```ts
type LiveTrade = {
id: number;
symbol: string; // 如 "BTCUSDT"
direction: "LONG"|"SHORT";
entry_price: number;
exit_price?: number | null;
entry_ts: number; // 入场时间(毫秒)
exit_ts?: number | null; // 出场时间(毫秒)
gross_pnl_r?: number; // 毛收益 R
fee_r?: number; // 手续费 R
funding_r?: number; // 资金费率 R
slippage_r?: number; // 滑点 R
net_pnl_r?: number; // 净 R优先使用
pnl_r?: number; // 兼容字段net_pnl_r 不存在时退回使用
status: string; // "tp" | "sl" | "sl_be" | 其他(前端映射为 止盈/止损/保本/原样展示)
};
type LiveTradesResponse = {
data: LiveTrade[];
};
```
被使用位置:
- `/live``L10_TradeHistory`。
#### 3.7.8 GET /api/live/health
用途:
L11 系统健康,用于展示运行进程状态和数据新鲜度(行情等)。
请求:
- Method: `GET`
响应示例(前端使用到字段):
```ts
type LiveHealthResponse = {
processes?: Record<string, {
status: string; // "online" / "stopped"
memory_mb: number;
restarts: number;
// 可包含更多信息CPU 前端当前未使用
}>;
data_freshness?: {
market_data?: {
age_sec: number; // 距离最新行情数据的秒数
status: "green"|"yellow"|"red"|string; // 绿=正常, 黄/红=延迟或异常
};
// 其它数据源可在此扩展
};
};
```
被使用位置:
- `/live``L11_SystemHealth`。
---
## 4. /strategy-plaza 策略广场接口
### 4.1 GET /api/strategies
用途:
`/strategy-plaza` 页面策略卡片列表的数据源;账号/其他页面也可使用该接口获取策略列表。
请求:
- Method: `GET`
- Query
```ts
{
include_deprecated?: "true" | "false"; // 为 "true" 时包含废弃策略
}
```
响应示例(部分字段):
```ts
type StrategyItem = {
strategy_id: string; // UUID
display_name: string; // 展示名
symbol: string; // 交易对,如 "BTCUSDT"
status: "running" | "paused" | "deprecated" | "error";
started_at: number; // 启动时间(毫秒)
initial_balance: number;
current_balance: number;
net_usdt: number; // 累计盈亏USDT
net_r: number; // 累计 R
trade_count: number;
win_rate: number; // 胜率(百分数)
avg_win_r: number;
avg_loss_r: number;
open_positions: number;
pnl_usdt_24h: number; // 24 小时净收益USDT
pnl_r_24h: number; // 24 小时净 R
std_r: number; // 收益波动(标准差),如有
last_trade_at: number | null; // 最近一笔交易时间(毫秒)
};
type StrategiesResponse = {
strategies: StrategyItem[];
};
```
被使用位置:
- `/strategy-plaza`:展示 running/paused 策略卡片;
- `/strategy-plaza/deprecated`:配合过滤,仅展示 `status="deprecated"`
### 4.2 POST /api/strategies/{sid}/add-balance
用途:
为指定策略追加模拟资金,调整初始余额与当前余额。
请求:
- Method: `POST`
- Path 参数:
```ts
{ sid: string } // strategy_id
```
- BodyJSON
```ts
{ amount: number } // 追加金额USDT
```
响应:
- 典型形式:`{ ok: true }` 或返回更新后的策略;具体以实现为准。
被使用位置:
- `/strategy-plaza``AddBalanceModal`。
### 4.3 POST /api/strategies/{sid}/deprecate
用途:
将策略状态标记为 `deprecated`,停止其运行但保留所有历史数据。
请求:
- Method: `POST`
- BodyJSON
```ts
{ confirm: true }
```
响应:
- 通常为 `{ ok: true }`;错误时返回错误说明。
被使用位置:
- `/strategy-plaza`:卡片右侧垃圾桶按钮,带浏览器 confirm。
### 4.4 POST /api/strategies/{sid}/restore
用途:
恢复废弃策略到运行状态(`status=running`),继续使用原有余额与历史记录。
请求:
- Method: `POST`
响应:
- 类似 `{ ok: true }`
被使用位置:
- `/strategy-plaza/deprecated`:每张废弃策略卡片底部的“重新启用”按钮。
> 单策略详情、策略创建/编辑等接口(`/api/strategies/{sid}`、`/api/strategies` POST/PATCH 等)主要被 `/strategy-plaza/[id]` 和 `/strategy-plaza/create` 等页面使用,可在需要时进一步补充契约说明。
---
## 5. /server 服务器监控接口
### 5.1 GET /api/server/status
用途:
`/server` 页面提供服务器与 PM2/数据库状态。
请求:
- Method: `GET`
响应示意:
```ts
type ServerStatus = {
timestamp: number; // 采集时间(毫秒)
cpu: {
percent: number;
cores: number;
};
memory: {
total_gb: number;
used_gb: number;
percent: number;
swap_percent: number;
};
disk: {
total_gb: number;
used_gb: number;
free_gb: number;
percent: number;
};
load: {
load1: number;
load5: number;
load15: number;
};
uptime_hours: number;
network: {
bytes_sent_gb: number;
bytes_recv_gb: number;
};
pm2: Array<{
name: string;
status: string; // "online" 等
cpu: number; // CPU 使用率
memory_mb: number; // 内存 MB
restarts: number;
uptime_ms: number;
pid: number;
}>;
postgres: {
db_size_mb: number;
agg_trades_count: number;
rate_snapshots_count: number;
symbols: Record<string, {
latest_ms: number;
earliest_ms: number;
span_hours: number;
}>;
};
backfill_running: boolean;
};
```
被使用位置:
- `/server`系统概览卡片、PM2 进程表、PostgreSQL 概览和回补状态。
---
## 6. 认证与账号接口
### 6.1 POST /api/auth/login
用途:
用户登录,获取 JWT 并在前端存储。
请求:
- Method: `POST`
- Body
```ts
{ email: string; password: string }
```
响应:
- 一般形式:`{ access_token: string, token_type: "bearer", user: {...} }`;具体字段以 full-spec 与 auth 模块实现为准。
被使用位置:
- `/login`:通过 `useAuth().login()` 封装调用。
### 6.2 POST /api/auth/register
用途:
邀请码注册新账号。
请求:
- Method: `POST`
- Body
```ts
{ email: string; password: string; invite_code: string }
```
响应:
- 一般为新用户信息 + token 或简单成功标记,具体以实现为准。
被使用位置:
- `/register`:通过 `useAuth().register()` 封装调用。
### 6.3 GET /api/auth/me
用途:
获取当前登录用户信息和订阅状态。
请求:
- Method: `GET`
- 需带 Authorization: Bearer token
响应示意:
```ts
type AuthMeResponse = {
id: number;
email: string;
discord_id: string | null;
subscription?: {
tier: string; // "free" | "pro" | "premium" ...
expires_at: string | null; // ISO 时间字符串
};
};
```
被使用位置:
- `/dashboard`"我的账户" 页面。
### 6.4 POST /api/user/bind-discord
用途:
绑定或更新当前用户的 Discord 用户 ID。
请求:
- Method: `POST`
- Body
```ts
{ discord_id: string }
```
响应:
- 成功:`{ ok: true, ... }` 或包含简单 message
- 失败:返回带有 `detail` 字段的错误响应,前端直接展示。
被使用位置:
- `/dashboard`Discord 信号推送卡片的“绑定”按钮。
---
## 7. /signals 信号接口
> 这些接口为 `/signals`、`/signals-v52`、`/signals-v53` 等信号页面,以及 `/paper` 中的“最新信号”区域提供数据。
### 7.1 GET /api/signals/latest?strategy=
用途:
返回指定策略下各币种BTC/ETH/XRP/SOL的最新指标快照与评分结果用于信号页顶部“实时指标卡片”。
请求:
- Method: `GET`
- Query
```ts
{
strategy: string; // 如 "v51_baseline" | "v52_8signals" | "v53" 等
}
```
响应示例(基础字段 + 可选 factors
```ts
type SignalTier = "light" | "standard" | "heavy";
type LayerInfo = {
score?: number;
max?: number;
// 各版本策略可能包含额外字段,如 cvd_resonance/p99_flow 等
[key: string]: unknown;
};
type LatestIndicatorFactors = {
// 通用层
direction?: LayerInfo & { cvd_resonance?: number; p99_flow?: number; accel_bonus?: number };
crowding?: LayerInfo & { lsr_contrarian?: number; top_trader_position?: number };
environment?: LayerInfo;
confirmation?: LayerInfo;
auxiliary?: LayerInfo & { coinbase_premium?: number };
// V5.2 新增层
funding_rate?: LayerInfo & { value?: number };
liquidation?: LayerInfo & { long_usd?: number; short_usd?: number };
// Gate 控制相关V5.3/BTC 轨)
gate_passed?: boolean;
block_reason?: string | null; // BTC 轨使用
gate_block?: string | null; // ALT 轨使用
// 市场结构细节
obi_raw?: number; // 订单簿不平衡
spot_perp_div?: number; // 期现价差
whale_cvd_ratio?: number;
atr_pct_price?: number; // ATR/price
alt_score_ref?: number; // 替代参考分
track?: string; // 当前轨道标记BTC/ALT
};
type LatestIndicator = {
ts: number; // 时间戳(毫秒)
cvd_fast: number; // 快 CVD例如 30m
cvd_mid: number; // 中 CVD例如 4h
cvd_day: number; // 日 CVD
cvd_fast_slope: number;
atr_5m: number;
atr_percentile: number;
vwap_30m: number;
price: number;
p95_qty: number;
p99_qty: number;
score: number; // 综合评分0~100
display_score?: number; // V5.3 BTC 轨参考分
signal: "LONG" | "SHORT" | null;
tier?: SignalTier | null; // "light" | "standard" | "heavy" 或无
gate_passed?: boolean; // V5.3 顶层 gate 结果
factors?: LatestIndicatorFactors | null;
};
type LatestSignalsResponse = {
BTC?: LatestIndicator | null;
ETH?: LatestIndicator | null;
XRP?: LatestIndicator | null;
SOL?: LatestIndicator | null;
};
```
被使用位置:
- `/signals`V5.1 信号页顶部指标卡片strategy=v51_baseline
- `/signals-v52`V5.2 信号页strategy=v52_8signals
- `/signals-v53`V5.3 信号页strategy=v53
- 其它变体页fast/middle仅改变 strategy 参数。
### 7.2 GET /api/signals/indicators?symbol=&minutes=&strategy=
用途:
返回某币种在指定时间窗口内的指标时间序列,用于绘制 “CVD 三轨 + 币价” 图表。
请求:
- Method: `GET`
- Query
```ts
{
symbol: "BTC" | "ETH" | "XRP" | "SOL"; // 部分页面传 "BTCUSDT" 形式,由后端兼容
minutes: number; // 统计窗口长度(例如 60/240/720/1440
strategy?: string; // V5.3 页面会传入 strategy=v53
}
```
响应示例:
```ts
type IndicatorRow = {
ts: number; // 时间戳(毫秒)
cvd_fast: number;
cvd_mid: number;
cvd_day: number;
atr_5m: number;
vwap_30m: number;
price: number;
score: number;
signal: string | null; // "LONG"|"SHORT"|null
};
type IndicatorsResponse = {
data: IndicatorRow[];
};
```
被使用位置:
- `/signals`、`/signals-v52`、`/signals-v53`CVD+价格图。
### 7.3 GET /api/signals/market-indicators
用途:
为信号页中的“Market Indicators”卡片提供多空比、大户持仓、OI、Coinbase Premium 等市场指标。
请求:
- Method: `GET`
- Query: 无
响应示例(按 symbol 分组):
```ts
type MarketIndicatorValue = {
value: unknown | string; // 原始 JSON 对象或 JSON 字符串
ts: number; // 指标数据时间戳(毫秒)
};
type MarketIndicatorSet = {
long_short_ratio?: MarketIndicatorValue; // 多空比
top_trader_position?: MarketIndicatorValue; // 大户持仓
open_interest_hist?: MarketIndicatorValue; // OI 历史
coinbase_premium?: MarketIndicatorValue; // Coinbase Premium
};
type MarketIndicatorsResponse = {
BTC?: MarketIndicatorSet;
ETH?: MarketIndicatorSet;
XRP?: MarketIndicatorSet;
SOL?: MarketIndicatorSet;
};
```
前端会对 `value` 做二次解析,将其视为对象并读取:
- `long_short_ratio.value.longAccount/shortAccount`
- `top_trader_position.value.longAccount/shortAccount`
- `open_interest_hist.value.sumOpenInterestValue`
- `coinbase_premium.value.premium_pct`
被使用位置:
- `/signals`、`/signals-v52``MarketIndicatorsCards` 组件。
### 7.4 GET /api/signals/signal-history?symbol=&limit=&strategy=
用途:
为各版本信号页中的“最近信号”列表,以及 `/paper` 页的“最新信号”区提供数据。
请求:
- Method: `GET`
- Query
```ts
{
symbol: string; // 如 "BTC" | "ETH" 或 "BTCUSDT"
limit?: number; // 条数,默认约 20
strategy: string; // 如 "v51_baseline" | "v52_8signals" | "v53"
}
```
响应示例(简化):
```ts
type SignalHistoryRow = {
ts: number; // 时间戳(毫秒)
score: number; // 当时评分
signal: "LONG"|"SHORT"|string; // 方向或其他标记
factors?: LatestIndicatorFactors; // 可选:各层分数快照,用于链路说明
};
type SignalHistoryResponse = {
data: SignalHistoryRow[];
};
```
被使用位置:
- `/signals`最近信号strategy=v51_baseline
- `/signals-v52`、`/signals-v53`:对应策略最近信号;
- `/paper``LatestSignals` 组件(从各 symbol 取最新一条,显示 score + 分层 factors 摘要)。
---
## 8. /paper 模拟盘接口
> 这些接口为 `/paper`、`/paper-v52`、`/paper-v53*` 等模拟盘页面,以及部分策略详情页提供数据。