diff --git a/api/server.go b/api/server.go index be99565d..dce35be6 100644 --- a/api/server.go +++ b/api/server.go @@ -210,6 +210,7 @@ type CreateTraderRequest struct { AIModelID string `json:"ai_model_id" binding:"required"` ExchangeID string `json:"exchange_id" binding:"required"` InitialBalance float64 `json:"initial_balance"` + ScanIntervalMinutes int `json:"scan_interval_minutes"` BTCETHLeverage int `json:"btc_eth_leverage"` AltcoinLeverage int `json:"altcoin_leverage"` TradingSymbols string `json:"trading_symbols"` @@ -332,6 +333,12 @@ func (s *Server) handleCreateTrader(c *gin.Context) { systemPromptTemplate = req.SystemPromptTemplate } + // 设置扫描间隔默认值 + scanIntervalMinutes := req.ScanIntervalMinutes + if scanIntervalMinutes <= 0 { + scanIntervalMinutes = 3 // 默认3分钟 + } + // ✨ 查询交易所实际余额,覆盖用户输入 actualBalance := req.InitialBalance // 默认使用用户输入 exchanges, err := s.database.GetExchanges(userID) @@ -416,7 +423,7 @@ func (s *Server) handleCreateTrader(c *gin.Context) { OverrideBasePrompt: req.OverrideBasePrompt, SystemPromptTemplate: systemPromptTemplate, IsCrossMargin: isCrossMargin, - ScanIntervalMinutes: 3, // 默认3分钟 + ScanIntervalMinutes: scanIntervalMinutes, IsRunning: false, } @@ -456,6 +463,7 @@ type UpdateTraderRequest struct { CustomPrompt string `json:"custom_prompt"` OverrideBasePrompt bool `json:"override_base_prompt"` IsCrossMargin *bool `json:"is_cross_margin"` + ScanIntervalMinutes int `json:"scan_interval_minutes"` } // handleUpdateTrader 更新交易员配置 @@ -505,6 +513,12 @@ func (s *Server) handleUpdateTrader(c *gin.Context) { altcoinLeverage = existingTrader.AltcoinLeverage // 保持原值 } + // 设置扫描间隔,允许更新 + scanIntervalMinutes := req.ScanIntervalMinutes + if scanIntervalMinutes <= 0 { + scanIntervalMinutes = existingTrader.ScanIntervalMinutes // 保持原值 + } + // 更新交易员配置 trader := &config.TraderRecord{ ID: traderID, @@ -513,14 +527,14 @@ func (s *Server) handleUpdateTrader(c *gin.Context) { AIModelID: req.AIModelID, ExchangeID: req.ExchangeID, InitialBalance: req.InitialBalance, - BTCETHLeverage: btcEthLeverage, AltcoinLeverage: altcoinLeverage, - TradingSymbols: req.TradingSymbols, - CustomPrompt: req.CustomPrompt, - OverrideBasePrompt: req.OverrideBasePrompt, - IsCrossMargin: isCrossMargin, - ScanIntervalMinutes: existingTrader.ScanIntervalMinutes, // 保持原值 - IsRunning: existingTrader.IsRunning, // 保持原值 + TradingSymbols: req.TradingSymbols, + CustomPrompt: req.CustomPrompt, + OverrideBasePrompt: req.OverrideBasePrompt, + SystemPromptTemplate: existingTrader.SystemPromptTemplate, // 保持原值 + IsCrossMargin: isCrossMargin, + ScanIntervalMinutes: scanIntervalMinutes, + IsRunning: existingTrader.IsRunning, // 保持原值 } // 更新数据库 @@ -868,12 +882,12 @@ func (s *Server) handleGetTraderConfig(c *gin.Context) { "ai_model": traderConfig.AIModelID, // 使用完整 ID "exchange_id": traderConfig.ExchangeID, "initial_balance": traderConfig.InitialBalance, + "scan_interval_minutes": traderConfig.ScanIntervalMinutes, "btc_eth_leverage": traderConfig.BTCETHLeverage, "altcoin_leverage": traderConfig.AltcoinLeverage, "trading_symbols": traderConfig.TradingSymbols, "custom_prompt": traderConfig.CustomPrompt, "override_base_prompt": traderConfig.OverrideBasePrompt, - "system_prompt_template": traderConfig.SystemPromptTemplate, // 添加此字段 "is_cross_margin": traderConfig.IsCrossMargin, "use_coin_pool": traderConfig.UseCoinPool, "use_oi_top": traderConfig.UseOITop, diff --git a/web/src/components/AITradersPage.tsx b/web/src/components/AITradersPage.tsx index 70d50508..e3ed14de 100644 --- a/web/src/components/AITradersPage.tsx +++ b/web/src/components/AITradersPage.tsx @@ -207,6 +207,7 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) { ai_model_id: ai_model_id, // 使用修正后的值 exchange_id: exchange_id, // 使用修正后的值 initial_balance: data.initial_balance, + scan_interval_minutes: data.scan_interval_minutes, btc_eth_leverage: data.btc_eth_leverage, altcoin_leverage: data.altcoin_leverage, trading_symbols: data.trading_symbols, diff --git a/web/src/components/TraderConfigModal.tsx b/web/src/components/TraderConfigModal.tsx index 2875ac6b..e6a0bd71 100644 --- a/web/src/components/TraderConfigModal.tsx +++ b/web/src/components/TraderConfigModal.tsx @@ -26,6 +26,7 @@ interface TraderConfigData { use_coin_pool: boolean; use_oi_top: boolean; initial_balance: number; + scan_interval_minutes: number; } interface TraderConfigModalProps { @@ -61,6 +62,7 @@ export function TraderConfigModal({ use_coin_pool: false, use_oi_top: false, initial_balance: 1000, + scan_interval_minutes: 3, }); const [isSaving, setIsSaving] = useState(false); const [availableCoins, setAvailableCoins] = useState([]); @@ -91,6 +93,7 @@ export function TraderConfigModal({ use_coin_pool: false, use_oi_top: false, initial_balance: 1000, + scan_interval_minutes: 3, }); } // 确保旧数据也有默认的 system_prompt_template @@ -185,6 +188,7 @@ export function TraderConfigModal({ use_coin_pool: formData.use_coin_pool, use_oi_top: formData.use_oi_top, initial_balance: formData.initial_balance, + scan_interval_minutes: formData.scan_interval_minutes, }; await onSave(saveData); onClose(); @@ -323,7 +327,25 @@ export function TraderConfigModal({ - {/* 第二行:杠杆设置 */} + {/* 第二行:AI 扫描决策间隔 */} +
+
+ + handleInputChange('scan_interval_minutes', Number(e.target.value))} + className="w-full px-3 py-2 bg-[#0B0E11] border border-[#2B3139] rounded text-[#EAECEF] focus:border-[#F0B90B] focus:outline-none" + min="1" + max="60" + step="1" + /> +

