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
+53
View File
@@ -313,6 +313,7 @@
"templates": "Templates",
"copyTradingConfig": "Copy Trading Config",
"cryptoTailStrategy": "Tail Strategy",
"cryptoTailMonitor": "Tail Monitor",
"positions": "Position Management",
"backtest": "Backtest",
"statistics": "Statistics",
@@ -1541,5 +1542,57 @@
"emptyFail": "No failed records",
"totalCount": "{count} record(s)"
}
},
"cryptoTailMonitor": {
"title": "Tail Strategy Monitor",
"selectStrategy": "Strategy",
"selectStrategyPlaceholder": "Select a strategy to monitor",
"direction": "Direction",
"directionUp": "Up",
"directionDown": "Down",
"noData": "Select a strategy to start monitoring",
"priceRange": "Price Range",
"timeWindow": "Time Window",
"stat": {
"openPrice": "Open Price",
"currentPrice": "Current Price",
"spread": "Spread",
"remainingTime": "Remaining",
"configuredSpread": "Configured Spread",
"configuredSpreadMin": "Min Spread",
"configuredSpreadMax": "Max Spread",
"status": "Status",
"minSpreadLine": "Min Spread",
"periodSpreadMinMax": "Period Spread",
"periodSpreadMin": "Period Min Spread",
"periodSpreadMax": "Period Max Spread",
"minSpread": "Min",
"maxSpread": "Max"
},
"status": {
"triggered": "Triggered",
"periodEnded": "Period Ended",
"inCondition": "In Condition",
"waiting": "Waiting"
},
"chart": {
"title": "Price Chart",
"btcTitle": "BTC Price Chart",
"marketTitle": "Market Price Chart",
"price": "BTC Price",
"openPrice": "Open",
"spread": "Spread",
"minSpreadLine": "Min Spread Line",
"marketUp": "Up",
"marketDown": "Down",
"time": "Time"
},
"strategyInfo": {
"title": "Strategy Info",
"market": "Market",
"interval": "Interval",
"account": "Account",
"spreadMode": "Spread Mode"
}
}
}
+53
View File
@@ -312,6 +312,7 @@
"templates": "跟单模板",
"copyTradingConfig": "跟单配置",
"cryptoTailStrategy": "尾盘策略",
"cryptoTailMonitor": "尾盘监控",
"positions": "仓位管理",
"backtest": "回测",
"statistics": "统计信息",
@@ -1540,5 +1541,57 @@
"emptyFail": "暂无失败记录",
"totalCount": "共 {count} 条"
}
},
"cryptoTailMonitor": {
"title": "尾盘策略监控",
"selectStrategy": "选择策略",
"selectStrategyPlaceholder": "请选择要监控的策略",
"direction": "监控方向",
"directionUp": "Up",
"directionDown": "Down",
"noData": "请选择一个策略开始监控",
"priceRange": "价格区间",
"timeWindow": "时间窗口",
"stat": {
"openPrice": "开盘价",
"currentPrice": "最新价",
"spread": "价差",
"remainingTime": "剩余时间",
"configuredSpread": "配置价差",
"configuredSpreadMin": "最小价差",
"configuredSpreadMax": "最大价差",
"status": "状态",
"minSpreadLine": "最小价差线",
"periodSpreadMinMax": "周期内价差",
"periodSpreadMin": "周期内最小价差",
"periodSpreadMax": "周期内最大价差",
"minSpread": "最小",
"maxSpread": "最大"
},
"status": {
"triggered": "已触发",
"periodEnded": "周期结束",
"inCondition": "满足条件",
"waiting": "等待中"
},
"chart": {
"title": "分时图",
"btcTitle": "BTC 分时图",
"marketTitle": "市场分时图",
"price": "BTC 价格",
"openPrice": "开盘价",
"spread": "价差",
"minSpreadLine": "最小价差线",
"marketUp": "Up",
"marketDown": "Down",
"time": "时间"
},
"strategyInfo": {
"title": "策略信息",
"market": "市场",
"interval": "周期",
"account": "账户",
"spreadMode": "价差模式"
}
}
}
+53
View File
@@ -313,6 +313,7 @@
"templates": "跟單模板",
"copyTradingConfig": "跟單配置",
"cryptoTailStrategy": "尾盤策略",
"cryptoTailMonitor": "尾盤監控",
"positions": "倉位管理",
"backtest": "回測",
"statistics": "統計信息",
@@ -1541,5 +1542,57 @@
"emptyFail": "暫無失敗記錄",
"totalCount": "共 {count} 條"
}
},
"cryptoTailMonitor": {
"title": "尾盤策略監控",
"selectStrategy": "選擇策略",
"selectStrategyPlaceholder": "請選擇要監控的策略",
"direction": "監控方向",
"directionUp": "Up",
"directionDown": "Down",
"noData": "請選擇一個策略開始監控",
"priceRange": "價格區間",
"timeWindow": "時間窗口",
"stat": {
"openPrice": "開盤價",
"currentPrice": "最新價",
"spread": "價差",
"remainingTime": "剩餘時間",
"configuredSpread": "配置價差",
"configuredSpreadMin": "最小價差",
"configuredSpreadMax": "最大價差",
"status": "狀態",
"minSpreadLine": "最小價差線",
"periodSpreadMinMax": "週期內價差",
"periodSpreadMin": "週期內最小價差",
"periodSpreadMax": "週期內最大價差",
"minSpread": "最小",
"maxSpread": "最大"
},
"status": {
"triggered": "已觸發",
"periodEnded": "週期結束",
"inCondition": "滿足條件",
"waiting": "等待中"
},
"chart": {
"title": "分時圖",
"btcTitle": "BTC 分時圖",
"marketTitle": "市場分時圖",
"price": "BTC 價格",
"openPrice": "開盤價",
"spread": "價差",
"minSpreadLine": "最小價差線",
"marketUp": "Up",
"marketDown": "Down",
"time": "時間"
},
"strategyInfo": {
"title": "策略信息",
"market": "市場",
"interval": "週期",
"account": "賬戶",
"spreadMode": "價差模式"
}
}
}