update
This commit is contained in:
parent
b7e07e5d0b
commit
27bd4e97e9
@ -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 ✅
|
||||||
|
→ 仓位:micro(1%),降低风险
|
||||||
|
```
|
||||||
|
|
||||||
|
**为什么快速突破用小止损?**
|
||||||
|
- 突破后如果立即回调,说明是假突破,快速止损
|
||||||
|
- 真突破会继续走,小止损不会被扫
|
||||||
|
- 用小止损换取更多交易机会
|
||||||
|
|
||||||
### 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/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)
|
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" → 仓位:micro(1%),用小止损博弈快速行情")
|
||||||
|
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" → 仓位:micro(1%),用小止损博弈快速行情")
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
|||||||
@ -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,500(A级,90%置信度,趋势加速)
|
新信号:BTC 做多 @ $97,500(A级,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,000(A级,95%置信度,强支撑位)
|
新信号:BTC 做多 @ $92,000(A级,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:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user