arbitrage-engine/docs/API_CONTRACTS.md

30 KiB
Raw Blame History

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: 无

响应示例:

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: 无

响应示例:

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 天窗口。

响应示例(简化版):

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。

响应示例:

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: 无

响应示例(示意):

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
{
  symbol: "BTC" | "ETH";     // 前端传 BTC/ETH无 USDT
  interval: string;          // "1m" | "5m" | "30m" | "1h" | "4h" | "8h" | "1d" | "1w" | "1M"
  limit?: number;            // 可选K 线数量
}

响应示例:

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
{
  symbol: "BTC" | "ETH" | "XRP" | "SOL";  // 币种简称
  limit?: number;                         // 返回条数,默认 20
}

响应示例:

type LatestTradesResponse = {
  data: Array<{
    agg_id: number;        // Binance aggTrade ID
    price: number;         // 成交价格
    qty: number;           // 成交量(合约单位)
    time_ms: number;       // 成交时间(毫秒)
    is_buyer_maker: 0 | 1; // 0=主动买(多方), 1=主动卖(空方)
  }>;
};

被使用位置:

  • /tradesLiveTrades 组件。

2.2 GET /api/trades/summary

用途:
/trades 页面右侧“成交流分析”图表的数据源,按时间窗口聚合买/卖量、Delta、VWAP 等信息。

请求:

  • Method: GET
  • Query
{
  symbol: "BTC" | "ETH" | "XRP" | "SOL";
  start_ms: number;       // 统计窗口起始时间(毫秒)
  end_ms: number;         // 统计窗口结束时间(毫秒)
  interval: "1m" | "5m" | "15m" | "1h";  // 聚合粒度
}

响应示例:

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[];
};

被使用位置:

  • /tradesFlowAnalysis 组件,绘制 Delta + 价格双轴图和“主动买 vs 主动卖”面积图,并算总买卖量、买方占比等摘要。

3. /live 实盘交易页面接口

本节仅列出被 /live 页面使用的接口,详细业务规则参考 full-spec。

3.1 GET /api/live/risk-status

用途:
L0 风险条和 L6 风控状态,用于展示日内 R 使用情况、熔断状态、规则是否触发等。

请求:

  • Method: GET
  • Query: 无

响应字段示意:

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;     // 预计自动恢复时间(秒或毫秒时间戳,详见实现)
};

被使用位置:

  • /liveL0_RiskBarL6_RiskStatus

3.2 GET /api/live/reconciliation

用途:
对账与清算距离计算,确保本地持仓与交易所真实持仓一致。

请求:

  • Method: GET

响应字段示意:

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[];
};

被使用位置:

  • /liveL0_RiskBar(对账状态)、L3_Positions(清算距离)、L5_Reconciliation

3.3 GET /api/live/account

用途:
实盘账户整体情况,包括权益、保证金使用、今日 PnL 等。

请求:

  • Method: GET

响应字段示意:

type LiveAccount = {
  equity: number;             // 总账户权益
  available_margin: number;   // 可用保证金
  used_margin: number;        // 已用保证金
  effective_leverage: number; // 有效杠杆
  today_realized_r: number;
  today_realized_usdt: number;
  // 其它字段按实现扩展
};

被使用位置:

  • /liveL0_RiskBarL2_AccountOverview

3.4 GET /api/live/config

用途:
读取实盘配置,用于 L1.5 实盘配置面板与 L3 用于计算 1R 对应 USD。

请求:

  • Method: GET

响应示例:

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;
};

被使用位置:

  • /liveL15_LiveConfigL3_Positions(读取 risk_per_trade_usd

3.5 PUT /api/live/config

用途:
更新实盘配置,来自 L1.5 配置面板的保存操作。

请求:

  • Method: PUT
  • BodyJSON
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 },以实际实现为准。

被使用位置:

  • /liveL15_LiveConfig

3.6 实盘控制操作接口

用途:
L1 一键止血面板使用的控制接口。

POST /api/live/emergency-close

  • 功能:立即平掉所有实盘持仓;
  • 请求:无 body
  • 响应:包含执行结果信息,例如:
{ ok: boolean; message?: string; error?: string }

POST /api/live/block-new

  • 功能:阻止新开仓(维持只减仓模式);
  • 请求/响应结构同上。

