diff --git a/backend/api/routes/recommendations.py b/backend/api/routes/recommendations.py index 4728030..f34198c 100644 --- a/backend/api/routes/recommendations.py +++ b/backend/api/routes/recommendations.py @@ -211,13 +211,30 @@ async def generate_recommendations( # 导入推荐器 import sys from pathlib import Path - project_root = Path(__file__).parent.parent.parent + # 从 backend/api/routes/recommendations.py 向上找到项目根目录 + # backend/api/routes -> backend/api -> backend -> 项目根目录 + current_file = Path(__file__) + backend_path = current_file.parent.parent.parent # backend目录 + project_root = backend_path.parent # 项目根目录 trading_system_path = project_root / 'trading_system' + logger.info(f"查找交易系统模块: {trading_system_path}") + logger.info(f"路径存在: {trading_system_path.exists()}") + if not trading_system_path.exists(): - raise HTTPException(status_code=500, detail="交易系统模块不存在") + # 尝试其他可能的路径 + alternative_path = backend_path / 'trading_system' + if alternative_path.exists(): + trading_system_path = alternative_path + logger.info(f"使用备用路径: {trading_system_path}") + else: + raise HTTPException( + status_code=500, + detail=f"交易系统模块不存在。查找路径: {trading_system_path}, 备用路径: {alternative_path}" + ) sys.path.insert(0, str(trading_system_path)) + sys.path.insert(0, str(project_root)) from binance_client import BinanceClient from market_scanner import MarketScanner diff --git a/trading_system/main.py b/trading_system/main.py index fa0958d..dd4bea5 100644 --- a/trading_system/main.py +++ b/trading_system/main.py @@ -151,7 +151,18 @@ async def main(): scanner = MarketScanner(client) risk_manager = RiskManager(client) position_manager = PositionManager(client, risk_manager) - strategy = TradingStrategy(client, scanner, risk_manager, position_manager) + + # 初始化推荐器(用于自动生成推荐) + recommender = None + try: + from trade_recommender import TradeRecommender + recommender = TradeRecommender(client, scanner, risk_manager) + logger.info("✓ 推荐器已初始化,将自动生成交易推荐") + except Exception as e: + logger.warning(f"⚠ 推荐器初始化失败: {e},将不生成推荐") + logger.debug(f"错误详情: {type(e).__name__}: {e}") + + strategy = TradingStrategy(client, scanner, risk_manager, position_manager, recommender=recommender) # 4. 打印配置信息 logger.info("交易配置:") diff --git a/trading_system/strategy.py b/trading_system/strategy.py index bbfa63c..0453608 100644 --- a/trading_system/strategy.py +++ b/trading_system/strategy.py @@ -28,7 +28,8 @@ class TradingStrategy: client: BinanceClient, scanner: MarketScanner, risk_manager: RiskManager, - position_manager: PositionManager + position_manager: PositionManager, + recommender=None # 推荐器(可选) ): """ 初始化交易策略 @@ -38,11 +39,13 @@ class TradingStrategy: scanner: 市场扫描器 risk_manager: 风险管理器 position_manager: 仓位管理器 + recommender: 推荐器(可选,如果提供则自动生成推荐) """ self.client = client self.scanner = scanner self.risk_manager = risk_manager self.position_manager = position_manager + self.recommender = recommender # 推荐器 self.running = False self._monitoring_started = False # 是否已启动监控 self._sync_task = None # 定期同步任务 @@ -91,15 +94,6 @@ class TradingStrategy: f"({direction} {change_percent:.2f}%, 市场状态: {market_regime})" ) - # 检查是否应该交易 - if not await self.risk_manager.should_trade(symbol, change_percent): - continue - - # 优化:结合成交量确认 - if not await self._check_volume_confirmation(symbol_info): - logger.info(f"{symbol} 成交量确认失败,跳过") - continue - # 使用技术指标判断交易信号(高胜率策略) trade_signal = await self._analyze_trade_signal(symbol_info) @@ -126,9 +120,27 @@ class TradingStrategy: except Exception as e: logger.debug(f"记录交易信号失败: {e}") + # 自动生成推荐(即使不满足自动交易条件,只要信号强度>=5就生成推荐) + # 注意:推荐生成不检查是否已有持仓,因为推荐是供手动参考的 + if self.recommender and signal_direction and trade_signal.get('strength', 0) >= 5: + try: + await self.recommender._create_recommendation(symbol_info, trade_signal) + logger.debug(f"✓ {symbol} 自动生成推荐成功 (信号强度: {trade_signal.get('strength', 0)}/10)") + except Exception as e: + logger.warning(f"自动生成推荐失败 {symbol}: {e}") + + # 检查是否应该自动交易(已有持仓则跳过自动交易,但推荐已生成) + if not await self.risk_manager.should_trade(symbol, change_percent): + continue + + # 优化:结合成交量确认 + if not await self._check_volume_confirmation(symbol_info): + logger.info(f"{symbol} 成交量确认失败,跳过") + continue + if not trade_signal['should_trade']: logger.info( - f"{symbol} 技术指标分析: {trade_signal['reason']}, 跳过" + f"{symbol} 技术指标分析: {trade_signal['reason']}, 跳过自动交易" ) continue @@ -449,7 +461,8 @@ class TradingStrategy: 'should_trade': should_trade, 'direction': direction, 'reason': ', '.join(reasons) if reasons else '无明确信号', - 'strength': signal_strength + 'strength': signal_strength, + 'trend_4h': trend_4h # 添加4H趋势信息,供推荐器使用 } async def _periodic_sync_positions(self):