refactor: 移除 engine.go 冗餘硬編碼策略,優化模板系統

## 問題
用戶反饋:「怎麼 engine.go 還寫入了這些?... 有必要嗎?」

**根本原因**:
- prompts/ 目錄下已有 default.txt (114行) 和 adaptive.txt (259行)
- engine.go 卻硬編碼了 183 行 adaptive 策略作為 fallback
- 這導致:
  1. 重複維護兩份相同的策略內容
  2. templateLoaded 標記多餘(模板系統本身已有 fallback)
  3. 如果 default.txt 都加載失敗,說明文件系統有嚴重問題,不應繼續交易

## 解決方案

### 1. 移除冗餘硬編碼
- 刪除 183 行硬編碼 adaptive 策略(271-453 行)
- 移除 templateLoaded 標記及其邏輯

### 2. 簡化模板加載邏輯
```go
// 之前(複雜)
templateLoaded := false
if 模板加載成功 {
    templateLoaded = true
}
if !templateLoaded {
    追加 183 行硬編碼策略  //  冗餘
}

// 現在(簡潔)
if 用戶模板加載失敗 {
    嘗試 default.txt  //  已經是 fallback
}
if default.txt 也失敗 {
    返回空字符串,上層應停止交易  //  安全
}
```

### 3. 新增動態止盈止損設計文檔
創建 `DYNAMIC_TP_SL_PROPOSAL.md`,記錄:
- 用戶反饋:「建议加个 adjust tp sl 或者给 close 加个 quantity」
- 問題分析:策略提到追蹤止損,但 AI 無法執行
- 解決方案:添加 `adjust_stop_loss`, `adjust_take_profit`, `partial_close` actions
- 實施步驟:修改 Decision 結構、執行邏輯、模板說明

## 測試驗證
-  Go 編譯成功
-  Docker build 成功
-  模板系統邏輯清晰(用戶模板 → default → 報錯)
-  代碼減少 183 行(更易維護)

## 檔案變更
- `decision/engine.go`: -183 行硬編碼策略
- `DYNAMIC_TP_SL_PROPOSAL.md`: +300 行設計文檔

## 後續工作
- [ ] 實現 adjust_stop_loss action
- [ ] 實現 partial_close action
- [ ] 更新模板文件說明新 actions

---

感謝 @user 指出這個設計缺陷!🙏

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
ZhouYongyou
2025-11-02 01:18:57 +08:00
parent a2411d2843
commit bac5744039
2 changed files with 333 additions and 202 deletions

View File

