style(backend): go fmt code

This commit is contained in:
hzb1115
2025-11-03 17:22:11 +00:00
parent d6daad5708
commit febf7f5f33
7 changed files with 164 additions and 165 deletions

View File

@@ -114,7 +114,6 @@ func (s *Server) setupRoutes() {
protected.GET("/user/signal-sources", s.handleGetUserSignalSource) protected.GET("/user/signal-sources", s.handleGetUserSignalSource)
protected.POST("/user/signal-sources", s.handleSaveUserSignalSource) protected.POST("/user/signal-sources", s.handleSaveUserSignalSource)
// 竞赛总览 // 竞赛总览
protected.GET("/competition", s.handleCompetition) protected.GET("/competition", s.handleCompetition)
@@ -167,8 +166,8 @@ func (s *Server) handleGetSystemConfig(c *gin.Context) {
} }
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"admin_mode": auth.IsAdminMode(), "admin_mode": auth.IsAdminMode(),
"default_coins": defaultCoins, "default_coins": defaultCoins,
"btc_eth_leverage": btcEthLeverage, "btc_eth_leverage": btcEthLeverage,
"altcoin_leverage": altcoinLeverage, "altcoin_leverage": altcoinLeverage,
}) })
@@ -339,8 +338,8 @@ func (s *Server) handleCreateTrader(c *gin.Context) {
scanIntervalMinutes = 3 // 默认3分钟 scanIntervalMinutes = 3 // 默认3分钟
} }
// 创建交易员配置(数据库实体) // 创建交易员配置(数据库实体)
trader := &config.TraderRecord{ trader := &config.TraderRecord{
ID: traderID, ID: traderID,
UserID: userID, UserID: userID,
Name: req.Name, Name: req.Name,
@@ -357,7 +356,7 @@ func (s *Server) handleCreateTrader(c *gin.Context) {
SystemPromptTemplate: systemPromptTemplate, SystemPromptTemplate: systemPromptTemplate,
IsCrossMargin: isCrossMargin, IsCrossMargin: isCrossMargin,
ScanIntervalMinutes: scanIntervalMinutes, ScanIntervalMinutes: scanIntervalMinutes,
IsRunning: false, IsRunning: false,
} }
// 保存到数据库 // 保存到数据库
@@ -386,17 +385,17 @@ func (s *Server) handleCreateTrader(c *gin.Context) {
// UpdateTraderRequest 更新交易员请求 // UpdateTraderRequest 更新交易员请求
type UpdateTraderRequest struct { type UpdateTraderRequest struct {
Name string `json:"name" binding:"required"` Name string `json:"name" binding:"required"`
AIModelID string `json:"ai_model_id" binding:"required"` AIModelID string `json:"ai_model_id" binding:"required"`
ExchangeID string `json:"exchange_id" binding:"required"` ExchangeID string `json:"exchange_id" binding:"required"`
InitialBalance float64 `json:"initial_balance"` InitialBalance float64 `json:"initial_balance"`
ScanIntervalMinutes int `json:"scan_interval_minutes"` ScanIntervalMinutes int `json:"scan_interval_minutes"`
BTCETHLeverage int `json:"btc_eth_leverage"` BTCETHLeverage int `json:"btc_eth_leverage"`
AltcoinLeverage int `json:"altcoin_leverage"` AltcoinLeverage int `json:"altcoin_leverage"`
TradingSymbols string `json:"trading_symbols"` TradingSymbols string `json:"trading_symbols"`
CustomPrompt string `json:"custom_prompt"` CustomPrompt string `json:"custom_prompt"`
OverrideBasePrompt bool `json:"override_base_prompt"` OverrideBasePrompt bool `json:"override_base_prompt"`
IsCrossMargin *bool `json:"is_cross_margin"` IsCrossMargin *bool `json:"is_cross_margin"`
} }
// handleUpdateTrader 更新交易员配置 // handleUpdateTrader 更新交易员配置
@@ -452,8 +451,8 @@ func (s *Server) handleUpdateTrader(c *gin.Context) {
scanIntervalMinutes = existingTrader.ScanIntervalMinutes // 保持原值 scanIntervalMinutes = existingTrader.ScanIntervalMinutes // 保持原值
} }
// 更新交易员配置 // 更新交易员配置
trader := &config.TraderRecord{ trader := &config.TraderRecord{
ID: traderID, ID: traderID,
UserID: userID, UserID: userID,
Name: req.Name, Name: req.Name,
@@ -592,8 +591,8 @@ func (s *Server) handleUpdateTraderPrompt(c *gin.Context) {
userID := c.GetString("user_id") userID := c.GetString("user_id")
var req struct { var req struct {
CustomPrompt string `json:"custom_prompt"` CustomPrompt string `json:"custom_prompt"`
OverrideBasePrompt bool `json:"override_base_prompt"` OverrideBasePrompt bool `json:"override_base_prompt"`
} }
if err := c.ShouldBindJSON(&req); err != nil { if err := c.ShouldBindJSON(&req); err != nil {
@@ -820,21 +819,21 @@ func (s *Server) handleGetTraderConfig(c *gin.Context) {
aiModelID := traderConfig.AIModelID aiModelID := traderConfig.AIModelID
result := map[string]interface{}{ result := map[string]interface{}{
"trader_id": traderConfig.ID, "trader_id": traderConfig.ID,
"trader_name": traderConfig.Name, "trader_name": traderConfig.Name,
"ai_model": aiModelID, "ai_model": aiModelID,
"exchange_id": traderConfig.ExchangeID, "exchange_id": traderConfig.ExchangeID,
"initial_balance": traderConfig.InitialBalance, "initial_balance": traderConfig.InitialBalance,
"scan_interval_minutes": traderConfig.ScanIntervalMinutes, "scan_interval_minutes": traderConfig.ScanIntervalMinutes,
"btc_eth_leverage": traderConfig.BTCETHLeverage, "btc_eth_leverage": traderConfig.BTCETHLeverage,
"altcoin_leverage": traderConfig.AltcoinLeverage, "altcoin_leverage": traderConfig.AltcoinLeverage,
"trading_symbols": traderConfig.TradingSymbols, "trading_symbols": traderConfig.TradingSymbols,
"custom_prompt": traderConfig.CustomPrompt, "custom_prompt": traderConfig.CustomPrompt,
"override_base_prompt": traderConfig.OverrideBasePrompt, "override_base_prompt": traderConfig.OverrideBasePrompt,
"is_cross_margin": traderConfig.IsCrossMargin, "is_cross_margin": traderConfig.IsCrossMargin,
"use_coin_pool": traderConfig.UseCoinPool, "use_coin_pool": traderConfig.UseCoinPool,
"use_oi_top": traderConfig.UseOITop, "use_oi_top": traderConfig.UseOITop,
"is_running": isRunning, "is_running": isRunning,
} }
c.JSON(http.StatusOK, result) c.JSON(http.StatusOK, result)
@@ -1225,11 +1224,11 @@ func (s *Server) handleRegister(c *gin.Context) {
// 返回OTP设置信息 // 返回OTP设置信息
qrCodeURL := auth.GetOTPQRCodeURL(otpSecret, req.Email) qrCodeURL := auth.GetOTPQRCodeURL(otpSecret, req.Email)
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"user_id": userID, "user_id": userID,
"email": req.Email, "email": req.Email,
"otp_secret": otpSecret, "otp_secret": otpSecret,
"qr_code_url": qrCodeURL, "qr_code_url": qrCodeURL,
"message": "请使用Google Authenticator扫描二维码并验证OTP", "message": "请使用Google Authenticator扫描二维码并验证OTP",
}) })
} }
@@ -1314,8 +1313,8 @@ func (s *Server) handleLogin(c *gin.Context) {
// 检查OTP是否已验证 // 检查OTP是否已验证
if !user.OTPVerified { if !user.OTPVerified {
c.JSON(http.StatusUnauthorized, gin.H{ c.JSON(http.StatusUnauthorized, gin.H{
"error": "账户未完成OTP设置", "error": "账户未完成OTP设置",
"user_id": user.ID, "user_id": user.ID,
"requires_otp_setup": true, "requires_otp_setup": true,
}) })
return return
@@ -1323,9 +1322,9 @@ func (s *Server) handleLogin(c *gin.Context) {
// 返回需要OTP验证的状态 // 返回需要OTP验证的状态
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"user_id": user.ID, "user_id": user.ID,
"email": user.Email, "email": user.Email,
"message": "请输入Google Authenticator验证码", "message": "请输入Google Authenticator验证码",
"requires_otp": true, "requires_otp": true,
}) })
} }

