This commit is contained in:
薇薇安 2026-01-27 08:44:35 +08:00
parent 88ed3bfab4
commit d4edc16f43

View File

@ -149,13 +149,14 @@ class MarketScanner:
if min_volume_strict > min_volume_normal: if min_volume_strict > min_volume_normal:
logger.info(f"使用严格成交量过滤: {min_volume_strict/1000000:.1f}M USDT (原标准: {min_volume_normal/1000000:.1f}M USDT)") logger.info(f"使用严格成交量过滤: {min_volume_strict/1000000:.1f}M USDT (原标准: {min_volume_normal/1000000:.1f}M USDT)")
# 按信号得分和涨跌幅综合排序取前N个 # ⚠️ 2026-01-27优化按真实的signal_strength排序而不是简单的signalScore
# 优先考虑技术指标信号得分高的 # 优先考虑信号强度高的交易对8-10分提升胜率
sorted_results = sorted( sorted_results = sorted(
filtered_results, filtered_results,
key=lambda x: ( key=lambda x: (
x.get('signalScore', 0) * 10, # 信号得分权重更高 x.get('signal_strength', 0) * 100, # 信号强度权重最高乘以100确保优先级
abs(x['changePercent']) # 其次考虑涨跌幅 x.get('signalScore', 0) * 10, # 其次考虑信号得分(兼容性)
abs(x['changePercent']) # 最后考虑涨跌幅
), ),
reverse=True reverse=True
) )
@ -198,12 +199,13 @@ class MarketScanner:
for i, symbol_info in enumerate(top_n, 1): for i, symbol_info in enumerate(top_n, 1):
rsi_str = f"RSI:{symbol_info.get('rsi', 0):.1f}" if symbol_info.get('rsi') else "RSI:N/A" rsi_str = f"RSI:{symbol_info.get('rsi', 0):.1f}" if symbol_info.get('rsi') else "RSI:N/A"
regime_str = symbol_info.get('marketRegime', 'unknown') regime_str = symbol_info.get('marketRegime', 'unknown')
score_str = f"信号:{symbol_info.get('signalScore', 0)}" # ⚠️ 2026-01-27优化显示真实的signal_strength而不是signalScore
strength_str = f"信号:{symbol_info.get('signal_strength', symbol_info.get('signalScore', 0))}"
logger.info( logger.info(
f"{i}. {symbol_info['symbol']}: " f"{i}. {symbol_info['symbol']}: "
f"{symbol_info['changePercent']:.2f}% | " f"{symbol_info['changePercent']:.2f}% | "
f"{rsi_str} | {regime_str} | {score_str} | " f"{rsi_str} | {regime_str} | {strength_str} | "
f"价格: {symbol_info['price']:.4f}" f"价格: {symbol_info['price']:.4f}"
) )
@ -340,7 +342,7 @@ class MarketScanner:
except Exception as e: except Exception as e:
logger.debug(f"{symbol} 缓存技术指标计算结果失败: {e}") logger.debug(f"{symbol} 缓存技术指标计算结果失败: {e}")
# 计算交易信号得分(用于排序) # 计算交易信号得分(用于排序)- 保留用于兼容性
signal_score = 0 signal_score = 0
# RSI信号均值回归 # RSI信号均值回归
@ -375,6 +377,80 @@ class MarketScanner:
elif current_price < ema20 < ema50: # 下降趋势 elif current_price < ema20 < ema50: # 下降趋势
signal_score += 1 signal_score += 1
# ⚠️ 2026-01-27优化计算真实的signal_strength用于排序和筛选
# 使用与strategy.py相同的逻辑确保排序依据与交易判断一致
signal_strength = 0
direction = None
# 获取4H周期当前价格用于判断4H趋势
price_4h = close_prices_4h[-1] if len(close_prices_4h) > 0 else current_price
# 判断4H周期趋势方向
trend_4h = None
if ema20_4h is not None:
if price_4h > ema20_4h:
trend_4h = 'up'
elif price_4h < ema20_4h:
trend_4h = 'down'
else:
trend_4h = 'neutral'
# 策略权重配置与strategy.py保持一致
TREND_SIGNAL_WEIGHTS = {
'macd_cross': 5, # MACD金叉/死叉
'ema_cross': 4, # EMA20上穿/下穿EMA50
'price_above_ema20': 3, # 价格在EMA20之上/下
'4h_trend_confirmation': 2, # 4H趋势确认
}
# MACD金叉/死叉(权重最高)
if macd and macd['macd'] > macd['signal'] and macd['histogram'] > 0:
# MACD金叉做多信号需4H趋势向上或中性
if trend_4h in ('up', 'neutral', None):
signal_strength += TREND_SIGNAL_WEIGHTS['macd_cross']
if direction is None:
direction = 'BUY'
elif macd and macd['macd'] < macd['signal'] and macd['histogram'] < 0:
# MACD死叉做空信号需4H趋势向下或中性
if trend_4h in ('down', 'neutral', None):
signal_strength += TREND_SIGNAL_WEIGHTS['macd_cross']
if direction is None:
direction = 'SELL'
# EMA均线系统
if ema20 and ema50:
if current_price > ema20 > ema50: # 上升趋势
if trend_4h in ('up', 'neutral', None):
signal_strength += TREND_SIGNAL_WEIGHTS['ema_cross']
if direction is None:
direction = 'BUY'
elif current_price < ema20 < ema50: # 下降趋势
if trend_4h in ('down', 'neutral', None):
signal_strength += TREND_SIGNAL_WEIGHTS['ema_cross']
if direction is None:
direction = 'SELL'
# 价格与EMA20关系
if ema20:
if current_price > ema20:
if trend_4h in ('up', 'neutral', None) and direction == 'BUY':
signal_strength += TREND_SIGNAL_WEIGHTS['price_above_ema20']
elif current_price < ema20:
if trend_4h in ('down', 'neutral', None) and direction == 'SELL':
signal_strength += TREND_SIGNAL_WEIGHTS['price_above_ema20']
# 4H趋势确认加分
if direction and trend_4h:
if (direction == 'BUY' and trend_4h == 'up') or (direction == 'SELL' and trend_4h == 'down'):
signal_strength += TREND_SIGNAL_WEIGHTS['4h_trend_confirmation']
elif (direction == 'BUY' and trend_4h == 'down') or (direction == 'SELL' and trend_4h == 'up'):
# 逆势信号,直接拒绝
signal_strength = 0
direction = None
# 强度上限归一到 0-10
signal_strength = max(0, min(int(signal_strength), 10))
return { return {
'symbol': symbol, 'symbol': symbol,
# 技术分析使用的价格K线收盘价 # 技术分析使用的价格K线收盘价
@ -399,7 +475,9 @@ class MarketScanner:
'ema20_4h': ema20_4h, # 4H周期EMA20用于多周期共振 'ema20_4h': ema20_4h, # 4H周期EMA20用于多周期共振
'price_4h': close_prices_4h[-1] if len(close_prices_4h) > 0 else current_price, # 4H周期当前价格 'price_4h': close_prices_4h[-1] if len(close_prices_4h) > 0 else current_price, # 4H周期当前价格
'marketRegime': market_regime, 'marketRegime': market_regime,
'signalScore': signal_score, 'signalScore': signal_score, # 保留用于兼容性
'signal_strength': signal_strength, # ⚠️ 2026-01-27优化添加真实的信号强度
'trend_4h': trend_4h, # 4H趋势方向
'klines': klines[-10:], # 保留最近10根K线 'klines': klines[-10:], # 保留最近10根K线
'klines_4h': klines_4h[-10:] if len(klines_4h) >= 10 else klines_4h # 保留最近10根4H K线 'klines_4h': klines_4h[-10:] if len(klines_4h) >= 10 else klines_4h # 保留最近10根4H K线
} }