diff --git a/api/server.go b/api/server.go index 1cac868f..47bf8f1b 100644 --- a/api/server.go +++ b/api/server.go @@ -222,8 +222,8 @@ func (s *Server) handleCreateTrader(c *gin.Context) { // 生成交易员ID traderID := fmt.Sprintf("%s_%s_%d", req.ExchangeID, req.AIModelID, time.Now().Unix()) - // 创建交易员配置 - trader := &config.TraderConfig{ + // 创建交易员配置(数据库实体) + trader := &config.TraderRecord{ ID: traderID, UserID: userID, Name: req.Name, diff --git a/config/database.go b/config/database.go index dd40866c..6890f25b 100644 --- a/config/database.go +++ b/config/database.go @@ -357,8 +357,8 @@ type ExchangeConfig struct { UpdatedAt time.Time `json:"updated_at"` } -// TraderConfig 交易员配置 -type TraderConfig struct { +// TraderRecord 交易员配置(数据库实体) +type TraderRecord struct { ID string `json:"id"` UserID string `json:"user_id"` Name string `json:"name"` @@ -654,7 +654,7 @@ func (d *Database) CreateExchange(userID, id, name, typ string, enabled bool, ap } // CreateTrader 创建交易员 -func (d *Database) CreateTrader(trader *TraderConfig) error { +func (d *Database) CreateTrader(trader *TraderRecord) error { _, err := d.db.Exec(` INSERT INTO traders (id, user_id, name, ai_model_id, exchange_id, initial_balance, scan_interval_minutes, is_running, custom_prompt, override_base_prompt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) @@ -663,7 +663,7 @@ func (d *Database) CreateTrader(trader *TraderConfig) error { } // GetTraders 获取用户的交易员 -func (d *Database) GetTraders(userID string) ([]*TraderConfig, error) { +func (d *Database) GetTraders(userID string) ([]*TraderRecord, error) { rows, err := d.db.Query(` SELECT id, user_id, name, ai_model_id, exchange_id, initial_balance, scan_interval_minutes, is_running, COALESCE(custom_prompt, '') as custom_prompt, COALESCE(override_base_prompt, 0) as override_base_prompt, created_at, updated_at @@ -674,9 +674,9 @@ func (d *Database) GetTraders(userID string) ([]*TraderConfig, error) { } defer rows.Close() - var traders []*TraderConfig + var traders []*TraderRecord for rows.Next() { - var trader TraderConfig + var trader TraderRecord err := rows.Scan( &trader.ID, &trader.UserID, &trader.Name, &trader.AIModelID, &trader.ExchangeID, &trader.InitialBalance, &trader.ScanIntervalMinutes, &trader.IsRunning, @@ -710,8 +710,8 @@ func (d *Database) DeleteTrader(userID, id string) error { } // GetTraderConfig 获取交易员完整配置(包含AI模型和交易所信息) -func (d *Database) GetTraderConfig(userID, traderID string) (*TraderConfig, *AIModelConfig, *ExchangeConfig, error) { - var trader TraderConfig +func (d *Database) GetTraderConfig(userID, traderID string) (*TraderRecord, *AIModelConfig, *ExchangeConfig, error) { + var trader TraderRecord var aiModel AIModelConfig var exchange ExchangeConfig diff --git a/manager/trader_manager.go b/manager/trader_manager.go index 31800fda..c6714526 100644 --- a/manager/trader_manager.go +++ b/manager/trader_manager.go @@ -66,7 +66,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro } // 为每个交易员获取AI模型和交易所配置 - for _, traderCfg := range traders { + for _, traderCfg := range traders { // 获取AI模型配置 aiModels, err := database.GetAIModels(userID) if err != nil { @@ -118,7 +118,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro } // 添加到TraderManager - err = tm.addTraderFromConfig(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, maxDailyLoss, maxDrawdown, stopTradingMinutes) + err = tm.addTraderFromDB(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, maxDailyLoss, maxDrawdown, stopTradingMinutes) if err != nil { log.Printf("❌ 添加交易员 %s 失败: %v", traderCfg.Name, err) continue @@ -130,13 +130,13 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro } // addTraderFromConfig 内部方法:从配置添加交易员(不加锁,因为调用方已加锁) -func (tm *TraderManager) addTraderFromConfig(traderCfg *config.TraderConfig, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int) error { +func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int) error { if _, exists := tm.traders[traderCfg.ID]; exists { return fmt.Errorf("trader ID '%s' 已存在", traderCfg.ID) } // 构建AutoTraderConfig - traderConfig := trader.AutoTraderConfig{ + traderConfig := trader.AutoTraderConfig{ ID: traderCfg.ID, Name: traderCfg.Name, AIModel: aiModelCfg.Provider, // 使用provider作为模型标识 @@ -201,7 +201,7 @@ func (tm *TraderManager) addTraderFromConfig(traderCfg *config.TraderConfig, aiM // AddTrader 从数据库配置添加trader (移除旧版兼容性) // AddTraderFromDB 从数据库配置添加trader -func (tm *TraderManager) AddTraderFromDB(traderCfg *config.TraderConfig, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int) error { +func (tm *TraderManager) AddTraderFromDB(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int) error { tm.mu.Lock() defer tm.mu.Unlock() @@ -547,7 +547,7 @@ func (tm *TraderManager) LoadUserTraders(database *config.Database, userID strin } // loadSingleTrader 加载单个交易员(从现有代码提取的公共逻辑) -func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderConfig, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int) error { +func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int) error { // 构建AutoTraderConfig traderConfig := trader.AutoTraderConfig{ ID: traderCfg.ID,