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