From 27bd4e97e9e253f084448f35f9be56f7dccef21d Mon Sep 17 00:00:00 2001 From: aaron <> Date: Tue, 3 Mar 2026 01:00:14 +0800 Subject: [PATCH] update --- .../crypto_agent/market_signal_analyzer.py | 162 +++++++++++++++--- .../crypto_agent/trading_decision_maker.py | 106 +++++++----- 2 files changed, 199 insertions(+), 69 deletions(-) diff --git a/backend/app/crypto_agent/market_signal_analyzer.py b/backend/app/crypto_agent/market_signal_analyzer.py index 31a043c..8df2389 100644 --- a/backend/app/crypto_agent/market_signal_analyzer.py +++ b/backend/app/crypto_agent/market_signal_analyzer.py @@ -409,25 +409,59 @@ class MarketSignalAnalyzer: ## 八、入场方式(日内优化) 根据市场分析综合判断入场方式: -### market(现价立即入场) +### market(现价立即入场)- 两种场景 + +#### 场景1:强趋势突破(稳健型) 使用场景: - ✅ 强共振信号(A级,confidence ≥ 85) - ✅ 放量突破关键位,趋势明确 - ✅ 多周期同时突破,等待可能错过机会 - ✅ 市场波动大,价格变化快 - ✅ 15m RSI 50-70(多)或 30-50(空)- 不极端 +- **止损设置**:正常止损(1-1.5%),正常仓位 +- **盈亏比要求**:≥ 1:1.5 + +#### 场景2:快速突破博弈(激进型,新增!) +使用场景: +- ✅ **价格正在快速移动**(5m K线连续2-3根同向大阳/阴线) +- ✅ **放量突破关键阻力/支撑**(量比 > 1.5) +- ✅ **价格偏离 EMA5/EMA15 > 0.5%**,趋势加速中 +- ✅ **突破后回调可能性小**(强势突破不回头) +- ⚠️ **可以用更小止损**(0.8-1%),更快止盈(1.5-2%) +- ⚠️ **仓位减半**(micro 仓位),降低单笔风险 +- ⚠️ **盈亏比要求**:≥ 1:1.5(虽然止损小,但目标也近) + +**快速博弈示例**: +``` +BTC 当前价格 $68,000,突然放量突破 $68,200 阻力位 +→ 5m 连续3根阳线,价格从 $67,800 涨到 $68,300 +→ 量比 2.0,价格偏离 EMA5 约 0.8% +→ 决策:market 现价做多 @ $68,300 +→ 止损:$67,700(-0.88%,小止损快速离场) +→ 止盈:$69,200(+1.32%,快速获利) +→ 盈亏比:1.5 ✅ +→ 仓位:micro(1%),降低风险 +``` + +**为什么快速突破用小止损?** +- 突破后如果立即回调,说明是假突破,快速止损 +- 真突破会继续走,小止损不会被扫 +- 用小止损换取更多交易机会 ### limit(挂单等待入场) 使用场景: - ✅ 信号强度中等(B/C 级) +- ✅ 市场横盘整理,价格在区间内波动 - ✅ 等待回调到支撑位(EMA20、前期低点) - ✅ 等待反弹到压力位(EMA20、前期高点) - ✅ 希望获得更优成交价格 -- ✅ 震荡市区间交易 +- ✅ 当前价格距离关键位 > 0.5% +- ❌ **价格正在快速移动时不要用 limit** **重要**: - 必须同时输出 `entry_price`(建议入场价)和 `entry_type`(入场方式) - 入场方式由你的市场分析判断,不是简单的价格距离计算 +- **优先选择 market 入场**,只有明确回调/反弹机会时才用 limit ## 输出格式 请严格按照以下 JSON 格式输出: @@ -469,22 +503,69 @@ class MarketSignalAnalyzer: - `key_levels` 中的支撑位和阻力位也必须是数字数组 ## 信号等级与置信度(日内优化版) -- **A级**(85-100):量价配合 + 多指标共振 + 多周期确认 + 盈亏比 ≥ 1:1.5 -- **B级**(60-84):量价配合 + 主要指标确认 + 盈亏比 ≥ 1:1.2 -- **C级**(40-59):有机会但量价不够理想 + 盈亏比 ≥ 1:1.2 -- **D级**(<40):量价背离或信号矛盾或盈亏比不足 + +### 按信号质量分类 +- **A级**(85-100): + - 强共振:多周期同向 + 多指标共振 + 放量突破 + - 快速突破:5m 连续大阳/阴线 + 量比 > 1.5 + 加速移动 + - 盈亏比 ≥ 1:1.5 + - **建议**:market 入场,可考虑 medium 仓位 + +- **B级**(70-84): + - 量价配合 + 主要指标确认 + - 突破但量能不足,或回调/反弹机会明确 + - 盈亏比 ≥ 1:1.2 + - **建议**:根据价格移动速度选择 market/limit,light 仓位 + +- **C级**(55-69): + - 有机会但量价不够理想 + - 震荡市区间交易 + - 盈亏比 ≥ 1:1.2 + - **建议**:limit 挂单为主,micro/light 仓位 + +- **D级**(<55): + - 量价背离或信号矛盾或盈亏比不足 + - **不建议交易** + +### 快速突破特别评级(加分项) +当出现以下情况时,可以提升评级: +1. ⭐⭐⭐ 5m 连续3根以上大阳/阴线 → +10 分 +2. ⭐⭐⭐ 量比 > 2.0(巨量突破) → +8 分 +3. ⭐⭐ 价格偏离 EMA5 > 1%(强势加速) → +5 分 +4. ⭐⭐ 多周期同时突破(5m+15m+30m) → +5 分 +5. ⭐ RSI 快速穿过 50(趋势确认) → +3 分 + +**示例**:基础 B 级(75分)+ 5m 连续3根阳线(+10)+ 量比2.5(+8)= 93 分(A级) ## 注意事项(日内交易重点) -1. **只在有明确的做多或做空机会时才输出信号**(action 为 buy 或 sell) -2. 如果市场不明朗,没有明确交易机会,**不要输出任何信号**(signals 为空数组 []) -3. 信号强度(confidence)要合理,不要随意给高分: +1. **优先使用 market 入场**: + - 日内交易最重要的是**抓住机会**,而不是等最完美的价格 + - 价格快速移动时,用 market 入场,用小止损控制风险 + - 只有在明确回调/反弹机会时才用 limit 挂单 +2. **只在有明确的做多或做空机会时才输出信号**(action 为 buy 或 sell) +3. 如果市场不明朗,没有明确交易机会,**不要输出任何信号**(signals 为空数组 []) +4. 信号强度(confidence)要合理,不要随意给高分: - 60-70分:一般信号,可轻仓试探(micro 仓位) - 75-84分:较强信号,可正常仓位(light 仓位) - 85-100分:强信号,可考虑 medium 仓位 -4. **不要输出 action 为 "wait" 的信号**,如果没有交易机会就不输出 -5. **每次检查盈亏比**:盈亏比 < 1:1.2 的信号不要输出 -6. **避免过度交易**:趋势延续时不重复输出相同方向信号 -7. **关注时效性**:日内信号有效期通常 2-4 小时,超过时间需重新评估 +5. **不要输出 action 为 "wait" 的信号**,如果没有交易机会就不输出 +6. **每次检查盈亏比**:盈亏比 < 1:1.2 的信号不要输出 +7. **避免过度交易**:趋势延续时不重复输出相同方向信号 +8. **关注时效性**:日内信号有效期通常 2-4 小时,超过时间需重新评估 + +## 快速突破的识别标准(market 入场信号) +当出现以下情况时,**强烈建议使用 market 入场**: +1. ✅ 5m 连续 2-3 根大阳线/阴线(实体 > 0.3%) +2. ✅ 价格突破关键阻力/支撑后加速(偏离突破位 > 0.5%) +3. ✅ 量比 > 1.5,放量确认突破有效 +4. ✅ 价格偏离 EMA5 > 0.5%,趋势加速中 +5. ✅ RSI 快速上升/下降(5m 内变化 > 10) + +**快速突破时的止损策略**: +- 止损可以设置得更窄(0.8-1%),因为: + - 真突破会继续走,不会被小止损扫掉 + - 假突破立即止损,损失小 + - 用更多小止损博弈换取大盈利 ## 日内交易特殊注意事项 1. **不持仓过夜**:收盘前 30 分钟逐步平仓 @@ -761,8 +842,16 @@ class MarketSignalAnalyzer: if len(df_15m) >= 5: recent_closes = df_15m['close'].iloc[-5:].values is_accelerating = all(recent_closes[i] > recent_closes[i-1] for i in range(1, 5)) + # 检查连续大阳线/阴线(快速移动) + recent_changes = [(recent_closes[i] - recent_closes[i-1]) / recent_closes[i-1] * 100 + for i in range(1, len(recent_closes))] + big_moves = sum(1 for change in recent_changes if abs(change) > 0.3) + is_rapid_moving = big_moves >= 3 + avg_move = sum(abs(c) for c in recent_changes) / len(recent_changes) if recent_changes else 0 else: is_accelerating = False + is_rapid_moving = False + avg_move = 0 # 计算价格偏离 if ema5_15m and ema20_15m: @@ -780,6 +869,16 @@ class MarketSignalAnalyzer: vol_ma20 = df_5m['volume'].iloc[-20:-1].mean() volume_ratio = vol_latest / vol_ma20 if vol_ma20 > 0 else 1 + # 检查5m连续K线走势 + if len(df_5m) >= 3: + recent_5m_closes = df_5m['close'].iloc[-3:].values + recent_5m_changes = [(recent_5m_closes[i] - recent_5m_closes[i-1]) / recent_5m_closes[i-1] * 100 + for i in range(1, len(recent_5m_closes))] + big_5m_moves = sum(1 for change in recent_5m_changes if abs(change) > 0.3) + is_5m_accelerating = big_5m_moves >= 2 + else: + is_5m_accelerating = False + # 日内过度延伸检查(EMA 反应更快,阈值更严格) is_overextended = ( (rsi_15m > 70 and intraday_trend == "上升") or @@ -788,10 +887,18 @@ class MarketSignalAnalyzer: ) if intraday_trend == "上升": - if is_accelerating and volume_ratio > 1.3 and not is_overextended: + # 快速突破检测(优先使用market入场) + if is_rapid_moving and volume_ratio > 1.5 and deviation_ema5_15m > 0.5: + analysis.append(f"🚀 15m: 快速突破!连续{big_moves}根大阳线,平均涨幅{avg_move:.2f}%") + analysis.append(f" → 量比 {volume_ratio:.1f},偏离 EMA5 {deviation_ema5_15m:.1f}%") + analysis.append(f" → ⚡ **强烈建议 market 现价做多**,不要等回调") + analysis.append(f" → 止损0.8-1%(小止损快速离场),目标1.5-2%(快速获利)") + analysis.append(f" → 盈亏比要求 >= 1:1.5") + analysis.append(f" → 仓位:micro(1%),用小止损博弈快速行情") + elif is_accelerating and volume_ratio > 1.3 and not is_overextended: analysis.append(f"15m: 正在加速上涨,放量突破") - analysis.append(f" → 日内追多(止损1-2%,目标2-3%)") - analysis.append(f" → 盈亏比要求 >= 1:1.2") + analysis.append(f" → 建议 market 入场做多") + analysis.append(f" → 止损1-1.5%,目标2-3%,盈亏比 >= 1:1.5") elif distance_to_ema20 < 1 and deviation_ema5_15m > 1.5: analysis.append(f"15m: 回调到 EMA20 支撑位") analysis.append(f" → 支撑位做多反弹(EMA20: ${ema20_15m:.0f})") @@ -804,10 +911,18 @@ class MarketSignalAnalyzer: analysis.append(f" → RSI {rsi_15m:.0f},偏离 EMA5 {deviation_ema5_15m:.1f}%") elif intraday_trend == "下跌": - if is_accelerating and volume_ratio > 1.3 and not is_overextended: + # 快速突破检测(优先使用market入场) + if is_rapid_moving and volume_ratio > 1.5 and deviation_ema5_15m > 0.5: + analysis.append(f"🚀 15m: 快速突破!连续{big_moves}根大阴线,平均跌幅{avg_move:.2f}%") + analysis.append(f" → 量比 {volume_ratio:.1f},偏离 EMA5 {deviation_ema5_15m:.1f}%") + analysis.append(f" → ⚡ **强烈建议 market 现价做空**,不要等反弹") + analysis.append(f" → 止损0.8-1%(小止损快速离场),目标1.5-2%(快速获利)") + analysis.append(f" → 盈亏比要求 >= 1:1.5") + analysis.append(f" → 仓位:micro(1%),用小止损博弈快速行情") + elif is_accelerating and volume_ratio > 1.3 and not is_overextended: analysis.append(f"15m: 正在加速下跌,放量跌破") - analysis.append(f" → 日内追空(止损1-2%,目标2-3%)") - analysis.append(f" → 盈亏比要求 >= 1:1.2") + analysis.append(f" → 建议 market 入场做空") + analysis.append(f" → 止损1-1.5%,目标2-3%,盈亏比 >= 1:1.5") elif distance_to_ema20 < 1 and deviation_ema5_15m > 1.5: analysis.append(f"15m: 反弹到 EMA20 压力位") analysis.append(f" → 压力位做空回调(EMA20: ${ema20_15m:.0f})") @@ -825,11 +940,14 @@ class MarketSignalAnalyzer: # 日内交易要点 analysis.append(f"\n💡 日内交易要点:") + analysis.append(f"- **优先使用 market 入场**:抓住机会 > 等待完美价格") + analysis.append(f"- 快速移动时用小止损(0.8-1%)+ 小仓位(micro)博弈") + analysis.append(f"- 只有明确回调/反弹机会才用 limit 挂单") analysis.append(f"- 使用 EMA(指数移动平均)反应更快") - analysis.append(f"- 盈亏比第一: 必须 >= 1:1.2") + analysis.append(f"- 盈亏比第一: 必须 >= 1:1.5") analysis.append(f"- 快进快出: 持仓不超过4小时") - analysis.append(f"- 严格止损: 1-2%(最大2%)") - analysis.append(f"- 目标盈利: 2-3%(快速获利)") + analysis.append(f"- 严格止损: 1-1.5%(快速突破时0.8-1%)") + analysis.append(f"- 目标盈利: 1.5-3%(根据止损调整)") return "\n".join(analysis) if analysis else "" diff --git a/backend/app/crypto_agent/trading_decision_maker.py b/backend/app/crypto_agent/trading_decision_maker.py index 567f464..a7138ae 100644 --- a/backend/app/crypto_agent/trading_decision_maker.py +++ b/backend/app/crypto_agent/trading_decision_maker.py @@ -24,7 +24,7 @@ class TradingDecisionMaker: **日内交易:快进快出 + 盈亏比第一 + 严控风险** ### 🚨 盈亏比铁律(违反即拒绝) -**所有交易必须满足盈亏比 ≥ 1:2,优选 1:3** +**所有交易必须满足盈亏比 ≥ 1:1.5,回调入场≥ 1:1.8** ``` 盈亏比 = (目标盈利 - 入场价) / (入场价 - 止损价) @@ -32,21 +32,25 @@ class TradingDecisionMaker: 做多:盈亏比 = (止盈价 - 入场价) / (入场价 - 止损价) 做空:盈亏比 = (入场价 - 止盈价) / (止损价 - 入场价) -示例: -- BTC 做多:入场 65000,止损 64300(-1%),止盈 66300(+2%) -- 盈亏比 = (66300 - 65000) / (65000 - 64300) = 1300 / 700 ≈ 1.86 ✅ +示例(突破追涨): +- BTC 做多:入场 65000,止损 64500(-0.77%),止盈 65970(+1.5%) +- 盈亏比 = (65970 - 65000) / (65000 - 64500) = 970 / 500 ≈ 1.94 ✅ -如果盈亏比 < 1:2,绝对不要开仓! +示例(回调做多): +- BTC 做多:入场 64800(回调),止损 64300(-0.77%),止盈 65800(+1.54%) +- 盈亏比 = (65800 - 64800) / (64800 - 64300) = 1000 / 500 = 2.0 ✅ + +如果盈亏比 < 1:1.5,绝对不要开仓! ``` ### 日内交易参数 | 参数 | 设定值 | |------|--------| -| 止损幅度 | 1-2%(最大2%) | -| 目标盈利 | 2-3%(日内快速获利) | -| 盈亏比要求 | ≥ 1:2(优选1:3) | -| 单笔持仓时长 | 不超过4小时 | -| 仓位大小 | 轻仓为主(light/micro) | +| 止损幅度 | 1-1.5%(最大1.5%) | +| 目标盈利 | 2-3%(日内快速获利,达到即走) | +| 盈亏比要求 | ≥ 1:1.5(回调入场≥1:1.8) | +| 单笔持仓时长 | 不超过4小时,达到目标立即平仓 | +| 仓位大小 | 轻仓为主(light/micro),禁止heavy | ## 决策流程(必须按顺序执行) @@ -73,11 +77,12 @@ class TradingDecisionMaker: **只有在信号非常强烈时才考虑以下操作:** **1. 加仓(ADD)** - 必须同时满足: -- ✅ 新信号是 **A级**(confidence >= 85) -- ✅ 当前持仓盈利 >= 2% -- ✅ 新信号价格距离持仓价格 >= 2% -- ✅ 趋势在加强(不是延续) +- ✅ 新信号是 **A级**(confidence >= 90) +- ✅ 当前持仓盈利 >= 1.5%(但 < 2.5%,达到目标应该平仓) +- ✅ 新信号价格距离持仓价格 >= 1.5% +- ✅ 趋势在加强(突破加速,不是延续) - ✅ 有足够的可用杠杆空间 +- ❌ **日内交易达到目标盈利(2-3%)后立即平仓,不考虑加仓** **2. 滚仓(CLOSE + 新开仓)** - 必须同时满足: - ✅ 新信号是 **A级**(confidence >= 90) @@ -91,8 +96,9 @@ class TradingDecisionMaker: 新信号:BTC 做多 @ $97,500(A级,90%置信度,趋势加速) 分析: -- 价格距离 = (97500-95000)/95000 = 2.63% >= 2% -- 持仓盈利 = 5% >= 2% +- 价格距离 = (97500-95000)/95000 = 2.63% >= 1.5% +- 持仓盈利 = 5% >= 1.5%(但 < 2.5%,未达平仓线) +- A级信号,趋势在加速 - 决策:ADD(加仓) - 理由:A级信号,趋势加速,持仓盈利中,价格距离合适 ``` @@ -100,11 +106,12 @@ class TradingDecisionMaker: **示例2 - 滚仓**: ``` 当前:BTC 做多持仓 @ $95,000(浮亏-1%) -新信号:BTC 做多 @ $92,000(A级,95%置信度,强支撑位) +新信号:BTC 做多 @ $92,000(A级,92%置信度,强支撑位) 分析: - 价格距离 = (95000-92000)/95000 = 3.16% >= 3% - 新价格在强支撑位,可改善入场成本 +- A级信号(92%置信度) - 决策:CLOSE 当前持仓 + OPEN 新仓位 - 理由:滚仓至更优价格,改善风险收益比 ``` @@ -127,7 +134,7 @@ class TradingDecisionMaker: **只有在信号非常强烈时才考虑以下操作:** **1. CANCEL_PENDING + 重新挂单** - 必须同时满足: -- ✅ 新信号是 **A级**(confidence >= 85) +- ✅ 新信号是 **A级**(confidence >= 90) - ✅ 新价格明显更优(距离 >= 2%) - ✅ 可以显著改善风险收益比 @@ -178,9 +185,9 @@ class TradingDecisionMaker: | 当前趋势 | 信号方向 | 允许操作 | |---------|---------|---------| | `uptrend` (上升) | buy (做多) | ✅ 允许 | -| `uptrend` (上升) | sell (做空) | ❌ 禁止(除非有多重反转信号 + confidence >= 85) | +| `uptrend` (上升) | sell (做空) | ❌ 禁止(除非有多重反转信号 + confidence >= 90) | | `downtrend` (下降) | sell (做空) | ✅ 允许 | -| `downtrend` (下降) | buy (做多) | ❌ 禁止(除非有多重反转信号 + confidence >= 85) | +| `downtrend` (下降) | buy (做多) | ❌ 禁止(除非有多重反转信号 + confidence >= 90) | | `neutral` (震荡) | buy/sell | ✅ 允许但轻仓 | ### 3. 取消挂单规则 @@ -188,27 +195,32 @@ class TradingDecisionMaker: - **绝不取消同向挂单**:buy信号不应取消buy挂单 - **只能取消当前交易对的挂单**:不要取消其他交易对的订单 -## 仓位大小规则 +## 仓位大小规则(日内交易保守策略) ### 信号等级决定仓位上限 -- **A级(80-100分)**:heavy/medium/light 可选 -- **B级(60-79分)**:只能 medium/light -- **C级(40-59分)**:只能 light +- **A级(85-100分)**:medium/light/micro 可选 +- **B级(60-84分)**:只能 light/micro +- **C级(40-59分)**:只能 micro - **D级(<40分)**:不开仓 ### 趋势强度调整仓位 | 趋势 | 顺势仓位 | 逆势仓位 | |-----|---------|---------| | strong | 100% | 禁止 | -| medium | 100% | 30% | -| weak | 70% | 20% | -| neutral | 50% | 50% | +| medium | 80% | 禁止 | +| weak | 60% | 禁止 | +| neutral | 50% | 30% | -### 具体保证金金额 -- **heavy**:账户余额 × 12% -- **medium**:账户余额 × 6% -- **light**:账户余额 × 3% -- **micro**:账户余额 × 1.5% +### 具体保证金金额(已降低风险) +- **medium**:账户余额 × 4%(原6%) +- **light**:账户余额 × 2%(原3%) +- **micro**:账户余额 × 1%(原1.5%) +- **heavy**:❌ 日内交易禁用 + +### ⚠️ 日内交易特别规则 +- 达到目标盈利(2-3%)**立即平仓**,不贪婪 +- 持仓超过3小时**考虑强制平仓** +- 亏损达到止损**立即平仓**,不幻想 ## 输出格式 ```json @@ -476,7 +488,7 @@ class TradingDecisionMaker: has_pending = len([o for o in pending_orders if o.get('symbol') == context['symbol']]) > 0 # 检查是否有强烈信号 - strong_signals = [s for s in signals if s.get('confidence', 0) >= 85] + strong_signals = [s for s in signals if s.get('confidence', 0) >= 90] has_strong_signal = len(strong_signals) > 0 if has_positions: @@ -485,10 +497,10 @@ class TradingDecisionMaker: prompt_parts.append("决策优先级:") prompt_parts.append("1️⃣ 首先检查是否需要平仓/减仓(信号反向或趋势减弱)") if has_strong_signal: - prompt_parts.append("2️⃣ 然后检查是否需要加仓/滚仓(**有A级信号**,价格距离 >= 2%)") - prompt_parts.append(" ⭐ A级信号(confidence >= 85)可考虑加仓或滚仓") + prompt_parts.append("2️⃣ 然后检查是否需要加仓/滚仓(**有A级信号**,价格距离 >= 1.5%)") + prompt_parts.append(" ⭐ A级信号(confidence >= 90)可考虑加仓或滚仓") else: - prompt_parts.append("2️⃣ 然后检查是否需要加仓(价格距离 >= 2%,盈利 >= 2%)") + prompt_parts.append("2️⃣ 然后检查是否需要加仓(价格距离 >= 1.5%,盈利 >= 1.5%)") prompt_parts.append(" ⚠️ 当前信号不是A级,不建议加仓") prompt_parts.append("3️⃣ ❌ 不要开新仓(已有持仓时优先管理现有仓位)") prompt_parts.append("") @@ -501,7 +513,7 @@ class TradingDecisionMaker: prompt_parts.append("1️⃣ 首先检查是否需要取消挂单(信号反向或价格不优)") if has_strong_signal: prompt_parts.append("2️⃣ 然后检查是否需要调整挂单或现价入场(**有A级信号**)") - prompt_parts.append(" ⭐ A级信号(confidence >= 85)可考虑取消挂单现价入场") + prompt_parts.append(" ⭐ A级信号(confidence >= 90)可考虑取消挂单现价入场") else: prompt_parts.append("2️⃣ 然后检查是否需要调整挂单价格") prompt_parts.append(" ⚠️ 当前信号不是A级,不建议调整挂单") @@ -578,13 +590,13 @@ class TradingDecisionMaker: prompt_parts.append(f"❌ 信号#{i} ({action}) 与强趋势 ({trend_direction}) 相反 → **严禁逆势,返回 HOLD**") elif trend_strength == 'medium': confidence = sig.get('confidence', 0) - if confidence >= 85: + if confidence >= 90: prompt_parts.append(f"⚠️ 信号#{i} ({action}) 与中等趋势相反,但 confidence={confidence}>=85 → 可谨慎 micro 仓位") else: prompt_parts.append(f"❌ 信号#{i} ({action}) 与中等趋势相反,confidence不足 → 返回 HOLD") else: # weak or neutral confidence = sig.get('confidence', 0) - if confidence >= 85: + if confidence >= 90: prompt_parts.append(f"⚠️ 信号#{i} ({action}) 与弱趋势相反,但 confidence={confidence}>=85 → 可 micro 仓位") else: prompt_parts.append(f"❌ 信号#{i} ({action}) 与弱趋势相反,confidence不足 → 返回 HOLD") @@ -731,13 +743,13 @@ class TradingDecisionMaker: # 盈亏比检查规则(新增) prompt_parts.append(f"\n## 盈亏比检查(日内交易铁律)") - prompt_parts.append(f"⚠️ 所有交易必须满足盈亏比 >= 1:2,优选 1:3") + prompt_parts.append(f"⚠️ 所有交易必须满足盈亏比 >= 1:1.5,回调入场>= 1:1.8") prompt_parts.append(f"") prompt_parts.append(f"盈亏比计算公式:") prompt_parts.append(f" 做多盈亏比 = (止盈价 - 入场价) / (入场价 - 止损价)") prompt_parts.append(f" 做空盈亏比 = (入场价 - 止盈价) / (止损价 - 入场价)") prompt_parts.append(f"") - prompt_parts.append(f"⚠️ 如果盈亏比 < 1:2,**不要开仓(返回 HOLD)**") + prompt_parts.append(f"⚠️ 如果盈亏比 < 1:1.5,**不要开仓(返回 HOLD)**") # 计算并显示盈亏比 signals = context.get('signals', []) @@ -767,10 +779,10 @@ class TradingDecisionMaker: rr_ratio = reward_ratio / risk_ratio rr_percent = (risk_ratio / entry) * 100 - if rr_ratio >= 2.0: + if rr_ratio >= 1.5: status = f"✅ 通过 (1:{rr_ratio:.1f})" else: - status = f"❌ 拒绝 (1:{rr_ratio:.1f} < 1:2)" + status = f"❌ 拒绝 (1:{rr_ratio:.1f} < 1:1.5)" prompt_parts.append(f"\n信号 {action} @ ${entry:,.2f}:") prompt_parts.append(f" - 止损: ${stop_loss:,.2f} (风险 {risk_ratio:.0f} / {rr_percent:.1f}%)") @@ -937,7 +949,7 @@ class TradingDecisionMaker: f"超过最大仓位金额 (保证金 ${margin:.2f} → 持仓价值 ${position_value:.2f}, 总计 ${new_total_value:,.2f} > ${max_position_value:,.2f})" ) - # 盈亏比检查:所有交易必须满足盈亏比 >= 1:2 + # 盈亏比检查:所有交易必须满足盈亏比 >= 1:1.5 action = decision.get('action', '') entry_price = decision.get('entry_price') stop_loss = decision.get('stop_loss') @@ -979,15 +991,15 @@ class TradingDecisionMaker: # 检查盈亏比 if risk > 0 and reward > 0: rr_ratio = reward / risk - min_rr_ratio = 2.0 # 最小盈亏比 1:2 + min_rr_ratio = 1.5 # 最小盈亏比 1:1.5 if rr_ratio < min_rr_ratio: - logger.warning(f"⚠️ 决策被拒绝: 盈亏比不足 (1:{rr_ratio:.2f} < 1:{min_rr_ratio:.0f})") + logger.warning(f"⚠️ 决策被拒绝: 盈亏比不足 (1:{rr_ratio:.2f} < 1:{min_rr_ratio:.1f})") logger.warning(f" entry={entry_price}, stop_loss={stop_loss}, take_profit={take_profit}") logger.warning(f" 风险={risk:.0f}, 盈利={reward:.0f}, 盈亏比=1:{rr_ratio:.2f}") return self._get_hold_decision( decision['symbol'], - f"盈亏比不足 (1:{rr_ratio:.2f} < 1:{min_rr_ratio:.0f})" + f"盈亏比不足 (1:{rr_ratio:.2f} < 1:{min_rr_ratio:.1f})" ) except (ValueError, TypeError, ZeroDivisionError) as e: