From 3f002a193e5393c00c126e100f306bf0b1903915 Mon Sep 17 00:00:00 2001 From: sue <177699783@qq.com> Date: Thu, 30 Oct 2025 02:43:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=A1=AC=E7=BC=96=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 修复内容 ### 1. AI决策杠杆配置动态化 (decision/engine.go) - **问题**: System Prompt 中硬编码 50x/20x 杠杆,导致 AI 生成的决策不符合用户配置(5x) - **修复**: - buildSystemPrompt() 新增 btcEthLeverage, altcoinLeverage 参数 - System Prompt 文本使用动态杠杆值(第225-226行) - 示例 JSON 使用配置杠杆值(第299行) - 调用时传入实际配置值(第100行) - **影响**: AI 现在会根据用户配置的杠杆限制生成决策 ### 2. 前端初始余额显示优化 (web/src/components/EquityChart.tsx) - **问题**: 初始余额硬编码为 1000 USDT,与用户配置的 100 USDT 不符 - **修复**: 实现三级回退机制 1. 优先使用历史数据第一个点的 total_equity 2. 备用使用当前账户 account.total_equity 3. 最后使用默认值 100(匹配常见配置) - **影响**: 前端显示的初始余额现在与实际配置一致 ## 技术细节 **函数签名变更**: ```go // 修改前 func buildSystemPrompt(accountEquity float64) string // 修改后 func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage int) string ``` **React 状态优化**: ```typescript // 修改前 const initialBalance = history[0]?.total_equity || 1000; // 修改后 const initialBalance = history[0]?.total_equity || account?.total_equity || 100; ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: tinkle-community --- decision/engine.go | 10 +++++----- web/src/components/EquityChart.tsx | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/decision/engine.go b/decision/engine.go index f6676196..a25f3644 100644 --- a/decision/engine.go +++ b/decision/engine.go @@ -97,7 +97,7 @@ func GetFullDecision(ctx *Context) (*FullDecision, error) { } // 2. 构建 System Prompt(固定规则)和 User Prompt(动态数据) - systemPrompt := buildSystemPrompt(ctx.Account.TotalEquity) + systemPrompt := buildSystemPrompt(ctx.Account.TotalEquity, ctx.BTCETHLeverage, ctx.AltcoinLeverage) userPrompt := buildUserPrompt(ctx) // 3. 调用AI API(使用 system + user prompt) @@ -200,7 +200,7 @@ func calculateMaxCandidates(ctx *Context) int { } // buildSystemPrompt 构建 System Prompt(固定规则,可缓存) -func buildSystemPrompt(accountEquity float64) string { +func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage int) string { var sb strings.Builder // === 核心使命 === @@ -222,8 +222,8 @@ func buildSystemPrompt(accountEquity float64) string { sb.WriteString("# ⚖️ 硬约束(风险控制)\n\n") sb.WriteString("1. **风险回报比**: 必须 ≥ 1:3(冒1%风险,赚3%+收益)\n") sb.WriteString("2. **最多持仓**: 3个币种(质量>数量)\n") - sb.WriteString(fmt.Sprintf("3. **单币仓位**: 山寨%.0f-%.0f U(20x杠杆) | BTC/ETH %.0f-%.0f U(50x杠杆)\n", - accountEquity*0.8, accountEquity*1.5, accountEquity*5, accountEquity*10)) + sb.WriteString(fmt.Sprintf("3. **单币仓位**: 山寨%.0f-%.0f U(%dx杠杆) | BTC/ETH %.0f-%.0f U(%dx杠杆)\n", + accountEquity*0.8, accountEquity*1.5, altcoinLeverage, accountEquity*5, accountEquity*10, btcEthLeverage)) sb.WriteString("4. **保证金**: 总使用率 ≤ 90%\n\n") // === 做空激励 === @@ -296,7 +296,7 @@ func buildSystemPrompt(accountEquity float64) string { sb.WriteString("简洁分析你的思考过程\n\n") sb.WriteString("**第二步: JSON决策数组**\n\n") sb.WriteString("```json\n[\n") - sb.WriteString(fmt.Sprintf(" {\"symbol\": \"BTCUSDT\", \"action\": \"open_short\", \"leverage\": 50, \"position_size_usd\": %.0f, \"stop_loss\": 97000, \"take_profit\": 91000, \"confidence\": 85, \"risk_usd\": 300, \"reasoning\": \"下跌趋势+MACD死叉\"},\n", accountEquity*5)) + sb.WriteString(fmt.Sprintf(" {\"symbol\": \"BTCUSDT\", \"action\": \"open_short\", \"leverage\": %d, \"position_size_usd\": %.0f, \"stop_loss\": 97000, \"take_profit\": 91000, \"confidence\": 85, \"risk_usd\": 300, \"reasoning\": \"下跌趋势+MACD死叉\"},\n", btcEthLeverage, accountEquity*5)) sb.WriteString(" {\"symbol\": \"ETHUSDT\", \"action\": \"close_long\", \"reasoning\": \"止盈离场\"}\n") sb.WriteString("]\n```\n\n") sb.WriteString("**字段说明**:\n") diff --git a/web/src/components/EquityChart.tsx b/web/src/components/EquityChart.tsx index 505069b9..36f58342 100644 --- a/web/src/components/EquityChart.tsx +++ b/web/src/components/EquityChart.tsx @@ -80,8 +80,10 @@ export function EquityChart({ traderId }: EquityChartProps) { ? history.slice(-MAX_DISPLAY_POINTS) : history; - // 计算初始余额(使用第一个数据点) - const initialBalance = history[0]?.total_equity || 1000; + // 计算初始余额(使用第一个数据点,如果无数据则从account获取,最后才用默认值) + const initialBalance = history[0]?.total_equity + || account?.total_equity + || 100; // 默认值改为100,与常见配置一致 // 转换数据格式 const chartData = displayHistory.map((point) => {