This commit is contained in:
aaron 2026-03-03 01:00:14 +08:00
parent b7e07e5d0b
commit 27bd4e97e9
2 changed files with 199 additions and 69 deletions

View File

@ -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
仓位micro1%降低风险
```
**为什么快速突破用小止损**
- 突破后如果立即回调说明是假突破快速止损
- 真突破会继续走小止损不会被扫
- 用小止损换取更多交易机会
### 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/limitlight 仓位
- **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" → 仓位micro1%),用小止损博弈快速行情")
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" → 仓位micro1%),用小止损博弈快速行情")
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 ""

View File

@ -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,500A级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,000A级95%置信度强支撑位
新信号BTC 做多 @ $92,000A级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: