mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2025-12-06 13:54:41 +08:00
* feat: add Strategy Studio with multi-timeframe support - Add Strategy Studio page with three-column layout for strategy management - Support multi-timeframe K-line data selection (5m, 15m, 1h, 4h, etc.) - Add GetWithTimeframes() function in market package for fetching multiple timeframes - Add TimeframeSeriesData struct for storing per-timeframe technical indicators - Update formatMarketData() to display all selected timeframes in AI prompt - Add strategy API endpoints for CRUD operations and test run - Integrate real AI test runs with configured AI models - Support custom AI500 and OI Top API URLs from strategy config * docs: add Strategy Studio screenshot to README files * fix: correct strategy-studio.png filename case in README * refactor: remove legacy signal source config and simplify trader creation - Remove signal source configuration from traders page (now handled by strategy) - Remove advanced options (legacy config) from TraderConfigModal - Rename default strategy to "默认山寨策略" with AI500 coin pool URL - Delete SignalSourceModal and SignalSourceWarning components - Clean up related stores, hooks, and page components
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package store
|
|
|
|
import (
|
|
"database/sql"
|
|
)
|
|
|
|
// SystemConfigStore 系统配置存储
|
|
type SystemConfigStore struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func (s *SystemConfigStore) initTables() error {
|
|
_, err := s.db.Exec(`
|
|
CREATE TABLE IF NOT EXISTS system_config (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 触发器
|
|
_, err = s.db.Exec(`
|
|
CREATE TRIGGER IF NOT EXISTS update_system_config_updated_at
|
|
AFTER UPDATE ON system_config
|
|
BEGIN
|
|
UPDATE system_config SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;
|
|
END
|
|
`)
|
|
return err
|
|
}
|
|
|
|
func (s *SystemConfigStore) initDefaultData() error {
|
|
configs := map[string]string{
|
|
"beta_mode": "false",
|
|
"api_server_port": "8080",
|
|
"max_daily_loss": "10.0",
|
|
"max_drawdown": "20.0",
|
|
"stop_trading_minutes": "60",
|
|
"jwt_secret": "",
|
|
"registration_enabled": "true",
|
|
}
|
|
|
|
for key, value := range configs {
|
|
_, err := s.db.Exec(`INSERT OR IGNORE INTO system_config (key, value) VALUES (?, ?)`, key, value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Get 获取配置值
|
|
func (s *SystemConfigStore) Get(key string) (string, error) {
|
|
var value string
|
|
err := s.db.QueryRow(`SELECT value FROM system_config WHERE key = ?`, key).Scan(&value)
|
|
return value, err
|
|
}
|
|
|
|
// Set 设置配置值
|
|
func (s *SystemConfigStore) Set(key, value string) error {
|
|
_, err := s.db.Exec(`INSERT OR REPLACE INTO system_config (key, value) VALUES (?, ?)`, key, value)
|
|
return err
|
|
}
|