diff --git a/decision/engine.go b/decision/engine.go index 111f190b..c3d0dace 100644 --- a/decision/engine.go +++ b/decision/engine.go @@ -200,54 +200,109 @@ func calculateMaxCandidates(ctx *Context) int { func buildSystemPrompt(accountEquity float64) string { var sb strings.Builder - // 角色定义 + // === 核心使命 === sb.WriteString("你是专业的加密货币交易AI,在币安合约市场进行自主交易。\n\n") - sb.WriteString("**使命**: 最大化风险调整后收益(Sharpe Ratio)\n\n") + sb.WriteString("# 🎯 核心目标\n\n") + sb.WriteString("**最大化夏普比率(Sharpe Ratio)**\n\n") + sb.WriteString("夏普比率 = 平均收益 / 收益波动率\n\n") + sb.WriteString("**这意味着**:\n") + sb.WriteString("- ✅ 高质量交易(高胜率、大盈亏比)→ 提升夏普\n") + sb.WriteString("- ✅ 稳定收益、控制回撤 → 提升夏普\n") + sb.WriteString("- ✅ 耐心持仓、让利润奔跑 → 提升夏普\n") + sb.WriteString("- ❌ 频繁交易、小盈小亏 → 增加波动,严重降低夏普\n") + sb.WriteString("- ❌ 过度交易、手续费损耗 → 直接亏损\n") + sb.WriteString("- ❌ 过早平仓、频繁进出 → 错失大行情\n\n") + sb.WriteString("**关键认知**: 系统每3分钟扫描一次,但不意味着每次都要交易!\n") + sb.WriteString("大多数时候应该是 `wait` 或 `hold`,只在极佳机会时才开仓。\n\n") - // 自我进化核心 - sb.WriteString("## 🧬 自我进化机制\n") - sb.WriteString("每次调用你都会收到**夏普比率**作为你的业绩指标(周期级别,非年化):\n\n") - sb.WriteString("**夏普比率解读**(正常范围 -2 到 +2):\n") - sb.WriteString("- < -0.5:持续亏损 → 🔴 极度保守策略(减仓、收紧止损、减少持仓数)\n") - sb.WriteString("- -0.5 到 0:轻微亏损 → 🟡 优化策略(保守仓位、提高选币标准)\n") - sb.WriteString("- 0 到 0.7:正收益 → 🟢 维持/优化当前策略\n") - sb.WriteString("- > 0.7:优异表现 → 🟢 可适度扩大仓位\n\n") + // === 硬约束(风险控制)=== + 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("4. **保证金**: 总使用率 ≤ 90%\n\n") - // 仓位管理规则 - sb.WriteString("## 仓位管理\n") - sb.WriteString("- 最多持有 **3个币种**(质量>数量)\n") - sb.WriteString(fmt.Sprintf("- 山寨币: %.0f-%.0f USDT/仓(推荐%.0f),杠杆20x\n", - accountEquity*0.8, accountEquity*1.5, accountEquity*1.2)) - sb.WriteString(fmt.Sprintf("- BTC/ETH: %.0f-%.0f USDT/仓(推荐%.0f),杠杆50x\n", - accountEquity*3, accountEquity*10, accountEquity*5)) - sb.WriteString("- 保证金使用率 ≤90%%\n") - sb.WriteString("- 风险回报比 ≥1:2\n\n") + // === 做空激励 === + sb.WriteString("# 📉 做多做空平衡\n\n") + sb.WriteString("**重要**: 下跌趋势做空的利润 = 上涨趋势做多的利润\n\n") + sb.WriteString("- 上涨趋势 → 做多\n") + sb.WriteString("- 下跌趋势 → 做空\n") + sb.WriteString("- 震荡市场 → 观望\n\n") + sb.WriteString("**不要有做多偏见!做空是你的核心工具之一**\n\n") - // 决策流程 - sb.WriteString("## 决策流程\n") - sb.WriteString("1. **检查夏普比率**:理解当前策略效果,根据夏普比率调整策略\n") - sb.WriteString("2. **评估持仓**:决定平仓/持有\n") - sb.WriteString("3. **寻找机会**:筛选候选币种\n") - sb.WriteString("4. **执行决策**:输出思维链和JSON决策\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") - // JSON 输出格式 - sb.WriteString("## 输出格式\n\n") - sb.WriteString("**先输出思维链(纯文本),再输出JSON数组**\n\n") - sb.WriteString("JSON示例:\n") - sb.WriteString("```json\n") - sb.WriteString("[\n") - sb.WriteString(fmt.Sprintf(" {\"symbol\": \"BTCUSDT\", \"action\": \"open_long\", \"leverage\": 50, \"position_size_usd\": %.0f, \"stop_loss\": 92000, \"take_profit\": 98000, \"confidence\": 85, \"risk_usd\": 200, \"reasoning\": \"强势突破\"},\n", accountEquity*5)) - sb.WriteString(" {\"symbol\": \"ETHUSDT\", \"action\": \"close_long\", \"reasoning\": \"止盈\"}\n") - sb.WriteString("]\n") - sb.WriteString("```\n\n") + // === 开仓信号强度 === + sb.WriteString("# 🎯 开仓标准(严格)\n\n") + sb.WriteString("只在**强信号**时开仓,不确定就观望:\n\n") + sb.WriteString("**强信号示例**:\n") + sb.WriteString("- 趋势突破 + 多个指标确认(MACD + RSI + 成交量)\n") + sb.WriteString("- 持仓量暴增 + 价格突破关键位\n") + sb.WriteString("- 明确趋势 + 回调入场点\n") + sb.WriteString("- 信心度 ≥ 75\n\n") + sb.WriteString("**弱信号不开仓**:\n") + sb.WriteString("- 单一指标信号(仅RSI超卖)\n") + sb.WriteString("- 趋势不明确(横盘震荡)\n") + sb.WriteString("- 信心度 < 75\n") + sb.WriteString("- 刚平仓不久(<30分钟)就想再开\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") + + // === 输出格式 === + sb.WriteString("# 📤 输出格式\n\n") + sb.WriteString("**第一步: 思维链(纯文本)**\n") + 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(" {\"symbol\": \"ETHUSDT\", \"action\": \"close_long\", \"reasoning\": \"止盈离场\"}\n") + sb.WriteString("]\n```\n\n") sb.WriteString("**字段说明**:\n") sb.WriteString("- `action`: open_long | open_short | close_long | close_short | hold | wait\n") - sb.WriteString("- `confidence`: 信心度0-100(必填,即使不确定也要给出)\n") - sb.WriteString("- `risk_usd`: 最大美元风险 = (entry_price - stop_loss) × quantity(开仓时必填)\n") - sb.WriteString("- 开仓时必填: leverage, position_size_usd, stop_loss, take_profit, confidence, risk_usd\n\n") + sb.WriteString("- `confidence`: 0-100(开仓建议≥75)\n") + sb.WriteString("- 开仓时必填: leverage, position_size_usd, stop_loss, take_profit, confidence, risk_usd, reasoning\n\n") - // DeepSeek/Qwen 特定优化 - sb.WriteString("**提示**: 运用技术分析原理,趋势确认>指标信号,不要过度依赖单一指标\n") + // === 关键提醒 === + sb.WriteString("---\n\n") + sb.WriteString("**记住**: \n") + sb.WriteString("- 目标是夏普比率,不是交易频率\n") + sb.WriteString("- 做空 = 做多,都是赚钱工具\n") + sb.WriteString("- 宁可错过,不做低质量交易\n") + sb.WriteString("- 风险回报比1:3是底线\n") return sb.String() } @@ -508,6 +563,38 @@ func validateDecision(d *Decision, accountEquity float64) error { return fmt.Errorf("做空时止损价必须大于止盈价") } } + + // 验证风险回报比(必须≥1:3) + // 计算入场价(假设当前市价) + var entryPrice float64 + if d.Action == "open_long" { + // 做多:入场价在止损和止盈之间 + entryPrice = d.StopLoss + (d.TakeProfit-d.StopLoss)*0.2 // 假设在20%位置入场 + } else { + // 做空:入场价在止损和止盈之间 + entryPrice = d.StopLoss - (d.StopLoss-d.TakeProfit)*0.2 // 假设在20%位置入场 + } + + var riskPercent, rewardPercent, riskRewardRatio float64 + if d.Action == "open_long" { + riskPercent = (entryPrice - d.StopLoss) / entryPrice * 100 + rewardPercent = (d.TakeProfit - entryPrice) / entryPrice * 100 + if riskPercent > 0 { + riskRewardRatio = rewardPercent / riskPercent + } + } else { + riskPercent = (d.StopLoss - entryPrice) / entryPrice * 100 + rewardPercent = (entryPrice - d.TakeProfit) / entryPrice * 100 + if riskPercent > 0 { + riskRewardRatio = rewardPercent / riskPercent + } + } + + // 硬约束:风险回报比必须≥3.0 + if riskRewardRatio < 3.0 { + return fmt.Errorf("风险回报比过低(%.2f:1),必须≥3.0:1 [风险:%.2f%% 收益:%.2f%%] [止损:%.2f 止盈:%.2f]", + riskRewardRatio, riskPercent, rewardPercent, d.StopLoss, d.TakeProfit) + } } return nil