mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-06-06 05:51:19 +08:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user