POST /api/live/resume

  • 功能:恢复正常交易(允许新开仓);
  • 请求/响应结构同上。

被使用位置:

  • /liveL1_EmergencyPanel

3.7 其他 /live 页面接口

下面补充 /live 页面中其他接口的前端契约(只列出前端实际使用到的字段)。

3.7.1 GET /api/live/summary?strategy=

用途:
L2 账户概览中策略层面的汇总统计(总净 R、总净 USDT、费用、资金费率贡献、胜率等

请求:

  • Method: GET
  • Query
{
  strategy: string; // 策略标识,例如 "v52_8signals" 或某个 strategy_id 映射
}

响应示例(仅包含前端用到字段):

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、按方向等前端当前未使用
};

被使用位置:

  • /liveL2_AccountOverview

3.7.2 GET /api/live/positions?strategy=

用途:
L3 当前持仓列表用于展示实盘持仓、TP/SL、水位、执行质量指标等。

请求:

  • Method: GET
  • Query
{
  strategy: string; // 当前关注策略,如 "v52_8signals"
}

响应示例(前端用到字段):

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[];
};

被使用位置:

  • /liveL3_Positions

3.7.3 GET /api/live/execution-quality

用途:
L4 执行质量面板,总体和按币种统计滑点、延迟、裸奔时间。

请求:

  • Method: GET
  • Query: 无

响应示例(简化为前端用到字段):

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 可能为空
};

被使用位置:

  • /liveL4_ExecutionQuality

3.7.4 GET /api/live/events?limit=&level=

用途:
L7 实时事件流,用于查看交易、风险、系统、对账等事件日志。

请求:

  • Method: GET
  • Query
{
  limit?: number;                 // 默认约 30
  level?: "all"|"critical"|"warn"|"info";
}

响应示例:

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[];
};

被使用位置:

  • /liveL7_EventStream

3.7.5 GET /api/live/paper-comparison?limit=

用途:
L8 实盘 vs 模拟盘对比,比较同一信号在实盘与模拟盘的入场/收益差异。

请求:

  • Method: GET
  • Query
{
  limit?: number; // 默认约 20
}

响应示例:

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[];
};

被使用位置:

  • /liveL8_PaperComparison

3.7.6 GET /api/live/equity-curve?strategy=

用途:
L9 权益曲线 + 回撤图,按时间展示累计 R 和回撤。

请求:

  • Method: GET
  • Query
{
  strategy: string; // 如 "v52_8signals" 或相关策略 ID 映射
}

响应示例:

type EquityPoint = {
  ts: number;   // 时间戳(毫秒),前端按北京时间格式化展示
  pnl: number;  // 截至当前的累计 R
};

type EquityCurveResponse = {
  data: EquityPoint[];
};

前端会基于 pnl 计算回撤 dd 字段,并绘制两条 area 曲线累计PnL 和 回撤),因此响应中无需直接提供回撤值。

被使用位置:

  • /liveL9_EquityCurve

3.7.7 GET /api/live/trades?symbol=&result=&strategy=&limit=

用途:
L10 历史交易表,用于按币种和结果(盈/亏)筛选实盘历史交易。

请求:

  • Method: GET
  • Query
{
  symbol?: "all"|"BTC"|"ETH"|"XRP"|"SOL";
  result?: "all"|"win"|"loss";
  strategy: string; // 当前策略标识,如 "v52_8signals"
  limit?: number;   // 默认约 50
}

响应示例(前端用到字段):

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[];
};

被使用位置:

  • /liveL10_TradeHistory

3.7.8 GET /api/live/health

用途:
L11 系统健康,用于展示运行进程状态和数据新鲜度(行情等)。

请求:

  • Method: GET

响应示例(前端使用到字段):

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; // 绿=正常, 黄/红=延迟或异常
    };
    // 其它数据源可在此扩展
  };
};

被使用位置:

  • /liveL11_SystemHealth

4. /strategy-plaza 策略广场接口

4.1 GET /api/strategies

用途:
/strategy-plaza 页面策略卡片列表的数据源;账号/其他页面也可使用该接口获取策略列表。

请求:

  • Method: GET
  • Query
{
  include_deprecated?: "true" | "false"; // 为 "true" 时包含废弃策略
}