@@ -242,30 +242,24 @@ 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("❌ 无法加载任何提示词模板,将使用硬编码策略")
} else {
sb.WriteString(template.Content)
sb.WriteString("\n\n")
templateLoaded = true
log.Printf("✓ 使用 default 模板fallback")
// 如果连 default 都不存在,说明文件系统有严重问题
log.Printf("❌ 致命错误:无法加载任何提示词模板,系统无法安全运行")
return "" // 返回空字符串,上层应该检测并停止交易
}
log.Printf("✓ 使用 default 模板fallback")
} else {
sb.WriteString(template.Content)
sb.WriteString("\n\n")
templateLoaded = true
log.Printf("✓ 使用 %s 模板", templateName)
}
sb.WriteString(template.Content)
sb.WriteString("\n\n")
// 2. 硬约束(风险控制)- 动态生成(始终追加)
sb.WriteString("# 硬约束(风险控制)\n\n")
sb.WriteString("1. 风险回报比: 必须 ≥ 1:3冒1%风险赚3%+收益)\n")
@@ -274,195 +268,7 @@ 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")
// 3. 硬编码策略(仅当模板加载失败时使用
if !templateLoaded {
log.Printf("⚠️ 追加硬编码策略作为 fallback")
// 市场状态判断与策略选择
sb.WriteString("# 市场状态判断(优先)\n\n")
sb.WriteString("在制定交易决策前,必须先判断当前市场状态:\n\n")
sb.WriteString("判断方法(多个指标交叉验证):\n\n")
sb.WriteString("1. 多时间框架一致性:\n")
sb.WriteString("- 检查 15m/1h/4h MACD 方向一致度\n")
sb.WriteString("- 3个时间框架方向一致 → 强趋势市场\n")
sb.WriteString("- 2个时间框架方向一致 → 弱趋势市场\n")
sb.WriteString("- 方向矛盾15m上涨但1h下跌 → 震荡市场\n\n")
sb.WriteString("2. 价格波动率:\n")
sb.WriteString("- 最近 10 根 K线高-低)/收盘价 > 3% → 趋势市场(大波动)\n")
sb.WriteString("- 最近 10 根 K线高-低)/收盘价 < 1.5% → 震荡市场(小波动)\n\n")
sb.WriteString("3. 买卖压力极端值:\n")
sb.WriteString("- BuySellRatio > 0.75 连续 3 根以上 → 强趋势(多)\n")
sb.WriteString("- BuySellRatio < 0.25 连续 3 根以上 → 强趋势(空)\n")
sb.WriteString("- BuySellRatio 在 0.4-0.6 波动 → 震荡\n\n")
sb.WriteString("判断结论: 综合以上 3 个指标,判定当前市场状态为'趋势市场'或'震荡市场'\n\n")
// 双策略系统
sb.WriteString("# 双策略系统(根据市场状态选择)\n\n")
sb.WriteString("## 策略 A: 震荡交易(震荡市场时使用)\n\n")
sb.WriteString("策略定位: 专门做 BTC 震荡行情,快进快出,高胜率低盈亏比\n\n")
sb.WriteString("震荡区间识别:\n")
sb.WriteString("- 价格在15分钟/1小时 EMA20上下波动±2-4%\n")
sb.WriteString("- MACD 在零轴附近(-200到+200之间\n")
sb.WriteString("- 多个时间框架方向不一致如15m上涨但1h下跌\n")
sb.WriteString("- RSI 在30-70区间反复震荡\n\n")
sb.WriteString("交易逻辑:\n")
sb.WriteString("- 区间下沿RSI<35 或接近支撑) → 做多\n")
sb.WriteString("- 区间上沿RSI>65 或接近压力) → 做空\n")
sb.WriteString("- 趋势行情(多时间框架共振,放量突破) → 立即止损\n\n")
sb.WriteString("止盈止损设置(震荡策略 - 技术位优先):\n\n")
sb.WriteString("核心原则:技术位 > 固定百分比(避免价格到技术位就回撤)\n\n")
sb.WriteString("1. 入场前分析技术位:\n")
sb.WriteString("- 做多检查上方最近压力位15m/1h EMA20、最近10根K线高点、整数关口\n")
sb.WriteString("- 做空检查下方最近支撑位15m/1h EMA20、最近10根K线低点、整数关口\n\n")
sb.WriteString("2. 止盈设置逻辑:\n")
sb.WriteString("- 如果技术位距离 < 2% → 止盈设在技术位前 0.1%(例:压力 101,200止盈 101,100\n")
sb.WriteString("- 如果技术位距离 > 2% → 使用固定 2% 止盈\n")
sb.WriteString("- 理由:价格很可能在技术位遇阻,提前止盈避免回撤\n\n")
sb.WriteString("3. 止损设置:\n")
sb.WriteString("- 固定 0.8-1%(紧密止损)\n\n")
sb.WriteString("4. 追踪止损(持仓中动态调整):\n")
sb.WriteString("- 浮盈达到 0.8% → 止损移到成本价(保证不亏)\n")
sb.WriteString("- 浮盈达到 1.2% → 止损移到 +0.5%(锁定一半利润)\n")
sb.WriteString("- 价格距离技术位 < 0.3% → 立即主动平仓(避免回撤)\n\n")
sb.WriteString("5. 示例(做多):\n")
sb.WriteString("- 入场100,00015m EMA20: 101,200+1.2%\n")
sb.WriteString("- 决策:止盈 101,100技术位前 0.1%),而非 102,000\n")
sb.WriteString("- 持仓:价格到 101,000+1.0%)→ 止损移到 100,000\n")
sb.WriteString("- 持仓:价格到 101,100距离 EMA20 仅 0.1%)→ 立即平仓\n\n")
sb.WriteString("退出信号:\n")
sb.WriteString("- 多时间框架开始共振 → 市场转为趋势,立即止损\n\n")
// 策略 B: 趋势跟随
sb.WriteString("## 策略 B: 趋势跟随(趋势市场时使用)\n\n")
sb.WriteString("策略定位: 捕捉趋势行情,让利润奔跑,中等胜率高盈亏比\n\n")
sb.WriteString("趋势确认条件:\n")
sb.WriteString("- 多时间框架共振15m/1h/4h MACD 方向一致)\n")
sb.WriteString("- 连续 2-3 根 K线放量成交量 > 平均 1.5 倍)\n")
sb.WriteString("- 买卖压力极端BuySellRatio >0.7 或 <0.3\n")
sb.WriteString("- 价格突破关键位EMA20并回踩确认\n\n")
sb.WriteString("交易逻辑:\n")
sb.WriteString("- 突破后回踩入场(避免追高)\n")
sb.WriteString("- 顺势交易(多头趋势做多,空头趋势做空)\n")
sb.WriteString("- 持仓时间更长(至少 1-2 小时)\n\n")
sb.WriteString("止盈止损设置(趋势策略 - 技术位优先):\n\n")
sb.WriteString("核心原则:技术位 > 固定百分比,但给予更大空间\n\n")
sb.WriteString("1. 入场前分析技术位:\n")
sb.WriteString("- 做多检查上方关键压力位1h/4h EMA20、前高、整数关口\n")
sb.WriteString("- 做空检查下方关键支撑位1h/4h EMA20、前低、整数关口\n\n")
sb.WriteString("2. 止盈设置逻辑:\n")
sb.WriteString("- 如果技术位距离 < 5% → 止盈设在技术位前 0.2%\n")
sb.WriteString("- 如果技术位在 5-10% → 分两批止盈(第一批技术位,第二批 10%\n")
sb.WriteString("- 如果技术位距离 > 10% → 使用追踪止损,让利润奔跑\n\n")
sb.WriteString("3. 止损设置:\n")
sb.WriteString("- 固定 1.5-2%(给足震荡空间)\n\n")
sb.WriteString("4. 追踪止损(持仓中动态调整):\n")
sb.WriteString("- 浮盈达到 2% → 止损移到成本价(保证不亏)\n")
sb.WriteString("- 浮盈达到 3% → 止损移到 +1%(锁定部分利润)\n")
sb.WriteString("- 浮盈达到 5% → 止损移到 +2.5%(让利润奔跑,但保护已有收益)\n")
sb.WriteString("- 价格距离技术位 < 0.5% → 考虑主动平仓或分批平仓\n\n")
sb.WriteString("5. 示例(做多):\n")
sb.WriteString("- 入场100,0004h EMA20: 104,500+4.5%\n")
sb.WriteString("- 决策:第一目标 104,300技术位前第二目标 110,000+10%\n")
sb.WriteString("- 持仓:价格到 102,000+2%)→ 止损移到 100,000\n")
sb.WriteString("- 持仓:价格到 104,300接近技术位→ 主动平仓或分批平仓 50%\n\n")
sb.WriteString("退出信号:\n")
sb.WriteString("- 多时间框架方向开始矛盾 → 趋势减弱,获利离场\n")
sb.WriteString("- 成交量萎缩 + MACD 背离 → 趋势可能反转\n\n")
// 策略选择指导
sb.WriteString("## 策略选择指导\n\n")
sb.WriteString("必须在思维链中明确说明:\n")
sb.WriteString("1. 市场状态判断: '当前市场状态:震荡/趋势(理由:...'\n")
sb.WriteString("2. 策略选择: '选择策略 A/B理由...'\n")
sb.WriteString("3. 技术位分析: '上方压力位101,20015m EMA20下方支撑位99,500最近低点'\n")
sb.WriteString("4. 止盈止损: '止盈 101,100技术位前 0.1%),止损 99,200-0.8%'\n")
sb.WriteString("5. 追踪止损计划: '浮盈 0.8% 时移动止损到成本价'\n\n")
sb.WriteString("重要提醒:\n")
sb.WriteString("- 价格很可能在技术位EMA20、前高前低、整数关口遇阻或反弹\n")
sb.WriteString("- 宁可少赚 0.5%,也不要从 +1.5% 回撤到止损\n")
sb.WriteString("- 持仓中主动调整止损,锁定利润\n\n")
// === 交易频率认知 ===
sb.WriteString("# ⏱️ 交易频率认知\n\n")
sb.WriteString("量化标准:\n")
sb.WriteString("- 优秀交易员每天2-4笔 = 每小时0.1-0.2笔\n")
sb.WriteString("- 过度交易:每小时>2笔 = 严重问题\n")
sb.WriteString("- 最佳节奏开仓后持有至少30-60分钟\n\n")
sb.WriteString("自查:\n")
sb.WriteString("如果你发现自己每个周期都在交易 → 说明标准太低\n")
sb.WriteString("如果你发现持仓<30分钟就平仓 → 说明太急躁\n\n")
// === 开仓信号强度 ===
sb.WriteString("# 🎯 开仓标准(严格)\n\n")
sb.WriteString("只在强信号时开仓,不确定就观望。\n\n")
sb.WriteString("你拥有的完整数据(专为震荡交易优化):\n\n")
sb.WriteString("📊 四个时间框架序列每个包含最近10个数据点\n")
sb.WriteString("1. 3分钟序列实时价格 + 放量分析(当前价格 = 最后一根K线的收盘价\n")
sb.WriteString(" - Mid prices, EMA20, MACD, RSI7, RSI14\n")
sb.WriteString(" - Volumes: 成交量序列(用于检测放量)\n")
sb.WriteString(" - BuySellRatios: 买卖压力比(>0.6多方强,<0.4空方强)\n")
sb.WriteString("2. 15分钟序列短期震荡区间识别覆盖最近2.5小时)\n")
sb.WriteString(" - Mid prices, EMA20, MACD, RSI7, RSI14\n")
sb.WriteString("3. 1小时序列中期支撑压力确认覆盖最近10小时\n")
sb.WriteString(" - Mid prices, EMA20, MACD, RSI7, RSI14\n")
sb.WriteString("4. 4小时序列大趋势预警覆盖最近40小时\n")
sb.WriteString(" - EMA20 vs EMA50, ATR, Volume, MACD, RSI14\n\n")
sb.WriteString("💰 资金数据:\n")
sb.WriteString("- 持仓量(OI)变化、资金费率、成交量对比\n\n")
sb.WriteString("🎯 震荡交易分析方法:\n\n")
sb.WriteString("1. 震荡区间识别:\n")
sb.WriteString("- 价格在15m/1h EMA20 上下±2-4%波动\n")
sb.WriteString("- RSI 在30-70区间反复未出现持续超买/超卖\n")
sb.WriteString("- MACD 在零轴附近震荡,未出现明确金叉/死叉\n")
sb.WriteString("- 1h和4h时间框架方向不一致矛盾 = 震荡)\n\n")
sb.WriteString("2. 买卖压力分析3分钟放量检测\n")
sb.WriteString("- 连续放量 = 最近2-3根3分钟K线成交量 > 平均成交量1.5倍\n")
sb.WriteString("- 买方力量BuySellRatio > 0.6(主动买入占比 > 60%\n")
sb.WriteString("- 卖方力量BuySellRatio < 0.4(主动卖出占比 > 60%\n")
sb.WriteString("- 放量+买压 → 可能向上突破,做多或止损空单\n")
sb.WriteString("- 放量+卖压 → 可能向下突破,做空或止损多单\n\n")
sb.WriteString("3. 入场信号(高胜率位置):\n")
sb.WriteString("- 区间下沿做多RSI < 35 + 买卖压力比 > 0.5 + 价格接近15m EMA20下方\n")
sb.WriteString("- 区间上沿做空RSI > 65 + 买卖压力比 < 0.5 + 价格接近15m EMA20上方\n")
sb.WriteString("- 综合信心度 ≥ 75 才开仓\n\n")
sb.WriteString("4. 止损信号(趋势突破,立即离场):\n")
sb.WriteString("- 多时间框架共振15m/1h/4h方向一致\n")
sb.WriteString("- 连续2根以上3分钟K线放量突破区间\n")
sb.WriteString("- MACD 突破零轴并加速\n\n")
sb.WriteString("避免低质量信号:\n")
sb.WriteString("- 单一维度(只看一个指标)\n")
sb.WriteString("- 区间中部交易(等待区间边界)\n")
sb.WriteString("- 刚平仓不久(<10分钟\n")
sb.WriteString("- 无买卖压力确认的入场\n\n")
// === 夏普比率自我进化 ===
sb.WriteString("# 🧬 夏普比率自我进化\n\n")
sb.WriteString("每次你会收到夏普比率作为绩效反馈(周期级别):\n\n")
sb.WriteString("夏普比率 < -0.5 (持续亏损):\n")
sb.WriteString(" → 🛑 停止交易连续观望至少6个周期18分钟\n")
sb.WriteString(" → 🔍 深度反思:\n")
sb.WriteString(" • 交易频率过高?(每小时>2次就是过度\n")
sb.WriteString(" • 持仓时间过短?(<30分钟就是过早平仓\n")
sb.WriteString(" • 信号强度不足?(信心度<75\n")
sb.WriteString(" • 是否在做空?(单边做多是错误的)\n\n")
sb.WriteString("夏普比率 -0.5 ~ 0 (轻微亏损):\n")
sb.WriteString(" → ⚠️ 严格控制:只做信心度>80的交易\n")
sb.WriteString(" → 减少交易频率每小时最多1笔新开仓\n")
sb.WriteString(" → 耐心持仓至少持有30分钟以上\n\n")
sb.WriteString("夏普比率 0 ~ 0.7 (正收益):\n")
sb.WriteString(" → ✅ 维持当前策略\n\n")
sb.WriteString("夏普比率 > 0.7 (优异表现):\n")
sb.WriteString(" → 🚀 可适度扩大仓位\n\n")
sb.WriteString("关键: 夏普比率是唯一指标,它会自然惩罚频繁交易和过度进出。\n\n")
// === 决策流程 ===
sb.WriteString("# 📋 决策流程\n\n")
sb.WriteString("1. 分析夏普比率: 当前策略是否有效?需要调整吗?\n")
sb.WriteString("2. 评估持仓: 趋势是否改变?是否该止盈/止损?\n")
sb.WriteString("3. 寻找新机会: 有强信号吗?多空机会?\n")
sb.WriteString("4. 输出决策: 思维链分析 + JSON\n\n")
} // 结束 if !templateLoaded 区块
// 4. 输出格式 - 动态生成(始终追加)
// 3. 输出格式 - 动态生成(始终追加
sb.WriteString("#输出格式\n\n")
sb.WriteString("第一步: 思维链(纯文本)\n")
sb.WriteString("简洁分析你的思考过程\n\n")