建议: 3-10分钟

+
+
+
+ + {/* 第三行:杠杆设置 */}
diff --git a/web/src/components/landing/CommunitySection.tsx b/web/src/components/landing/CommunitySection.tsx index d8165497..0e52d926 100644 --- a/web/src/components/landing/CommunitySection.tsx +++ b/web/src/components/landing/CommunitySection.tsx @@ -2,12 +2,12 @@ import { motion } from 'framer-motion' import AnimatedSection from './AnimatedSection' interface CardProps { - quote: string - authorName: string - handle: string - avatarUrl: string - tweetUrl: string - delay: number + quote: string; + authorName: string; + handle: string; + avatarUrl: string; + tweetUrl: string; + delay: number; } function TestimonialCard({ quote, authorName, delay }: CardProps) { diff --git a/web/src/types.ts b/web/src/types.ts index bcda735b..12682e17 100644 --- a/web/src/types.ts +++ b/web/src/types.ts @@ -125,6 +125,7 @@ export interface CreateTraderRequest { ai_model_id: string; exchange_id: string; initial_balance: number; + scan_interval_minutes?: number; btc_eth_leverage?: number; altcoin_leverage?: number; trading_symbols?: string; @@ -199,5 +200,6 @@ export interface TraderConfigData { use_coin_pool: boolean; use_oi_top: boolean; initial_balance: number; + scan_interval_minutes: number; is_running: boolean; }