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 - 强共振信号A级confidence 85
- 放量突破关键位趋势明确 - 放量突破关键位趋势明确
- 多周期同时突破等待可能错过机会 - 多周期同时突破等待可能错过机会
- 市场波动大价格变化快 - 市场波动大价格变化快
- 15m RSI 50-70 30-50- 不极端 - 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挂单等待入场 ### limit挂单等待入场
使用场景 使用场景
- 信号强度中等B/C - 信号强度中等B/C
- 市场横盘整理价格在区间内波动
- 等待回调到支撑位EMA20前期低点 - 等待回调到支撑位EMA20前期低点
- 等待反弹到压力位EMA20前期高点 - 等待反弹到压力位EMA20前期高点
- 希望获得更优成交价格 - 希望获得更优成交价格
- 震荡市区间交易 - 当前价格距离关键位 > 0.5%
- **价格正在快速移动时不要用 limit**
**重要** **重要**
- 必须同时输出 `entry_price`建议入场价 `entry_type`入场方式 - 必须同时输出 `entry_price`建议入场价 `entry_type`入场方式
- 入场方式由你的市场分析判断不是简单的价格距离计算 - 入场方式由你的市场分析判断不是简单的价格距离计算
- **优先选择 market 入场**只有明确回调/反弹机会时才用 limit
## 输出格式 ## 输出格式
请严格按照以下 JSON 格式输出 请严格按照以下 JSON 格式输出
@ -469,22 +503,69 @@ class MarketSignalAnalyzer:
- `key_levels` 中的支撑位和阻力位也必须是数字数组 - `key_levels` 中的支撑位和阻力位也必须是数字数组
## 信号等级与置信度(日内优化版) ## 信号等级与置信度(日内优化版)
- **A级**85-100量价配合 + 多指标共振 + 多周期确认 + 盈亏比 1:1.5
- **B级**60-84量价配合 + 主要指标确认 + 盈亏比 1:1.2 ### 按信号质量分类
- **C级**40-59有机会但量价不够理想 + 盈亏比 1:1.2 - **A级**85-100
- **D级**<40量价背离或信号矛盾或盈亏比不足 - 强共振多周期同向 + 多指标共振 + 放量突破
- 快速突破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 1. **优先使用 market 入场**
2. 如果市场不明朗没有明确交易机会**不要输出任何信号**signals 为空数组 [] - 日内交易最重要的是**抓住机会**而不是等最完美的价格
3. 信号强度confidence要合理不要随意给高分 - 价格快速移动时 market 入场用小止损控制风险
- 只有在明确回调/反弹机会时才用 limit 挂单
2. **只在有明确的做多或做空机会时才输出信号**action buy sell
3. 如果市场不明朗没有明确交易机会**不要输出任何信号**signals 为空数组 []
4. 信号强度confidence要合理不要随意给高分
- 60-70一般信号可轻仓试探micro 仓位 - 60-70一般信号可轻仓试探micro 仓位
- 75-84较强信号可正常仓位light 仓位 - 75-84较强信号可正常仓位light 仓位
- 85-100强信号可考虑 medium 仓位 - 85-100强信号可考虑 medium 仓位
4. **不要输出 action "wait" 的信号**如果没有交易机会就不输出 5. **不要输出 action "wait" 的信号**如果没有交易机会就不输出
5. **每次检查盈亏比**盈亏比 < 1:1.2 的信号不要输出 6. **每次检查盈亏比**盈亏比 < 1:1.2 的信号不要输出
6. **避免过度交易**趋势延续时不重复输出相同方向信号 7. **避免过度交易**趋势延续时不重复输出相同方向信号
7. **关注时效性**日内信号有效期通常 2-4 小时超过时间需重新评估 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 分钟逐步平仓 1. **不持仓过夜**收盘前 30 分钟逐步平仓
@ -761,8 +842,16 @@ class MarketSignalAnalyzer:
if len(df_15m) >= 5: if len(df_15m) >= 5:
recent_closes = df_15m['close'].iloc[-5:].values recent_closes = df_15m['close'].iloc[-5:].values
is_accelerating = all(recent_closes[i] > recent_closes[i-1] for i in range(1, 5)) 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: else:
is_accelerating = False is_accelerating = False
is_rapid_moving = False
avg_move = 0
# 计算价格偏离 # 计算价格偏离
if ema5_15m and ema20_15m: if ema5_15m and ema20_15m:
@ -780,6 +869,16 @@ class MarketSignalAnalyzer:
vol_ma20 = df_5m['volume'].iloc[-20:-1].mean() vol_ma20 = df_5m['volume'].iloc[-20:-1].mean()
volume_ratio = vol_latest / vol_ma20 if vol_ma20 > 0 else 1 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 反应更快,阈值更严格) # 日内过度延伸检查EMA 反应更快,阈值更严格)
is_overextended = ( is_overextended = (
(rsi_15m > 70 and intraday_trend == "上升") or (rsi_15m > 70 and intraday_trend == "上升") or
@ -788,10 +887,18 @@ class MarketSignalAnalyzer:
) )
if intraday_trend == "上升": 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"15m: 正在加速上涨,放量突破")
analysis.append(f" → 日内追多止损1-2%目标2-3%") analysis.append(f"建议 market 入场做多")
analysis.append(f" → 盈亏比要求 >= 1:1.2") analysis.append(f"止损1-1.5%目标2-3%,盈亏比 >= 1:1.5")
elif distance_to_ema20 < 1 and deviation_ema5_15m > 1.5: elif distance_to_ema20 < 1 and deviation_ema5_15m > 1.5:
analysis.append(f"15m: 回调到 EMA20 支撑位") analysis.append(f"15m: 回调到 EMA20 支撑位")
analysis.append(f" → 支撑位做多反弹EMA20: ${ema20_15m:.0f}") 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}%") analysis.append(f" → RSI {rsi_15m:.0f},偏离 EMA5 {deviation_ema5_15m:.1f}%")
elif intraday_trend == "下跌": 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"15m: 正在加速下跌,放量跌破")
analysis.append(f" → 日内追空止损1-2%目标2-3%") analysis.append(f"建议 market 入场做空")
analysis.append(f" → 盈亏比要求 >= 1:1.2") analysis.append(f"止损1-1.5%目标2-3%,盈亏比 >= 1:1.5")
elif distance_to_ema20 < 1 and deviation_ema5_15m > 1.5: elif distance_to_ema20 < 1 and deviation_ema5_15m > 1.5:
analysis.append(f"15m: 反弹到 EMA20 压力位") analysis.append(f"15m: 反弹到 EMA20 压力位")
analysis.append(f" → 压力位做空回调EMA20: ${ema20_15m:.0f}") analysis.append(f" → 压力位做空回调EMA20: ${ema20_15m:.0f}")
@ -825,11 +940,14 @@ class MarketSignalAnalyzer:
# 日内交易要点 # 日内交易要点
analysis.append(f"\n💡 日内交易要点:") 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"- 使用 EMA指数移动平均反应更快")
analysis.append(f"- 盈亏比第一: 必须 >= 1:1.2") analysis.append(f"- 盈亏比第一: 必须 >= 1:1.5")
analysis.append(f"- 快进快出: 持仓不超过4小时") analysis.append(f"- 快进快出: 持仓不超过4小时")
analysis.append(f"- 严格止损: 1-2%最大2%") analysis.append(f"- 严格止损: 1-1.5%快速突破时0.8-1%")
analysis.append(f"- 目标盈利: 2-3%(快速获利") analysis.append(f"- 目标盈利: 1.5-3%(根据止损调整")
return "\n".join(analysis) if analysis else "" 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% - BTC 做多入场 65000止损 64500-0.77%止盈 65970+1.5%
- 盈亏比 = (66300 - 65000) / (65000 - 64300) = 1300 / 700 1.86 - 盈亏比 = (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% | | 止损幅度 | 1-1.5%最大1.5% |
| 目标盈利 | 2-3%日内快速获利 | | 目标盈利 | 2-3%日内快速获利达到即走 |
| 盈亏比要求 | 1:2优选1:3 | | 盈亏比要求 | 1:1.5回调入场1:1.8 |
| 单笔持仓时长 | 不超过4小时 | | 单笔持仓时长 | 不超过4小时达到目标立即平仓 |
| 仓位大小 | 轻仓为主light/micro | | 仓位大小 | 轻仓为主light/micro禁止heavy |
## 决策流程(必须按顺序执行) ## 决策流程(必须按顺序执行)
@ -73,11 +77,12 @@ class TradingDecisionMaker:
**只有在信号非常强烈时才考虑以下操作** **只有在信号非常强烈时才考虑以下操作**
**1. 加仓ADD** - 必须同时满足 **1. 加仓ADD** - 必须同时满足
- 新信号是 **A级**confidence >= 85 - 新信号是 **A级**confidence >= 90
- 当前持仓盈利 >= 2% - 当前持仓盈利 >= 1.5% < 2.5%达到目标应该平仓
- 新信号价格距离持仓价格 >= 2% - 新信号价格距离持仓价格 >= 1.5%
- 趋势在加强不是延续 - 趋势在加强突破加速不是延续
- 有足够的可用杠杆空间 - 有足够的可用杠杆空间
- **日内交易达到目标盈利2-3%后立即平仓不考虑加仓**
**2. 滚仓CLOSE + 新开仓** - 必须同时满足 **2. 滚仓CLOSE + 新开仓** - 必须同时满足
- 新信号是 **A级**confidence >= 90 - 新信号是 **A级**confidence >= 90
@ -91,8 +96,9 @@ class TradingDecisionMaker:
新信号BTC 做多 @ $97,500A级90%置信度趋势加速 新信号BTC 做多 @ $97,500A级90%置信度趋势加速
分析 分析
- 价格距离 = (97500-95000)/95000 = 2.63% >= 2% - 价格距离 = (97500-95000)/95000 = 2.63% >= 1.5%
- 持仓盈利 = 5% >= 2% - 持仓盈利 = 5% >= 1.5% < 2.5%未达平仓线
- A级信号趋势在加速
- 决策ADD加仓 - 决策ADD加仓
- 理由A级信号趋势加速持仓盈利中价格距离合适 - 理由A级信号趋势加速持仓盈利中价格距离合适
``` ```
@ -100,11 +106,12 @@ class TradingDecisionMaker:
**示例2 - 滚仓** **示例2 - 滚仓**
``` ```
当前BTC 做多持仓 @ $95,000浮亏-1% 当前BTC 做多持仓 @ $95,000浮亏-1%
新信号BTC 做多 @ $92,000A级95%置信度强支撑位 新信号BTC 做多 @ $92,000A级92%置信度强支撑位
分析 分析
- 价格距离 = (95000-92000)/95000 = 3.16% >= 3% - 价格距离 = (95000-92000)/95000 = 3.16% >= 3%
- 新价格在强支撑位可改善入场成本 - 新价格在强支撑位可改善入场成本
- A级信号92%置信度
- 决策CLOSE 当前持仓 + OPEN 新仓位 - 决策CLOSE 当前持仓 + OPEN 新仓位
- 理由滚仓至更优价格改善风险收益比 - 理由滚仓至更优价格改善风险收益比
``` ```
@ -127,7 +134,7 @@ class TradingDecisionMaker:
**只有在信号非常强烈时才考虑以下操作** **只有在信号非常强烈时才考虑以下操作**
**1. CANCEL_PENDING + 重新挂单** - 必须同时满足 **1. CANCEL_PENDING + 重新挂单** - 必须同时满足
- 新信号是 **A级**confidence >= 85 - 新信号是 **A级**confidence >= 90
- 新价格明显更优距离 >= 2% - 新价格明显更优距离 >= 2%
- 可以显著改善风险收益比 - 可以显著改善风险收益比
@ -178,9 +185,9 @@ class TradingDecisionMaker:
| 当前趋势 | 信号方向 | 允许操作 | | 当前趋势 | 信号方向 | 允许操作 |
|---------|---------|---------| |---------|---------|---------|
| `uptrend` (上升) | buy (做多) | 允许 | | `uptrend` (上升) | buy (做多) | 允许 |
| `uptrend` (上升) | sell (做空) | 禁止除非有多重反转信号 + confidence >= 85 | | `uptrend` (上升) | sell (做空) | 禁止除非有多重反转信号 + confidence >= 90 |
| `downtrend` (下降) | sell (做空) | 允许 | | `downtrend` (下降) | sell (做空) | 允许 |
| `downtrend` (下降) | buy (做多) | 禁止除非有多重反转信号 + confidence >= 85 | | `downtrend` (下降) | buy (做多) | 禁止除非有多重反转信号 + confidence >= 90 |
| `neutral` (震荡) | buy/sell | 允许但轻仓 | | `neutral` (震荡) | buy/sell | 允许但轻仓 |
### 3. 取消挂单规则 ### 3. 取消挂单规则
@ -188,27 +195,32 @@ class TradingDecisionMaker:
- **绝不取消同向挂单**buy信号不应取消buy挂单 - **绝不取消同向挂单**buy信号不应取消buy挂单
- **只能取消当前交易对的挂单**不要取消其他交易对的订单 - **只能取消当前交易对的挂单**不要取消其他交易对的订单
## 仓位大小规则 ## 仓位大小规则(日内交易保守策略)
### 信号等级决定仓位上限 ### 信号等级决定仓位上限
- **A级80-100**heavy/medium/light 可选 - **A级85-100**medium/light/micro 可选
- **B级60-79**只能 medium/light - **B级60-84**只能 light/micro
- **C级40-59**只能 light - **C级40-59**只能 micro
- **D级<40**不开仓 - **D级<40**不开仓
### 趋势强度调整仓位 ### 趋势强度调整仓位
| 趋势 | 顺势仓位 | 逆势仓位 | | 趋势 | 顺势仓位 | 逆势仓位 |
|-----|---------|---------| |-----|---------|---------|
| strong | 100% | 禁止 | | strong | 100% | 禁止 |
| medium | 100% | 30% | | medium | 80% | 禁止 |
| weak | 70% | 20% | | weak | 60% | 禁止 |
| neutral | 50% | 50% | | neutral | 50% | 30% |
### 具体保证金金额 ### 具体保证金金额(已降低风险)
- **heavy**账户余额 × 12% - **medium**账户余额 × 4%原6%
- **medium**账户余额 × 6% - **light**账户余额 × 2%原3%
- **light**账户余额 × 3% - **micro**账户余额 × 1%原1.5%
- **micro**账户余额 × 1.5% - **heavy** 日内交易禁用
### ⚠️ 日内交易特别规则
- 达到目标盈利2-3%**立即平仓**不贪婪
- 持仓超过3小时**考虑强制平仓**
- 亏损达到止损**立即平仓**不幻想
## 输出格式 ## 输出格式
```json ```json
@ -476,7 +488,7 @@ class TradingDecisionMaker:
has_pending = len([o for o in pending_orders if o.get('symbol') == context['symbol']]) > 0 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 has_strong_signal = len(strong_signals) > 0
if has_positions: if has_positions:
@ -485,10 +497,10 @@ class TradingDecisionMaker:
prompt_parts.append("决策优先级:") prompt_parts.append("决策优先级:")
prompt_parts.append("1⃣ 首先检查是否需要平仓/减仓(信号反向或趋势减弱)") prompt_parts.append("1⃣ 首先检查是否需要平仓/减仓(信号反向或趋势减弱)")
if has_strong_signal: if has_strong_signal:
prompt_parts.append("2⃣ 然后检查是否需要加仓/滚仓(**有A级信号**,价格距离 >= 2%") prompt_parts.append("2⃣ 然后检查是否需要加仓/滚仓(**有A级信号**,价格距离 >= 1.5%")
prompt_parts.append(" ⭐ A级信号confidence >= 85)可考虑加仓或滚仓") prompt_parts.append(" ⭐ A级信号confidence >= 90)可考虑加仓或滚仓")
else: else:
prompt_parts.append("2⃣ 然后检查是否需要加仓(价格距离 >= 2%,盈利 >= 2%") prompt_parts.append("2⃣ 然后检查是否需要加仓(价格距离 >= 1.5%,盈利 >= 1.5%")
prompt_parts.append(" ⚠️ 当前信号不是A级不建议加仓") prompt_parts.append(" ⚠️ 当前信号不是A级不建议加仓")
prompt_parts.append("3⃣ ❌ 不要开新仓(已有持仓时优先管理现有仓位)") prompt_parts.append("3⃣ ❌ 不要开新仓(已有持仓时优先管理现有仓位)")
prompt_parts.append("") prompt_parts.append("")
@ -501,7 +513,7 @@ class TradingDecisionMaker:
prompt_parts.append("1⃣ 首先检查是否需要取消挂单(信号反向或价格不优)") prompt_parts.append("1⃣ 首先检查是否需要取消挂单(信号反向或价格不优)")
if has_strong_signal: if has_strong_signal:
prompt_parts.append("2⃣ 然后检查是否需要调整挂单或现价入场(**有A级信号**") prompt_parts.append("2⃣ 然后检查是否需要调整挂单或现价入场(**有A级信号**")
prompt_parts.append(" ⭐ A级信号confidence >= 85)可考虑取消挂单现价入场") prompt_parts.append(" ⭐ A级信号confidence >= 90)可考虑取消挂单现价入场")
else: else:
prompt_parts.append("2⃣ 然后检查是否需要调整挂单价格") prompt_parts.append("2⃣ 然后检查是否需要调整挂单价格")
prompt_parts.append(" ⚠️ 当前信号不是A级不建议调整挂单") prompt_parts.append(" ⚠️ 当前信号不是A级不建议调整挂单")
@ -578,13 +590,13 @@ class TradingDecisionMaker:
prompt_parts.append(f"❌ 信号#{i} ({action}) 与强趋势 ({trend_direction}) 相反 → **严禁逆势,返回 HOLD**") prompt_parts.append(f"❌ 信号#{i} ({action}) 与强趋势 ({trend_direction}) 相反 → **严禁逆势,返回 HOLD**")
elif trend_strength == 'medium': elif trend_strength == 'medium':
confidence = sig.get('confidence', 0) confidence = sig.get('confidence', 0)
if confidence >= 85: if confidence >= 90:
prompt_parts.append(f"⚠️ 信号#{i} ({action}) 与中等趋势相反,但 confidence={confidence}>=85 → 可谨慎 micro 仓位") prompt_parts.append(f"⚠️ 信号#{i} ({action}) 与中等趋势相反,但 confidence={confidence}>=85 → 可谨慎 micro 仓位")
else: else:
prompt_parts.append(f"❌ 信号#{i} ({action}) 与中等趋势相反confidence不足 → 返回 HOLD") prompt_parts.append(f"❌ 信号#{i} ({action}) 与中等趋势相反confidence不足 → 返回 HOLD")
else: # weak or neutral else: # weak or neutral
confidence = sig.get('confidence', 0) confidence = sig.get('confidence', 0)
if confidence >= 85: if confidence >= 90:
prompt_parts.append(f"⚠️ 信号#{i} ({action}) 与弱趋势相反,但 confidence={confidence}>=85 → 可 micro 仓位") prompt_parts.append(f"⚠️ 信号#{i} ({action}) 与弱趋势相反,但 confidence={confidence}>=85 → 可 micro 仓位")
else: else:
prompt_parts.append(f"❌ 信号#{i} ({action}) 与弱趋势相反confidence不足 → 返回 HOLD") prompt_parts.append(f"❌ 信号#{i} ({action}) 与弱趋势相反confidence不足 → 返回 HOLD")
@ -731,13 +743,13 @@ class TradingDecisionMaker:
# 盈亏比检查规则(新增) # 盈亏比检查规则(新增)
prompt_parts.append(f"\n## 盈亏比检查(日内交易铁律)") 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" 做多盈亏比 = (止盈价 - 入场价) / (入场价 - 止损价)")
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', []) signals = context.get('signals', [])
@ -767,10 +779,10 @@ class TradingDecisionMaker:
rr_ratio = reward_ratio / risk_ratio rr_ratio = reward_ratio / risk_ratio
rr_percent = (risk_ratio / entry) * 100 rr_percent = (risk_ratio / entry) * 100
if rr_ratio >= 2.0: if rr_ratio >= 1.5:
status = f"✅ 通过 (1:{rr_ratio:.1f})" status = f"✅ 通过 (1:{rr_ratio:.1f})"
else: 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"\n信号 {action} @ ${entry:,.2f}:")
prompt_parts.append(f" - 止损: ${stop_loss:,.2f} (风险 {risk_ratio:.0f} / {rr_percent:.1f}%)") 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})" f"超过最大仓位金额 (保证金 ${margin:.2f} → 持仓价值 ${position_value:.2f}, 总计 ${new_total_value:,.2f} > ${max_position_value:,.2f})"
) )
# 盈亏比检查:所有交易必须满足盈亏比 >= 1:2 # 盈亏比检查:所有交易必须满足盈亏比 >= 1:1.5
action = decision.get('action', '') action = decision.get('action', '')
entry_price = decision.get('entry_price') entry_price = decision.get('entry_price')
stop_loss = decision.get('stop_loss') stop_loss = decision.get('stop_loss')
@ -979,15 +991,15 @@ class TradingDecisionMaker:
# 检查盈亏比 # 检查盈亏比
if risk > 0 and reward > 0: if risk > 0 and reward > 0:
rr_ratio = reward / risk 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: 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" entry={entry_price}, stop_loss={stop_loss}, take_profit={take_profit}")
logger.warning(f" 风险={risk:.0f}, 盈利={reward:.0f}, 盈亏比=1:{rr_ratio:.2f}") logger.warning(f" 风险={risk:.0f}, 盈利={reward:.0f}, 盈亏比=1:{rr_ratio:.2f}")
return self._get_hold_decision( return self._get_hold_decision(
decision['symbol'], 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: except (ValueError, TypeError, ZeroDivisionError) as e: