From 273769e0468e40fc770ed7968badc92d77610ef2 Mon Sep 17 00:00:00 2001 From: sue <177699783@qq.com> Date: Thu, 30 Oct 2025 02:35:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?add=20=E5=B8=B8=E8=A7=81=E9=97=AE=E9=A2=98.?= =?UTF-8?q?md=20=E6=8F=90=E7=A4=BA=E5=A6=82=E4=BD=95=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=B8=81=E5=AE=89API=204061=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 常见问题.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 常见问题.md diff --git a/常见问题.md b/常见问题.md new file mode 100644 index 00000000..5d823205 --- /dev/null +++ b/常见问题.md @@ -0,0 +1,25 @@ +# 常见问题 + +## 币安持仓模式错误 (code=-4061) + +**错误信息**:`Order's position side does not match user's setting` + +**原因**:系统需要使用双向持仓模式,但您的币安账户设置为单向持仓。 + +### 解决方法 + +1. 登录 [币安合约交易平台](https://www.binance.com/zh-CN/futures/BTCUSDT) + +2. 点击右上角的 **⚙️ 偏好设置** + +3. 选择 **持仓模式** + +4. 切换为 **双向持仓** (Hedge Mode) + +5. 确认切换 + +**注意**:切换前必须先平掉所有持仓。 + +--- + +更多问题请查看 [GitHub Issues](https://github.com/tinkle-community/nofx/issues) From 66b8eb416b8b9f0f6e1337d67b4c36ae6f09caf6 Mon Sep 17 00:00:00 2001 From: sue <177699783@qq.com> Date: Thu, 30 Oct 2025 02:43:14 +0800 Subject: [PATCH 2/2] =?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: Claude --- 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) => {