From 00291617f1a0fbc7f5eb70bf9221af22132a8fc4 Mon Sep 17 00:00:00 2001 From: tinkle-community Date: Wed, 29 Oct 2025 12:49:34 +0800 Subject: [PATCH] =?UTF-8?q?Refactor:=20Enhance=20AI=20decision=20engine=20?= =?UTF-8?q?with=20Sharpe=20ratio=20optimization=20Major=20improvements=20t?= =?UTF-8?q?o=20the=20AI=20trading=20decision=20engine:=20**Core=20Changes?= =?UTF-8?q?=20in=20decision/engine.go**=20(175=20lines=20modified):=201.?= =?UTF-8?q?=20**Sharpe=20Ratio=20Optimization=20Focus**=20=20=20=20-=20Res?= =?UTF-8?q?tructured=20system=20prompt=20to=20emphasize=20Sharpe=20ratio?= =?UTF-8?q?=20maximization=20=20=20=20-=20Added=20clear=20guidance:=20high?= =?UTF-8?q?-quality=20trades=20over=20frequent=20trading=20=20=20=20-=20Ex?= =?UTF-8?q?plained=20that=203-minute=20scan=20interval=20=E2=89=A0=20trade?= =?UTF-8?q?=20every=20cycle=202.=20**Trading=20Frequency=20Controls**=20?= =?UTF-8?q?=20=20=20-=20Defined=20optimal=20frequency:=202-4=20trades/day?= =?UTF-8?q?=20(0.1-0.2=20trades/hour)=20=20=20=20-=20Over-trading=20thresh?= =?UTF-8?q?old:=20>2=20trades/hour=20indicates=20issues=20=20=20=20-=20Min?= =?UTF-8?q?imum=20holding=20period:=2030-60=20minutes=20per=20position=203?= =?UTF-8?q?.=20**Long/Short=20Balance=20Incentives**=20=20=20=20-=20Emphas?= =?UTF-8?q?ized=20equal=20profit=20potential=20for=20long=20and=20short=20?= =?UTF-8?q?positions=20=20=20=20-=20Removed=20long-bias=20with=20explicit?= =?UTF-8?q?=20short=20trading=20encouragement=20=20=20=20-=20Clear=20guida?= =?UTF-8?q?nce:=20uptrend=E2=86=92long,=20downtrend=E2=86=92short,=20sidew?= =?UTF-8?q?ays=E2=86=92wait=204.=20**Stricter=20Entry=20Signal=20Standards?= =?UTF-8?q?**=20=20=20=20-=20Strong=20signals=20only:=20confidence=20?= =?UTF-8?q?=E2=89=A575,=20multi-indicator=20confirmation=20=20=20=20-=20We?= =?UTF-8?q?ak=20signals=20explicitly=20discouraged=20(single=20indicator,?= =?UTF-8?q?=20unclear=20trend)=20=20=20=20-=20Self-check=20mechanism=20to?= =?UTF-8?q?=20prevent=20premature=20re-entry=20(<30min)=205.=20**Enhanced?= =?UTF-8?q?=20Sharpe=20Ratio=20Feedback=20Loop**=20=20=20=20-=20Sharpe=2080=20only=20=20=20=20-=20Sharpe=200~0.7:=20M?= =?UTF-8?q?aintain=20current=20strategy=20=20=20=20-=20Sharpe=20>0.7:=20Co?= =?UTF-8?q?nsider=20position=20size=20increase=206.=20**Risk-Reward=20Rati?= =?UTF-8?q?o=20Validation**=20=20=20=20-=20Added=20hard=20constraint:=20R:?= =?UTF-8?q?R=20must=20be=20=E2=89=A5=203.0:1=20=20=20=20-=20Automatic=20ca?= =?UTF-8?q?lculation=20and=20validation=20in=20`validateDecision()`=20=20?= =?UTF-8?q?=20=20-=20Rejects=20trades=20with=20insufficient=20risk-reward?= =?UTF-8?q?=20ratio=207.=20**Improved=20Prompt=20Structure**=20=20=20=20-?= =?UTF-8?q?=20More=20organized=20sections=20with=20clear=20headers=20=20?= =?UTF-8?q?=20=20-=20Actionable=20guidance=20instead=20of=20abstract=20pri?= =?UTF-8?q?nciples=20=20=20=20-=20Better=20examples=20for=20JSON=20output?= =?UTF-8?q?=20format=20**Impact**:=20These=20changes=20should=20significan?= =?UTF-8?q?tly=20improve=20trading=20quality,=20reduce=20over-trading,=20a?= =?UTF-8?q?nd=20increase=20Sharpe=20ratio=20through=20better=20risk=20mana?= =?UTF-8?q?gement=20and=20trade=20selection=20discipline.=20Co-Authored-By?= =?UTF-8?q?:=20tinkle-community=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decision/engine.go | 167 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 127 insertions(+), 40 deletions(-) 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