Trad / ml_engine /processor.py
Riy777's picture
Update ml_engine/processor.py
ed906df
raw
history blame
5.37 kB
# 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.")