feat: auto-restart traders on system startup

- Add AutoStartRunningTraders method to TraderManager
- Automatically restore traders marked as running in database
- Call auto-start after loading traders from store on startup
This commit is contained in:
tinkle-community
2025-12-06 18:21:12 +08:00
parent 1e5ece947c
commit 5e5be347ad
2 changed files with 46 additions and 0 deletions
+3
View File
@@ -345,6 +345,9 @@ func main() {
logger.Info("按 Ctrl+C 停止运行")
logger.Info(strings.Repeat("=", 60))
// 自动恢复之前运行中的交易员
traderManager.AutoStartRunningTraders(st)
// 获取API服务器端口(优先级:环境变量 > 数据库配置 > 默认值)
apiPort := 8080 // 默认端口
+43
View File
@@ -99,6 +99,49 @@ func (tm *TraderManager) StopAll() {
}
}
// AutoStartRunningTraders 自动启动数据库中标记为运行中的交易员
func (tm *TraderManager) AutoStartRunningTraders(st *store.Store) {
// 先获取所有交易员配置(一次性查询)
traderList, err := st.Trader().ListAll()
if err != nil {
logger.Infof("⚠️ 获取交易员列表失败: %v", err)
return
}
// 构建运行中交易员的ID集合
runningTraderIDs := make(map[string]bool)
for _, traderCfg := range traderList {
if traderCfg.IsRunning {
runningTraderIDs[traderCfg.ID] = true
}
}
if len(runningTraderIDs) == 0 {
logger.Info("📋 没有需要自动恢复的交易员")
return
}
tm.mu.RLock()
defer tm.mu.RUnlock()
startedCount := 0
for id, t := range tm.traders {
if runningTraderIDs[id] {
go func(traderID string, at *trader.AutoTrader) {
logger.Infof("▶️ 自动恢复启动 %s...", at.GetName())
if err := at.Run(); err != nil {
logger.Infof("❌ %s 运行错误: %v", at.GetName(), err)
}
}(id, t)
startedCount++
}
}
if startedCount > 0 {
logger.Infof("✓ 自动恢复启动了 %d 个交易员", startedCount)
}
}
// GetComparisonData 获取对比数据
func (tm *TraderManager) GetComparisonData() (map[string]interface{}, error) {
tm.mu.RLock()