mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-16 01:06:59 +08:00
Sync config.json to config.db for manual modify admin_mode and other configs
This commit is contained in:
@@ -209,16 +209,20 @@ func (d *Database) initDefaultData() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化系统配置
|
// 初始化系统配置 - 创建所有字段,设置默认值,后续由config.json同步更新
|
||||||
systemConfigs := map[string]string{
|
systemConfigs := map[string]string{
|
||||||
"admin_mode": "true",
|
"admin_mode": "true", // 默认开启管理员模式,便于首次使用
|
||||||
"api_server_port": "8080",
|
"api_server_port": "8080", // 默认API端口
|
||||||
"use_default_coins": "true",
|
"use_default_coins": "true", // 默认使用内置币种列表
|
||||||
"coin_pool_api_url": "",
|
"default_coins": `["BTCUSDT","ETHUSDT","SOLUSDT","BNBUSDT","XRPUSDT","DOGEUSDT","ADAUSDT","HYPEUSDT"]`, // 默认币种列表(JSON格式)
|
||||||
"oi_top_api_url": "",
|
"coin_pool_api_url": "", // 币种池API URL,默认为空
|
||||||
"max_daily_loss": "10.0",
|
"oi_top_api_url": "", // 持仓量API URL,默认为空
|
||||||
"max_drawdown": "20.0",
|
"max_daily_loss": "10.0", // 最大日损失百分比
|
||||||
"stop_trading_minutes": "60",
|
"max_drawdown": "20.0", // 最大回撤百分比
|
||||||
|
"stop_trading_minutes": "60", // 停止交易时间(分钟)
|
||||||
|
"btc_eth_leverage": "5", // BTC/ETH杠杆倍数
|
||||||
|
"altcoin_leverage": "5", // 山寨币杠杆倍数
|
||||||
|
"jwt_secret": "", // JWT密钥,默认为空,由config.json或系统生成
|
||||||
}
|
}
|
||||||
|
|
||||||
for key, value := range systemConfigs {
|
for key, value := range systemConfigs {
|
||||||
|
|||||||
95
main.go
95
main.go
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"nofx/api"
|
"nofx/api"
|
||||||
@@ -15,6 +16,95 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// LeverageConfig 杠杆配置
|
||||||
|
type LeverageConfig struct {
|
||||||
|
BTCETHLeverage int `json:"btc_eth_leverage"`
|
||||||
|
AltcoinLeverage int `json:"altcoin_leverage"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConfigFile 配置文件结构,只包含需要同步到数据库的字段
|
||||||
|
type ConfigFile struct {
|
||||||
|
AdminMode bool `json:"admin_mode"`
|
||||||
|
APIServerPort int `json:"api_server_port"`
|
||||||
|
UseDefaultCoins bool `json:"use_default_coins"`
|
||||||
|
DefaultCoins []string `json:"default_coins"`
|
||||||
|
CoinPoolAPIURL string `json:"coin_pool_api_url"`
|
||||||
|
OITopAPIURL string `json:"oi_top_api_url"`
|
||||||
|
MaxDailyLoss float64 `json:"max_daily_loss"`
|
||||||
|
MaxDrawdown float64 `json:"max_drawdown"`
|
||||||
|
StopTradingMinutes int `json:"stop_trading_minutes"`
|
||||||
|
Leverage LeverageConfig `json:"leverage"`
|
||||||
|
JWTSecret string `json:"jwt_secret"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// syncConfigToDatabase 从config.json读取配置并同步到数据库
|
||||||
|
func syncConfigToDatabase(database *config.Database) error {
|
||||||
|
// 检查config.json是否存在
|
||||||
|
if _, err := os.Stat("config.json"); os.IsNotExist(err) {
|
||||||
|
log.Printf("📄 config.json不存在,跳过同步")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取config.json
|
||||||
|
data, err := os.ReadFile("config.json")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("读取config.json失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析JSON
|
||||||
|
var configFile ConfigFile
|
||||||
|
if err := json.Unmarshal(data, &configFile); err != nil {
|
||||||
|
return fmt.Errorf("解析config.json失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("🔄 开始同步config.json到数据库...")
|
||||||
|
|
||||||
|
// 同步各配置项到数据库
|
||||||
|
configs := map[string]string{
|
||||||
|
"admin_mode": fmt.Sprintf("%t", configFile.AdminMode),
|
||||||
|
"api_server_port": strconv.Itoa(configFile.APIServerPort),
|
||||||
|
"use_default_coins": fmt.Sprintf("%t", configFile.UseDefaultCoins),
|
||||||
|
"coin_pool_api_url": configFile.CoinPoolAPIURL,
|
||||||
|
"oi_top_api_url": configFile.OITopAPIURL,
|
||||||
|
"max_daily_loss": fmt.Sprintf("%.1f", configFile.MaxDailyLoss),
|
||||||
|
"max_drawdown": fmt.Sprintf("%.1f", configFile.MaxDrawdown),
|
||||||
|
"stop_trading_minutes": strconv.Itoa(configFile.StopTradingMinutes),
|
||||||
|
}
|
||||||
|
|
||||||
|
// 同步default_coins(转换为JSON字符串存储)
|
||||||
|
if len(configFile.DefaultCoins) > 0 {
|
||||||
|
defaultCoinsJSON, err := json.Marshal(configFile.DefaultCoins)
|
||||||
|
if err == nil {
|
||||||
|
configs["default_coins"] = string(defaultCoinsJSON)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 同步杠杆配置
|
||||||
|
if configFile.Leverage.BTCETHLeverage > 0 {
|
||||||
|
configs["btc_eth_leverage"] = strconv.Itoa(configFile.Leverage.BTCETHLeverage)
|
||||||
|
}
|
||||||
|
if configFile.Leverage.AltcoinLeverage > 0 {
|
||||||
|
configs["altcoin_leverage"] = strconv.Itoa(configFile.Leverage.AltcoinLeverage)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果JWT密钥不为空,也同步
|
||||||
|
if configFile.JWTSecret != "" {
|
||||||
|
configs["jwt_secret"] = configFile.JWTSecret
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新数据库配置
|
||||||
|
for key, value := range configs {
|
||||||
|
if err := database.SetSystemConfig(key, value); err != nil {
|
||||||
|
log.Printf("⚠️ 更新配置 %s 失败: %v", key, err)
|
||||||
|
} else {
|
||||||
|
log.Printf("✓ 同步配置: %s = %s", key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("✅ config.json同步完成")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
fmt.Println("╔════════════════════════════════════════════════════════════╗")
|
fmt.Println("╔════════════════════════════════════════════════════════════╗")
|
||||||
fmt.Println("║ 🤖 AI多模型交易系统 - 支持 DeepSeek & Qwen ║")
|
fmt.Println("║ 🤖 AI多模型交易系统 - 支持 DeepSeek & Qwen ║")
|
||||||
@@ -34,6 +124,11 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer database.Close()
|
defer database.Close()
|
||||||
|
|
||||||
|
// 同步config.json到数据库
|
||||||
|
if err := syncConfigToDatabase(database); err != nil {
|
||||||
|
log.Printf("⚠️ 同步config.json到数据库失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// 获取系统配置
|
// 获取系统配置
|
||||||
useDefaultCoinsStr, _ := database.GetSystemConfig("use_default_coins")
|
useDefaultCoinsStr, _ := database.GetSystemConfig("use_default_coins")
|
||||||
useDefaultCoins := useDefaultCoinsStr == "true"
|
useDefaultCoins := useDefaultCoinsStr == "true"
|
||||||
|
|||||||
4
start.sh
4
start.sh
@@ -114,10 +114,10 @@ read_env_vars() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
# Validation: Database File (trading.db)
|
# Validation: Database File (config.db)
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
check_database() {
|
check_database() {
|
||||||
if [ ! -f "trading.db" ]; then
|
if [ ! -f "config.db" ]; then
|
||||||
print_info "数据库文件不存在,系统将在启动时自动创建"
|
print_info "数据库文件不存在,系统将在启动时自动创建"
|
||||||
else
|
else
|
||||||
print_success "数据库文件存在"
|
print_success "数据库文件存在"
|
||||||
|
|||||||
Reference in New Issue
Block a user