# ml_engine/processor.py # (V12.3 - Hybrid Scoring Core: Titan + Patterns + Monte Carlo) import asyncio import traceback import numpy as np # استيراد المحركات الثلاثة try: from ml_engine.titan_engine import TitanEngine except ImportError: print("❌ [Processor] لم يتم العثور على titan_engine.py!") TitanEngine = None from ml_engine.monte_carlo import MonteCarloAnalyzer from ml_engine.patterns import ChartPatternAnalyzer # محرك الأنماط V11.1 class MLProcessor: def __init__(self, market_context, data_manager, learning_hub): self.market_context = market_context self.data_manager = data_manager self.learning_hub = learning_hub # 1. المحرك الرئيسي (Titan) - القناص (50%) self.titan = TitanEngine() if TitanEngine else None # 2. المحرك المساند (Patterns) - المتخصصون (40%) # نستخدم نفس النسخة الموجودة في DataManager لتوفير الذاكرة إذا أمكن if self.data_manager and self.data_manager.pattern_analyzer: self.pattern_engine = self.data_manager.pattern_analyzer else: self.pattern_engine = ChartPatternAnalyzer() # 3. المحرك الاحتمالي (Monte Carlo) - المدقق (10%) self.mc_analyzer = MonteCarloAnalyzer() self.initialized = False async def initialize(self): """تهيئة جميع المحركات الفرعية""" if not self.initialized: print("⚙️ [Processor] تهيئة نظام التقييم الهجين...") tasks = [] if self.titan and not self.titan.initialized: tasks.append(self.titan.initialize()) if self.pattern_engine and not self.pattern_engine.initialized: tasks.append(self.pattern_engine.initialize()) if tasks: await asyncio.gather(*tasks) self.initialized = True print("✅ [Processor] النظام الهجين جاهز.") async def process_and_score_symbol_enhanced(self, raw_data): """ المعالجة المركزية الهجينة (Hybrid Core Processing) """ if not self.initialized: await self.initialize() symbol = raw_data.get('symbol') ohlcv_data = raw_data.get('ohlcv') if not symbol or not ohlcv_data: return None try: # --- 1. تشغيل المحركات الثلاثة بالتوازي --- # (للسرعة القصوى، لا ننتظر واحداً تلو الآخر) # أ. مهمة Titan titan_task = asyncio.to_thread(self.titan.predict, ohlcv_data) if self.titan else None # ب. مهمة الأنماط pattern_task = self.pattern_engine.detect_chart_patterns(ohlcv_data) if self.pattern_engine else None # ج. مهمة مونت كارلو (على فريم الساعة كمعيار) mc_score = 0.5 if '1h' in ohlcv_data: closes = np.array([c[4] for c in ohlcv_data['1h']]) # تشغيل سريع غير متزامن للمحاكاة mc_res = self.mc_analyzer.generate_1h_price_distribution_simple(closes) # تطبيع النتيجة لتكون بين 0 و 1 (هي أصلاً احتمالية) mc_score = mc_res.get('mc_prob_gain', 0.5) # انتظار النتائج titan_res = await titan_task if titan_task else {'score': 0.0} pattern_res = await pattern_task if pattern_task else {'pattern_confidence': 0.0} # --- 2. استخراج الدرجات الخام --- score_titan = titan_res.get('score', 0.0) score_patterns = pattern_res.get('pattern_confidence', 0.0) score_mc = mc_score # --- 3. تطبيق المعادلة الهجينة (The Hybrid Formula) --- # Titan (50%) + Patterns (40%) + MC (10%) hybrid_score = (score_titan * 0.50) + (score_patterns * 0.40) + (score_mc * 0.10) # تجميع النتيجة النهائية analysis_result = { 'symbol': symbol, 'current_price': raw_data.get('current_price', 0.0), 'enhanced_final_score': hybrid_score, # الدرجة النهائية المعتمدة # تفاصيل للشفافية (Audit Trail) 'components': { 'titan_score': score_titan, 'patterns_score': score_patterns, 'mc_score': score_mc }, 'titan_details': titan_res, 'pattern_details': pattern_res.get('details', {}), # عينة بيانات للحارس 'ohlcv_sample': {tf: data[-1] for tf, data in ohlcv_data.items() if data} } return analysis_result except Exception as e: print(f"❌ [Processor] خطأ في معالجة {symbol}: {e}") traceback.print_exc() return None print("✅ ML Processor V12.3 (Hybrid Core) loaded.")