mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-14 08:16:56 +08:00
style(backend): go fmt code
This commit is contained in:
@@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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密钥
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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交易器
|
||||||
|
|||||||
Reference in New Issue
Block a user