Refactor: Enhance AI decision engine with Sharpe ratio optimization

Major improvements to the AI trading decision engine:
**Core Changes in decision/engine.go** (175 lines modified):
1. **Sharpe Ratio Optimization Focus**
   - Restructured system prompt to emphasize Sharpe ratio maximization
   - Added clear guidance: high-quality trades over frequent trading
   - Explained that 3-minute scan interval ≠ trade every cycle
2. **Trading Frequency Controls**
   - Defined optimal frequency: 2-4 trades/day (0.1-0.2 trades/hour)
   - Over-trading threshold: >2 trades/hour indicates issues
   - Minimum holding period: 30-60 minutes per position
3. **Long/Short Balance Incentives**
   - Emphasized equal profit potential for long and short positions
   - Removed long-bias with explicit short trading encouragement
   - Clear guidance: uptrend→long, downtrend→short, sideways→wait
4. **Stricter Entry Signal Standards**
   - Strong signals only: confidence ≥75, multi-indicator confirmation
   - Weak signals explicitly discouraged (single indicator, unclear trend)
   - Self-check mechanism to prevent premature re-entry (<30min)
5. **Enhanced Sharpe Ratio Feedback Loop**
   - Sharpe < -0.5: Stop trading for 6+ cycles (18min), deep reflection
   - Sharpe -0.5~0: Strict control, confidence >80 only
   - Sharpe 0~0.7: Maintain current strategy
   - Sharpe >0.7: Consider position size increase
6. **Risk-Reward Ratio Validation**
   - Added hard constraint: R:R must be ≥ 3.0:1
   - Automatic calculation and validation in `validateDecision()`
   - Rejects trades with insufficient risk-reward ratio
7. **Improved Prompt Structure**
   - More organized sections with clear headers
   - Actionable guidance instead of abstract principles
   - Better examples for JSON output format
**Impact**: These changes should significantly improve trading quality,
reduce over-trading, and increase Sharpe ratio through better risk management
and trade selection discipline.
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
This commit is contained in:
tinkle-community
2025-10-29 12:49:34 +08:00
parent 9771fbdebf
commit 00291617f1

View File

@@ -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