mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-15 16:56:56 +08:00
Merge branch 'dev' of https://github.com/tinkle-community/nofx into dev
This commit is contained in:
22
main.go
22
main.go
@@ -160,14 +160,30 @@ func main() {
|
|||||||
log.Printf("✓ 配置数据库初始化成功")
|
log.Printf("✓ 配置数据库初始化成功")
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
|
|
||||||
// 设置默认主流币种列表
|
// 从数据库读取默认主流币种列表
|
||||||
defaultCoins := []string{"BTC", "ETH", "SOL", "BNB", "XRP", "DOGE", "ADA", "HYPE"}
|
defaultCoinsJSON, _ := database.GetSystemConfig("default_coins")
|
||||||
|
var defaultCoins []string
|
||||||
|
|
||||||
|
if defaultCoinsJSON != "" {
|
||||||
|
// 尝试从JSON解析
|
||||||
|
if err := json.Unmarshal([]byte(defaultCoinsJSON), &defaultCoins); err != nil {
|
||||||
|
log.Printf("⚠️ 解析default_coins配置失败: %v,使用硬编码默认值", err)
|
||||||
|
defaultCoins = []string{"BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT", "XRPUSDT", "DOGEUSDT", "ADAUSDT", "HYPEUSDT"}
|
||||||
|
} else {
|
||||||
|
log.Printf("✓ 从数据库加载默认币种列表(共%d个): %v", len(defaultCoins), defaultCoins)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 如果数据库中没有配置,使用硬编码默认值
|
||||||
|
defaultCoins = []string{"BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT", "XRPUSDT", "DOGEUSDT", "ADAUSDT", "HYPEUSDT"}
|
||||||
|
log.Printf("⚠️ 数据库中未配置default_coins,使用硬编码默认值")
|
||||||
|
}
|
||||||
|
|
||||||
pool.SetDefaultCoins(defaultCoins)
|
pool.SetDefaultCoins(defaultCoins)
|
||||||
|
|
||||||
// 设置是否使用默认主流币种
|
// 设置是否使用默认主流币种
|
||||||
pool.SetUseDefaultCoins(useDefaultCoins)
|
pool.SetUseDefaultCoins(useDefaultCoins)
|
||||||
if useDefaultCoins {
|
if useDefaultCoins {
|
||||||
log.Printf("✓ 已启用默认主流币种列表(BTC、ETH、SOL、BNB、XRP、DOGE、ADA、HYPE)")
|
log.Printf("✓ 已启用默认主流币种列表")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置币种池API URL
|
// 设置币种池API URL
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro
|
|||||||
maxDailyLossStr, _ := database.GetSystemConfig("max_daily_loss")
|
maxDailyLossStr, _ := database.GetSystemConfig("max_daily_loss")
|
||||||
maxDrawdownStr, _ := database.GetSystemConfig("max_drawdown")
|
maxDrawdownStr, _ := database.GetSystemConfig("max_drawdown")
|
||||||
stopTradingMinutesStr, _ := database.GetSystemConfig("stop_trading_minutes")
|
stopTradingMinutesStr, _ := database.GetSystemConfig("stop_trading_minutes")
|
||||||
|
btcEthLeverageStr, _ := database.GetSystemConfig("btc_eth_leverage")
|
||||||
|
altcoinLeverageStr, _ := database.GetSystemConfig("altcoin_leverage")
|
||||||
|
|
||||||
// 解析配置
|
// 解析配置
|
||||||
maxDailyLoss := 10.0 // 默认值
|
maxDailyLoss := 10.0 // 默认值
|
||||||
@@ -65,6 +67,16 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro
|
|||||||
stopTradingMinutes = val
|
stopTradingMinutes = val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btcEthLeverage := 5 // 默认值
|
||||||
|
if val, err := strconv.Atoi(btcEthLeverageStr); err == nil && val > 0 {
|
||||||
|
btcEthLeverage = val
|
||||||
|
}
|
||||||
|
|
||||||
|
altcoinLeverage := 5 // 默认值
|
||||||
|
if val, err := strconv.Atoi(altcoinLeverageStr); err == nil && val > 0 {
|
||||||
|
altcoinLeverage = val
|
||||||
|
}
|
||||||
|
|
||||||
// 为每个交易员获取AI模型和交易所配置
|
// 为每个交易员获取AI模型和交易所配置
|
||||||
for _, traderCfg := range traders {
|
for _, traderCfg := range traders {
|
||||||
// 获取AI模型配置
|
// 获取AI模型配置
|
||||||
@@ -118,7 +130,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 添加到TraderManager
|
// 添加到TraderManager
|
||||||
err = tm.addTraderFromDB(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, maxDailyLoss, maxDrawdown, stopTradingMinutes)
|
err = tm.addTraderFromDB(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, btcEthLeverage, altcoinLeverage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("❌ 添加交易员 %s 失败: %v", traderCfg.Name, err)
|
log.Printf("❌ 添加交易员 %s 失败: %v", traderCfg.Name, err)
|
||||||
continue
|
continue
|
||||||
@@ -130,7 +142,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database *config.Database) erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// addTraderFromConfig 内部方法:从配置添加交易员(不加锁,因为调用方已加锁)
|
// addTraderFromConfig 内部方法:从配置添加交易员(不加锁,因为调用方已加锁)
|
||||||
func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, 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, btcEthLeverage, altcoinLeverage int) error {
|
||||||
if _, exists := tm.traders[traderCfg.ID]; exists {
|
if _, exists := tm.traders[traderCfg.ID]; exists {
|
||||||
return fmt.Errorf("trader ID '%s' 已存在", traderCfg.ID)
|
return fmt.Errorf("trader ID '%s' 已存在", traderCfg.ID)
|
||||||
}
|
}
|
||||||
@@ -151,6 +163,8 @@ func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModel
|
|||||||
QwenKey: "",
|
QwenKey: "",
|
||||||
ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute,
|
ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute,
|
||||||
InitialBalance: traderCfg.InitialBalance,
|
InitialBalance: traderCfg.InitialBalance,
|
||||||
|
BTCETHLeverage: btcEthLeverage,
|
||||||
|
AltcoinLeverage: altcoinLeverage,
|
||||||
MaxDailyLoss: maxDailyLoss,
|
MaxDailyLoss: maxDailyLoss,
|
||||||
MaxDrawdown: maxDrawdown,
|
MaxDrawdown: maxDrawdown,
|
||||||
StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute,
|
StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute,
|
||||||
@@ -202,7 +216,7 @@ func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModel
|
|||||||
// AddTrader 从数据库配置添加trader (移除旧版兼容性)
|
// AddTrader 从数据库配置添加trader (移除旧版兼容性)
|
||||||
|
|
||||||
// AddTraderFromDB 从数据库配置添加trader
|
// AddTraderFromDB 从数据库配置添加trader
|
||||||
func (tm *TraderManager) AddTraderFromDB(traderCfg *config.TraderRecord, 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, btcEthLeverage, altcoinLeverage int) error {
|
||||||
tm.mu.Lock()
|
tm.mu.Lock()
|
||||||
defer tm.mu.Unlock()
|
defer tm.mu.Unlock()
|
||||||
|
|
||||||
@@ -226,6 +240,8 @@ func (tm *TraderManager) AddTraderFromDB(traderCfg *config.TraderRecord, aiModel
|
|||||||
QwenKey: "",
|
QwenKey: "",
|
||||||
ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute,
|
ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute,
|
||||||
InitialBalance: traderCfg.InitialBalance,
|
InitialBalance: traderCfg.InitialBalance,
|
||||||
|
BTCETHLeverage: btcEthLeverage,
|
||||||
|
AltcoinLeverage: altcoinLeverage,
|
||||||
MaxDailyLoss: maxDailyLoss,
|
MaxDailyLoss: maxDailyLoss,
|
||||||
MaxDrawdown: maxDrawdown,
|
MaxDrawdown: maxDrawdown,
|
||||||
StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute,
|
StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute,
|
||||||
@@ -463,6 +479,8 @@ func (tm *TraderManager) LoadUserTraders(database *config.Database, userID strin
|
|||||||
maxDailyLossStr, _ := database.GetSystemConfig("max_daily_loss")
|
maxDailyLossStr, _ := database.GetSystemConfig("max_daily_loss")
|
||||||
maxDrawdownStr, _ := database.GetSystemConfig("max_drawdown")
|
maxDrawdownStr, _ := database.GetSystemConfig("max_drawdown")
|
||||||
stopTradingMinutesStr, _ := database.GetSystemConfig("stop_trading_minutes")
|
stopTradingMinutesStr, _ := database.GetSystemConfig("stop_trading_minutes")
|
||||||
|
btcEthLeverageStr, _ := database.GetSystemConfig("btc_eth_leverage")
|
||||||
|
altcoinLeverageStr, _ := database.GetSystemConfig("altcoin_leverage")
|
||||||
|
|
||||||
// 解析配置
|
// 解析配置
|
||||||
maxDailyLoss := 10.0 // 默认值
|
maxDailyLoss := 10.0 // 默认值
|
||||||
@@ -480,6 +498,16 @@ func (tm *TraderManager) LoadUserTraders(database *config.Database, userID strin
|
|||||||
stopTradingMinutes = val
|
stopTradingMinutes = val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btcEthLeverage := 5 // 默认值
|
||||||
|
if val, err := strconv.Atoi(btcEthLeverageStr); err == nil && val > 0 {
|
||||||
|
btcEthLeverage = val
|
||||||
|
}
|
||||||
|
|
||||||
|
altcoinLeverage := 5 // 默认值
|
||||||
|
if val, err := strconv.Atoi(altcoinLeverageStr); err == nil && val > 0 {
|
||||||
|
altcoinLeverage = val
|
||||||
|
}
|
||||||
|
|
||||||
// 为每个交易员获取AI模型和交易所配置
|
// 为每个交易员获取AI模型和交易所配置
|
||||||
for _, traderCfg := range traders {
|
for _, traderCfg := range traders {
|
||||||
// 检查是否已经加载过这个交易员
|
// 检查是否已经加载过这个交易员
|
||||||
@@ -539,7 +567,7 @@ func (tm *TraderManager) LoadUserTraders(database *config.Database, userID strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 使用现有的方法加载交易员
|
// 使用现有的方法加载交易员
|
||||||
err = tm.loadSingleTrader(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, maxDailyLoss, maxDrawdown, stopTradingMinutes)
|
err = tm.loadSingleTrader(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, btcEthLeverage, altcoinLeverage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("⚠️ 加载交易员 %s 失败: %v", traderCfg.Name, err)
|
log.Printf("⚠️ 加载交易员 %s 失败: %v", traderCfg.Name, err)
|
||||||
}
|
}
|
||||||
@@ -549,7 +577,7 @@ func (tm *TraderManager) LoadUserTraders(database *config.Database, userID strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// loadSingleTrader 加载单个交易员(从现有代码提取的公共逻辑)
|
// loadSingleTrader 加载单个交易员(从现有代码提取的公共逻辑)
|
||||||
func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, 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, btcEthLeverage, altcoinLeverage int) error {
|
||||||
// 构建AutoTraderConfig
|
// 构建AutoTraderConfig
|
||||||
traderConfig := trader.AutoTraderConfig{
|
traderConfig := trader.AutoTraderConfig{
|
||||||
ID: traderCfg.ID,
|
ID: traderCfg.ID,
|
||||||
@@ -559,6 +587,8 @@ func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiMode
|
|||||||
InitialBalance: traderCfg.InitialBalance,
|
InitialBalance: traderCfg.InitialBalance,
|
||||||
ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute,
|
ScanInterval: time.Duration(traderCfg.ScanIntervalMinutes) * time.Minute,
|
||||||
CoinPoolAPIURL: coinPoolURL,
|
CoinPoolAPIURL: coinPoolURL,
|
||||||
|
BTCETHLeverage: btcEthLeverage,
|
||||||
|
AltcoinLeverage: altcoinLeverage,
|
||||||
MaxDailyLoss: maxDailyLoss,
|
MaxDailyLoss: maxDailyLoss,
|
||||||
MaxDrawdown: maxDrawdown,
|
MaxDrawdown: maxDrawdown,
|
||||||
StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute,
|
StopTradingTime: time.Duration(stopTradingMinutes) * time.Minute,
|
||||||
|
|||||||
Reference in New Issue
Block a user