Spaces:
Paused
Paused
| # ml_engine/processor.py | |
| # (V13.0 - The Central Nervous System - Full Orchestration) | |
| import asyncio | |
| import traceback | |
| import logging | |
| import os | |
| import numpy as np | |
| # --- استيراد المحركات الفرعية --- | |
| # ملاحظة: نفترض أن جميع الملفات موجودة في نفس المجلد ml_engine | |
| try: | |
| from .titan_engine import TitanEngine | |
| from .patterns import ChartPatternAnalyzer | |
| from .monte_carlo import MonteCarloAnalyzer | |
| from .oracle_engine import OracleEngine | |
| from .sniper_engine import SniperEngine | |
| from .hybrid_guardian import HybridDeepSteward | |
| except ImportError as e: | |
| # Fallback للإستيراد المحلي إذا تم التشغيل كسكربت منفصل | |
| print(f"⚠️ [Processor] Import Warning: {e}") | |
| from titan_engine import TitanEngine | |
| from patterns import ChartPatternAnalyzer | |
| from monte_carlo import MonteCarloAnalyzer | |
| from oracle_engine import OracleEngine | |
| from sniper_engine import SniperEngine | |
| from hybrid_guardian import HybridDeepSteward | |
| # إعداد المسارات الافتراضية للنماذج | |
| BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
| MODELS_L2_DIR = os.path.join(BASE_DIR, "ml_models", "layer2") | |
| MODELS_PATTERN_DIR = os.path.join(BASE_DIR, "ml_models", "xgboost_pattern2") | |
| MODELS_UNIFIED_DIR = os.path.join(BASE_DIR, "ml_models", "Unified_Models_V1") | |
| MODELS_GUARD_DIR = os.path.join(BASE_DIR, "ml_models", "guard_v2") | |
| # مسارات الحارس الهجين | |
| GUARD_V2_PATH = os.path.join(BASE_DIR, "ml_models", "DeepSteward_Production_V1.json") | |
| GUARD_V3_PATH = os.path.join(BASE_DIR, "ml_models", "DeepSteward_V3_Production.json") | |
| GUARD_V3_FEAT_PATH = os.path.join(BASE_DIR, "ml_models", "DeepSteward_V3_Features.json") | |
| class MLProcessor: | |
| """ | |
| 💎 GEM-Architect Design: | |
| وحدة المعالجة المركزية (CPU) للمنصة. | |
| هي الوحيدة المخولة بالتواصل مع جميع المحركات الفرعية (Titan, Patterns, Oracle, Sniper, Guardian). | |
| """ | |
| def __init__(self, data_manager=None): | |
| self.data_manager = data_manager # للاستخدام المستقبلي إذا احتاج المعالج جلب بيانات بنفسه | |
| # 1. تهيئة الكائنات (Instances) للمحركات | |
| self.titan = TitanEngine(model_dir=MODELS_L2_DIR) | |
| self.pattern_engine = ChartPatternAnalyzer(models_dir=MODELS_PATTERN_DIR) | |
| self.mc_analyzer = MonteCarloAnalyzer() | |
| self.oracle = OracleEngine(model_dir=MODELS_UNIFIED_DIR) | |
| self.sniper = SniperEngine(models_dir=MODELS_GUARD_DIR) | |
| # الحارس الهجين يتطلب مسارات ملفات محددة | |
| self.guardian = HybridDeepSteward( | |
| v2_model_path=GUARD_V2_PATH, | |
| v3_model_path=GUARD_V3_PATH, | |
| v3_features_map_path=GUARD_V3_FEAT_PATH | |
| ) | |
| self.initialized = False | |
| print("🧠 [MLProcessor V13] Central Brain Created. Waiting for initialization...") | |
| async def initialize(self): | |
| """تهيئة متوازية لجميع المحركات الفرعية لتقليل وقت التشغيل""" | |
| if not self.initialized: | |
| print("⚙️ [Processor] بدء تهيئة النظام العصبي الكامل...") | |
| try: | |
| # تجميع مهام التهيئة غير المتزامنة | |
| tasks = [] | |
| # Titan | |
| if hasattr(self.titan, 'initialize'): tasks.append(self.titan.initialize()) | |
| # Patterns | |
| if hasattr(self.pattern_engine, 'initialize'): tasks.append(self.pattern_engine.initialize()) | |
| # Oracle | |
| if hasattr(self.oracle, 'initialize'): tasks.append(self.oracle.initialize()) | |
| # Sniper | |
| if hasattr(self.sniper, 'initialize'): tasks.append(self.sniper.initialize()) | |
| # تشغيل المهام المتزامنة | |
| if tasks: | |
| await asyncio.gather(*tasks) | |
| # الحارس الهجين (متزامن حالياً) | |
| if hasattr(self.guardian, 'initialize'): | |
| self.guardian.initialize() | |
| self.initialized = True | |
| print("✅ [Processor] جميع المحركات جاهزة للعمل.") | |
| except Exception as e: | |
| print(f"❌ [Processor FATAL] فشل في تهيئة أحد المحركات: {e}") | |
| traceback.print_exc() | |
| # ========================================================================== | |
| # 🔍 واجهات الاستخدام (API Methods for App.py) | |
| # ============================================================================== | |
| # --- 1. التحليل الأولي (L1 Screening & Patterns) --- | |
| async def process_compound_signal(self, raw_data): | |
| """ | |
| تشغيل Titan + Patterns + Simple MC للحصول على تقييم أولي (L1/L2 Score). | |
| يستبدل `process_and_score_symbol_enhanced` القديمة. | |
| """ | |
| if not self.initialized: await self.initialize() | |
| symbol = raw_data.get('symbol') | |
| ohlcv_data = raw_data.get('ohlcv') | |
| current_price = raw_data.get('current_price', 0.0) | |
| if not symbol or not ohlcv_data: return None | |
| try: | |
| # أ. تشغيل Titan & Patterns بالتوازي | |
| titan_task = asyncio.to_thread(self.titan.predict, ohlcv_data) | |
| pattern_task = self.pattern_engine.detect_chart_patterns(ohlcv_data) | |
| # ب. تشغيل مونت كارلو السريع (على 1h) | |
| 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) | |
| mc_score = mc_res.get('mc_prob_gain', 0.5) | |
| # انتظار النتائج | |
| titan_res, pattern_res = await asyncio.gather(titan_task, pattern_task) | |
| # استخراج الدرجات | |
| score_titan = titan_res.get('score', 0.0) | |
| score_patterns = pattern_res.get('pattern_confidence', 0.0) | |
| # المعادلة الهجينة | |
| hybrid_score = (score_titan * 0.50) + (score_patterns * 0.40) + (mc_score * 0.10) | |
| return { | |
| 'symbol': symbol, | |
| 'current_price': current_price, | |
| 'enhanced_final_score': hybrid_score, | |
| 'components': { | |
| 'titan_score': score_titan, | |
| 'patterns_score': score_patterns, | |
| 'mc_score': mc_score | |
| }, | |
| 'ohlcv': ohlcv_data, # تمرير البيانات للمراحل التالية | |
| 'titan_details': titan_res, | |
| 'pattern_details': pattern_res.get('details', {}) | |
| } | |
| except Exception as e: | |
| print(f"❌ [Processor] Error processing {symbol}: {e}") | |
| return None | |
| # --- 2. التحليل الإحصائي المتقدم (L2 Boosting) --- | |
| async def run_advanced_monte_carlo(self, ohlcv_data): | |
| """واجهة لاستدعاء مونت كارلو المتقدم""" | |
| return await self.mc_analyzer.generate_1h_distribution_advanced(ohlcv_data) | |
| # --- 3. العقل الاحتمالي (L3 Oracle) --- | |
| async def consult_oracle(self, symbol_data): | |
| """واجهة لاستشارة Oracle""" | |
| if not self.initialized: await self.initialize() | |
| return await self.oracle.predict(symbol_data) | |
| # --- 4. القناص (L4 Entry Sniper) --- | |
| async def check_sniper_entry(self, ohlcv_1m_data): | |
| """واجهة لاستدعاء Sniper""" | |
| if not self.initialized: await self.initialize() | |
| return await self.sniper.check_entry_signal_async(ohlcv_1m_data) | |
| def set_sniper_threshold(self, threshold): | |
| """تعديل حساسية القناص""" | |
| if self.sniper: | |
| self.sniper.set_entry_threshold(threshold) | |
| # --- 5. الحارس الهجين (Active Trade Management) --- | |
| def consult_guardian(self, ohlcv_1m, ohlcv_5m, ohlcv_15m, entry_price): | |
| """ | |
| واجهة لاستشارة الحارس الهجين (Hybrid Guardian). | |
| يعيد قرار: HOLD, EXIT_SOFT, EXIT_HARD | |
| """ | |
| if not self.guardian or not self.guardian.initialized: | |
| return {'action': 'HOLD', 'reason': 'Guardian Disabled'} | |
| return self.guardian.analyze_position(ohlcv_1m, ohlcv_5m, ohlcv_15m, float(entry_price)) | |
| # --- 6. الوصول إلى الخصائص الداخلية (للإحصائيات فقط) --- | |
| def guardian_instance(self): | |
| """إتاحة الوصول المباشر للحارس فقط لأغراض عرض الإحصائيات في app.py""" | |
| return self.guardian | |
| print("✅ ML Processor V13.0 (Unified Orchestrator) loaded.") |