feat(cryptotail): 尾盘监控双连接与分时图优化

- 监控 WebSocket 拆分为当前周期连接与下一周期连接,周期切换时关闭过期连接并新建下一周期
- 下一周期市场未创建时也建立第二条空连接,保证始终两条连接
- refreshSubscription 增加 Mutex 防重入,避免周期结束时定时器与消息同时触发导致重复执行
- 修复 initMonitor/buildPushData 中 getCurrentOpenClose、spreadMode/spreadValue 等 API 与实体字段引用
- 移除重复的 buildSubscriptionMap、buildPushData 等方法,修复 StrategyPriceData.periodStartUnix
- 前端分时图:市场价折线增加 connectNulls,新周期默认 0.5 价格展示
- 多语言与监控页入口、API 类型与 WebSocket 订阅集成

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
WrBug
2026-02-25 17:00:41 +08:00
co-authored by Cursor
parent d3196a783f
commit 84c79d8812
18 changed files with 2162 additions and 59 deletions
+94
View File
@@ -1107,3 +1107,97 @@ export interface CryptoTailMarketOptionDto {
periodStartUnix: number
endDate?: string
}
/**
* 尾盘策略监控初始化响应
*/
export interface CryptoTailMonitorInitResponse {
/** 策略ID */
strategyId: number
/** 策略名称 */
name: string
/** 账户ID */
accountId: number
/** 账户名称 */
accountName: string
/** 市场 slug 前缀 */
marketSlugPrefix: string
/** 市场标题 */
marketTitle: string
/** 周期秒数 (300=5m, 900=15m) */
intervalSeconds: number
/** 当前周期开始时间 (Unix 秒) */
periodStartUnix: number
/** 时间窗口开始秒数 */
windowStartSeconds: number
/** 时间窗口结束秒数 */
windowEndSeconds: number
/** 最低价格 */
minPrice: string
/** 最高价格 */
maxPrice: string
/** 最小价差模式: NONE, FIXED, AUTO */
minSpreadMode: string
/** 价差方向: MIN(显示周期内最小价差), MAX(显示周期内最大价差) */
spreadDirection?: string
/** 最小价差数值 (FIXED 时有值) */
minSpreadValue?: string
/** 自动计算的最小价差 (Up方向) */
autoMinSpreadUp?: string
/** 自动计算的最小价差 (Down方向) */
autoMinSpreadDown?: string
/** BTC 开盘价 USDC(来自币安 K 线) */
openPriceBtc?: string
/** Up tokenId */
tokenIdUp?: string
/** Down tokenId */
tokenIdDown?: string
/** 当前时间 (毫秒时间戳) */
currentTimestamp: number
/** 是否启用 */
enabled: boolean
}
/**
* 尾盘策略监控实时推送数据
*/
export interface CryptoTailMonitorPushData {
/** 策略ID */
strategyId: number
/** 推送时间 (毫秒时间戳) */
timestamp: number
/** 当前周期开始时间 (Unix 秒) */
periodStartUnix: number
/** 当前价格 (Up方向,来自订单簿) */
currentPriceUp?: string
/** 当前价格 (Down方向,来自订单簿) */
currentPriceDown?: string
/** 当前价差 (Up方向: 1 - currentPriceUp) */
spreadUp?: string
/** 当前价差 (Down方向: currentPriceUp) */
spreadDown?: string
/** 最小价差线 (Up方向,USDC) */
minSpreadLineUp?: string
/** 最小价差线 (Down方向,USDC) */
minSpreadLineDown?: string
/** BTC 开盘价 USDC */
openPriceBtc?: string
/** BTC 最新价 USDC */
currentPriceBtc?: string
/** BTC 价差 USDCcurrentPriceBtc - openPriceBtc */
spreadBtc?: string
/** 周期剩余秒数 */
remainingSeconds: number
/** 是否在时间窗口内 */
inTimeWindow: boolean
/** 是否在价格区间内 (Up方向) */
inPriceRangeUp: boolean
/** 是否在价格区间内 (Down方向) */
inPriceRangeDown: boolean
/** 是否已触发 */
triggered: boolean
/** 触发方向: UP, DOWN, null */
triggerDirection?: string
/** 周期是否已结束 */
periodEnded: boolean
}