响应示例(部分字段):

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 参数:
{ sid: string } // strategy_id
  • BodyJSON
{ amount: number } // 追加金额USDT

响应:

  • 典型形式:{ ok: true } 或返回更新后的策略;具体以实现为准。

被使用位置:

  • /strategy-plazaAddBalanceModal

4.3 POST /api/strategies/{sid}/deprecate

用途:
将策略状态标记为 deprecated,停止其运行但保留所有历史数据。

请求:

  • Method: POST
  • BodyJSON
{ 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

响应示意:

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
{ 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
{ email: string; password: string; invite_code: string }

响应:

  • 一般为新用户信息 + token 或简单成功标记,具体以实现为准。

被使用位置:

  • /register:通过 useAuth().register() 封装调用。

6.3 GET /api/auth/me

用途:
获取当前登录用户信息和订阅状态。

请求:

  • Method: GET
  • 需带 Authorization: Bearer token

响应示意:

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
{ discord_id: string }

响应:

  • 成功:{ ok: true, ... } 或包含简单 message
  • 失败:返回带有 detail 字段的错误响应,前端直接展示。

被使用位置:

  • /dashboardDiscord 信号推送卡片的“绑定”按钮。

7. /signals 信号接口

这些接口为 /signals/signals-v52/signals-v53 等信号页面,以及 /paper 中的“最新信号”区域提供数据。

7.1 GET /api/signals/latest?strategy=

用途:
返回指定策略下各币种BTC/ETH/XRP/SOL的最新指标快照与评分结果用于信号页顶部“实时指标卡片”。

请求:

  • Method: GET
  • Query
{
  strategy: string; // 如 "v51_baseline" | "v52_8signals" | "v53" 等
}

响应示例(基础字段 + 可选 factors

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;
};

被使用位置:

  • /signalsV5.1 信号页顶部指标卡片strategy=v51_baseline
  • /signals-v52V5.2 信号页strategy=v52_8signals
  • /signals-v53V5.3 信号页strategy=v53
  • 其它变体页fast/middle仅改变 strategy 参数。

7.2 GET /api/signals/indicators?symbol=&minutes=&strategy=

用途:
返回某币种在指定时间窗口内的指标时间序列,用于绘制 “CVD 三轨 + 币价” 图表。

请求:

  • Method: GET
  • Query
{
  symbol: "BTC" | "ETH" | "XRP" | "SOL"; // 部分页面传 "BTCUSDT" 形式,由后端兼容
  minutes: number;                       // 统计窗口长度(例如 60/240/720/1440
  strategy?: string;                     // V5.3 页面会传入 strategy=v53
}

响应示例:

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-v53CVD+价格图。

7.3 GET /api/signals/market-indicators

用途:
为信号页中的“Market Indicators”卡片提供多空比、大户持仓、OI、Coinbase Premium 等市场指标。

请求:

  • Method: GET
  • Query: 无

响应示例(按 symbol 分组):

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-v52MarketIndicatorsCards 组件。

7.4 GET /api/signals/signal-history?symbol=&limit=&strategy=

用途:
为各版本信号页中的“最近信号”列表,以及 /paper 页的“最新信号”区提供数据。

请求:

  • Method: GET
  • Query
{
  symbol: string;        // 如 "BTC" | "ETH" 或 "BTCUSDT"
  limit?: number;        // 条数,默认约 20
  strategy: string;      // 如 "v51_baseline" | "v52_8signals" | "v53"
}

响应示例(简化):

type SignalHistoryRow = {
  ts: number;           // 时间戳(毫秒)
  score: number;        // 当时评分
  signal: "LONG"|"SHORT"|string; // 方向或其他标记
  factors?: LatestIndicatorFactors; // 可选:各层分数快照,用于链路说明
};

type SignalHistoryResponse = {
  data: SignalHistoryRow[];
};

被使用位置:

  • /signals最近信号strategy=v51_baseline
  • /signals-v52/signals-v53:对应策略最近信号;
  • /paperLatestSignals 组件(从各 symbol 取最新一条,显示 score + 分层 factors 摘要)。

8. /paper 模拟盘接口

这些接口为 /paper/paper-v52/paper-v53* 等模拟盘页面,以及部分策略详情页提供数据。