From a2411d284339093a3edbd220e8a49a98f45c202b Mon Sep 17 00:00:00 2001 From: ZhouYongyou <128128010+zhouyongyou@users.noreply.github.com> Date: Sun, 2 Nov 2025 01:09:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=84=AA=E5=8C=96=20engine.go=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8A=A0=E8=BC=89=E9=82=8F=E8=BC=AF=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E7=AD=96=E7=95=A5=E9=87=8D=E8=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 問題 - 之前邏輯:加載模板 → 無條件追加硬編碼策略 - 結果:選擇 adaptive 模板時,會收到重複的策略內容 * adaptive.txt: 259 行 * 硬編碼: 184 行 * 總計:443 行重複指導 ❌ ## 解決方案 使用 templateLoaded 標記追蹤模板加載狀態: - ✅ 模板成功 → 使用模板,跳過硬編碼 - ❌ 模板失敗 → 使用硬編碼作為 fallback ## 變更內容 1. 添加 templateLoaded bool 變量 2. 硬編碼策略包裹在 `if !templateLoaded {}` 中(277-463 行) 3. 硬約束和輸出格式始終追加(不受影響) 4. 添加日誌追蹤模板使用情況 ## 測試驗證 - ✅ Go 編譯成功 - ✅ Docker build 成功 - ✅ 向後兼容(模板失敗時回退到硬編碼) ## 架構改進 ``` 加載流程: 1. 嘗試加載指定模板(如 adaptive) 2. 失敗 → 嘗試 default 3. 仍失敗 → 使用硬編碼 4. 追加硬約束(動態生成) 5. 追加輸出格式(動態生成) ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- decision/engine.go | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/decision/engine.go b/decision/engine.go index 1ef6c76f..0803ea05 100644 --- a/decision/engine.go +++ b/decision/engine.go @@ -242,25 +242,31 @@ func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage in templateName = "default" // 默认使用 default 模板 } + // 追踪模板是否成功加载(用于决定是否使用硬编码 fallback) + templateLoaded := false + template, err := GetPromptTemplate(templateName) if err != nil { // 如果模板不存在,记录错误并使用 default log.Printf("⚠️ 提示词模板 '%s' 不存在,使用 default: %v", templateName, err) template, err = GetPromptTemplate("default") if err != nil { - // 如果连 default 都不存在,使用内置的简化版本 - log.Printf("❌ 无法加载任何提示词模板,使用内置简化版本") - sb.WriteString("你是专业的加密货币交易AI。请根据市场数据做出交易决策。\n\n") + // 如果连 default 都不存在,将使用下方的硬编码策略 + log.Printf("❌ 无法加载任何提示词模板,将使用硬编码策略") } else { sb.WriteString(template.Content) sb.WriteString("\n\n") + templateLoaded = true + log.Printf("✓ 使用 default 模板(fallback)") } } else { sb.WriteString(template.Content) sb.WriteString("\n\n") + templateLoaded = true + log.Printf("✓ 使用 %s 模板", templateName) } - // 2. 硬约束(风险控制)- 动态生成 + // 2. 硬约束(风险控制)- 动态生成(始终追加) sb.WriteString("# 硬约束(风险控制)\n\n") sb.WriteString("1. 风险回报比: 必须 ≥ 1:3(冒1%风险,赚3%+收益)\n") sb.WriteString("2. 最多持仓: 3个币种(质量>数量)\n") @@ -268,8 +274,11 @@ func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage in accountEquity*0.8, accountEquity*1.5, altcoinLeverage, accountEquity*5, accountEquity*10, btcEthLeverage)) sb.WriteString("4. 保证金: 总使用率 ≤ 90%\n\n") - // 市场状态判断与策略选择 - sb.WriteString("# 市场状态判断(优先)\n\n") + // 3. 硬编码策略(仅当模板加载失败时使用) + if !templateLoaded { + log.Printf("⚠️ 追加硬编码策略作为 fallback") + // 市场状态判断与策略选择 + sb.WriteString("# 市场状态判断(优先)\n\n") sb.WriteString("在制定交易决策前,必须先判断当前市场状态:\n\n") sb.WriteString("判断方法(多个指标交叉验证):\n\n") sb.WriteString("1. 多时间框架一致性:\n") @@ -451,8 +460,9 @@ func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage in sb.WriteString("2. 评估持仓: 趋势是否改变?是否该止盈/止损?\n") sb.WriteString("3. 寻找新机会: 有强信号吗?多空机会?\n") sb.WriteString("4. 输出决策: 思维链分析 + JSON\n\n") + } // 结束 if !templateLoaded 区块 - // 3. 输出格式 - 动态生成 + // 4. 输出格式 - 动态生成(始终追加) sb.WriteString("#输出格式\n\n") sb.WriteString("第一步: 思维链(纯文本)\n") sb.WriteString("简洁分析你的思考过程\n\n")