View File

@@ -84,7 +84,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro
} }
// 为每个交易员获取AI模型和交易所配置 // 为每个交易员获取AI模型和交易所配置
for _, traderCfg := range allTraders { for _, traderCfg := range allTraders {
// 获取AI模型配置使用交易员所属的用户ID // 获取AI模型配置使用交易员所属的用户ID
aiModels, err := database.GetAIModels(traderCfg.UserID) aiModels, err := database.GetAIModels(traderCfg.UserID)
if err != nil { if err != nil {
@@ -157,7 +157,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro
} }
// 添加到TraderManager // 添加到TraderManager
err = tm.addTraderFromDB(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, oiTopURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, defaultCoins) err = tm.addTraderFromDB(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, oiTopURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, defaultCoins)
if err != nil { if err != nil {
log.Printf("❌ 添加交易员 %s 失败: %v", traderCfg.Name, err) log.Printf("❌ 添加交易员 %s 失败: %v", traderCfg.Name, err)
continue continue
@@ -200,7 +200,7 @@ func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModel
} }
// 构建AutoTraderConfig // 构建AutoTraderConfig
traderConfig := trader.AutoTraderConfig{ traderConfig := trader.AutoTraderConfig{
ID: traderCfg.ID, ID: traderCfg.ID,
Name: traderCfg.Name, Name: traderCfg.Name,
AIModel: aiModelCfg.Provider, // 使用provider作为模型标识 AIModel: aiModelCfg.Provider, // 使用provider作为模型标识
@@ -723,25 +723,25 @@ func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiMode
// 构建AutoTraderConfig // 构建AutoTraderConfig
traderConfig := trader.AutoTraderConfig{ traderConfig := trader.AutoTraderConfig{
ID: traderCfg.ID, ID: traderCfg.ID,
Name: traderCfg.Name, Name: traderCfg.Name,
AIModel: aiModelCfg.Provider, // 使用provider作为模型标识 AIModel: aiModelCfg.Provider, // 使用provider作为模型标识
Exchange: exchangeCfg.ID, // 使用exchange ID Exchange: exchangeCfg.ID, // 使用exchange ID
InitialBalance: traderCfg.InitialBalance, InitialBalance: traderCfg.InitialBalance,
BTCETHLeverage: traderCfg.BTCETHLeverage, BTCETHLeverage: traderCfg.BTCETHLeverage,
AltcoinLeverage: traderCfg.AltcoinLeverage, AltcoinLeverage: traderCfg.AltcoinLeverage,
ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute, ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute,
CoinPoolAPIURL: effectiveCoinPoolURL, CoinPoolAPIURL: effectiveCoinPoolURL,
CustomAPIURL: aiModelCfg.CustomAPIURL, // 自定义API URL CustomAPIURL: aiModelCfg.CustomAPIURL, // 自定义API URL
CustomModelName: aiModelCfg.CustomModelName, // 自定义模型名称 CustomModelName: aiModelCfg.CustomModelName, // 自定义模型名称
UseQwen: aiModelCfg.Provider == "qwen", UseQwen: aiModelCfg.Provider == "qwen",
MaxDailyLoss: maxDailyLoss, MaxDailyLoss: maxDailyLoss,
MaxDrawdown: maxDrawdown, MaxDrawdown: maxDrawdown,
StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute, StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute,
IsCrossMargin: traderCfg.IsCrossMargin, IsCrossMargin: traderCfg.IsCrossMargin,
DefaultCoins: defaultCoins, DefaultCoins: defaultCoins,
TradingCoins: tradingCoins, TradingCoins: tradingCoins,
SystemPromptTemplate: traderCfg.SystemPromptTemplate, // 系统提示词模板 SystemPromptTemplate: traderCfg.SystemPromptTemplate, // 系统提示词模板
} }
// 根据交易所类型设置API密钥 // 根据交易所类型设置API密钥

View File

@@ -27,8 +27,8 @@ import (
// AsterTrader Aster交易平台实现 // AsterTrader Aster交易平台实现
type AsterTrader struct { type AsterTrader struct {
ctx context.Context ctx context.Context
user string // 主钱包地址 (ERC20) user string // 主钱包地址 (ERC20)
signer string // API钱包地址 signer string // API钱包地址
privateKey *ecdsa.PrivateKey // API钱包私钥 privateKey *ecdsa.PrivateKey // API钱包私钥
client *http.Client client *http.Client
baseURL string baseURL string
@@ -99,9 +99,9 @@ func (t *AsterTrader) getPrecision(symbol string) (SymbolPrecision, error) {
body, _ := io.ReadAll(resp.Body) body, _ := io.ReadAll(resp.Body)
var info struct { var info struct {
Symbols []struct { Symbols []struct {
Symbol string `json:"symbol"` Symbol string `json:"symbol"`
PricePrecision int `json:"pricePrecision"` PricePrecision int `json:"pricePrecision"`
QuantityPrecision int `json:"quantityPrecision"` QuantityPrecision int `json:"quantityPrecision"`
Filters []map[string]interface{} `json:"filters"` Filters []map[string]interface{} `json:"filters"`
} `json:"symbols"` } `json:"symbols"`
} }
@@ -506,14 +506,14 @@ func (t *AsterTrader) GetPositions() ([]map[string]interface{}, error) {
// 返回与Binance相同的字段名 // 返回与Binance相同的字段名
result = append(result, map[string]interface{}{ result = append(result, map[string]interface{}{
"symbol": pos["symbol"], "symbol": pos["symbol"],
"side": side, "side": side,
"positionAmt": posAmt, "positionAmt": posAmt,
"entryPrice": entryPrice, "entryPrice": entryPrice,
"markPrice": markPrice, "markPrice": markPrice,
"unRealizedProfit": unRealizedProfit, "unRealizedProfit": unRealizedProfit,
"leverage": leverageVal, "leverage": leverageVal,
"liquidationPrice": liquidationPrice, "liquidationPrice": liquidationPrice,
}) })
} }
@@ -838,7 +838,7 @@ func (t *AsterTrader) SetMarginMode(symbol string, isCrossMargin bool) error {
if err != nil { if err != nil {
// 如果错误表示无需更改,忽略错误 // 如果错误表示无需更改,忽略错误
if strings.Contains(err.Error(), "No need to change") || if strings.Contains(err.Error(), "No need to change") ||
strings.Contains(err.Error(), "Margin type cannot be changed") { strings.Contains(err.Error(), "Margin type cannot be changed") {
log.Printf(" ✓ %s 仓位模式已是 %s 或有持仓无法更改", symbol, marginType) log.Printf(" ✓ %s 仓位模式已是 %s 或有持仓无法更改", symbol, marginType)
return nil return nil
} }

View File

@@ -68,8 +68,8 @@ type AutoTraderConfig struct {
IsCrossMargin bool // true=全仓模式, false=逐仓模式 IsCrossMargin bool // true=全仓模式, false=逐仓模式
// 币种配置 // 币种配置
DefaultCoins []string // 默认币种列表(从数据库获取) DefaultCoins []string // 默认币种列表(从数据库获取)
TradingCoins []string // 实际交易币种列表 TradingCoins []string // 实际交易币种列表
// 系统提示词模板 // 系统提示词模板
SystemPromptTemplate string // 系统提示词模板名称(如 "default", "aggressive" SystemPromptTemplate string // 系统提示词模板名称(如 "default", "aggressive"
@@ -87,9 +87,9 @@ type AutoTrader struct {
decisionLogger *logger.DecisionLogger // 决策日志记录器 decisionLogger *logger.DecisionLogger // 决策日志记录器
initialBalance float64 initialBalance float64
dailyPnL float64 dailyPnL float64
customPrompt string // 自定义交易策略prompt customPrompt string // 自定义交易策略prompt
overrideBasePrompt bool // 是否覆盖基础prompt overrideBasePrompt bool // 是否覆盖基础prompt
systemPromptTemplate string // 系统提示词模板名称 systemPromptTemplate string // 系统提示词模板名称
defaultCoins []string // 默认币种列表(从数据库获取) defaultCoins []string // 默认币种列表(从数据库获取)
tradingCoins []string // 实际交易币种列表 tradingCoins []string // 实际交易币种列表
lastResetTime time.Time lastResetTime time.Time

View File

@@ -17,7 +17,7 @@ type HyperliquidTrader struct {
ctx context.Context ctx context.Context
walletAddr string walletAddr string
meta *hyperliquid.Meta // 缓存meta信息包含精度等 meta *hyperliquid.Meta // 缓存meta信息包含精度等
isCrossMargin bool // 是否为全仓模式 isCrossMargin bool // 是否为全仓模式
} }
// NewHyperliquidTrader 创建Hyperliquid交易器 // NewHyperliquidTrader 创建Hyperliquid交易器