Spaces:
Paused
Paused
Update ml_engine/processor.py
Browse files- ml_engine/processor.py +67 -35
ml_engine/processor.py
CHANGED
|
@@ -1,18 +1,19 @@
|
|
| 1 |
# ml_engine/processor.py
|
| 2 |
-
# (V12.
|
| 3 |
|
| 4 |
import asyncio
|
| 5 |
import traceback
|
| 6 |
import numpy as np
|
| 7 |
|
| 8 |
-
# استيراد
|
| 9 |
try:
|
| 10 |
from ml_engine.titan_engine import TitanEngine
|
| 11 |
except ImportError:
|
| 12 |
-
print("❌ [Processor] لم يتم العثور على titan_engine.py!
|
| 13 |
TitanEngine = None
|
| 14 |
|
| 15 |
from ml_engine.monte_carlo import MonteCarloAnalyzer
|
|
|
|
| 16 |
|
| 17 |
class MLProcessor:
|
| 18 |
def __init__(self, market_context, data_manager, learning_hub):
|
|
@@ -20,63 +21,94 @@ class MLProcessor:
|
|
| 20 |
self.data_manager = data_manager
|
| 21 |
self.learning_hub = learning_hub
|
| 22 |
|
| 23 |
-
#
|
| 24 |
self.titan = TitanEngine() if TitanEngine else None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
self.mc_analyzer = MonteCarloAnalyzer()
|
| 26 |
|
| 27 |
-
# حالة التهيئة
|
| 28 |
self.initialized = False
|
| 29 |
|
| 30 |
async def initialize(self):
|
| 31 |
-
"""تهيئة
|
| 32 |
-
if
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
async def process_and_score_symbol_enhanced(self, raw_data):
|
| 37 |
"""
|
| 38 |
-
المعالجة المركزية
|
| 39 |
-
الآن، Titan هو المسؤول الأول والأخير عن القرار الفني.
|
| 40 |
"""
|
| 41 |
-
# ضمان التهيئة
|
| 42 |
if not self.initialized: await self.initialize()
|
| 43 |
-
|
| 44 |
symbol = raw_data.get('symbol')
|
| 45 |
-
ohlcv_data = raw_data.get('ohlcv')
|
| 46 |
|
| 47 |
-
if not symbol or not ohlcv_data
|
| 48 |
|
| 49 |
try:
|
| 50 |
-
# 1.
|
| 51 |
-
#
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
#
|
|
|
|
|
|
|
|
|
|
| 57 |
mc_score = 0.5
|
| 58 |
if '1h' in ohlcv_data:
|
| 59 |
closes = np.array([c[4] for c in ohlcv_data['1h']])
|
|
|
|
| 60 |
mc_res = self.mc_analyzer.generate_1h_price_distribution_simple(closes)
|
|
|
|
| 61 |
mc_score = mc_res.get('mc_prob_gain', 0.5)
|
| 62 |
|
| 63 |
-
#
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
analysis_result = {
|
| 69 |
'symbol': symbol,
|
| 70 |
'current_price': raw_data.get('current_price', 0.0),
|
| 71 |
-
#
|
| 72 |
-
'enhanced_final_score': final_decision_score,
|
| 73 |
|
| 74 |
-
# تفاصيل للشفافية
|
| 75 |
-
'
|
| 76 |
-
|
| 77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
|
| 79 |
-
#
|
| 80 |
'ohlcv_sample': {tf: data[-1] for tf, data in ohlcv_data.items() if data}
|
| 81 |
}
|
| 82 |
|
|
@@ -87,4 +119,4 @@ class MLProcessor:
|
|
| 87 |
traceback.print_exc()
|
| 88 |
return None
|
| 89 |
|
| 90 |
-
print("✅ ML Processor V12.
|
|
|
|
| 1 |
# ml_engine/processor.py
|
| 2 |
+
# (V12.3 - Hybrid Scoring Core: Titan + Patterns + Monte Carlo)
|
| 3 |
|
| 4 |
import asyncio
|
| 5 |
import traceback
|
| 6 |
import numpy as np
|
| 7 |
|
| 8 |
+
# استيراد المحركات الثلاثة
|
| 9 |
try:
|
| 10 |
from ml_engine.titan_engine import TitanEngine
|
| 11 |
except ImportError:
|
| 12 |
+
print("❌ [Processor] لم يتم العثور على titan_engine.py!")
|
| 13 |
TitanEngine = None
|
| 14 |
|
| 15 |
from ml_engine.monte_carlo import MonteCarloAnalyzer
|
| 16 |
+
from ml_engine.patterns import ChartPatternAnalyzer # محرك الأنماط V11.1
|
| 17 |
|
| 18 |
class MLProcessor:
|
| 19 |
def __init__(self, market_context, data_manager, learning_hub):
|
|
|
|
| 21 |
self.data_manager = data_manager
|
| 22 |
self.learning_hub = learning_hub
|
| 23 |
|
| 24 |
+
# 1. المحرك الرئيسي (Titan) - القناص (50%)
|
| 25 |
self.titan = TitanEngine() if TitanEngine else None
|
| 26 |
+
|
| 27 |
+
# 2. المحرك المساند (Patterns) - المتخصصون (40%)
|
| 28 |
+
# نستخدم نفس النسخة الموجودة في DataManager لتوفير الذاكرة إذا أمكن
|
| 29 |
+
if self.data_manager and self.data_manager.pattern_analyzer:
|
| 30 |
+
self.pattern_engine = self.data_manager.pattern_analyzer
|
| 31 |
+
else:
|
| 32 |
+
self.pattern_engine = ChartPatternAnalyzer()
|
| 33 |
+
|
| 34 |
+
# 3. المحرك الاحتمالي (Monte Carlo) - المدقق (10%)
|
| 35 |
self.mc_analyzer = MonteCarloAnalyzer()
|
| 36 |
|
|
|
|
| 37 |
self.initialized = False
|
| 38 |
|
| 39 |
async def initialize(self):
|
| 40 |
+
"""تهيئة جميع المحركات الفرعية"""
|
| 41 |
+
if not self.initialized:
|
| 42 |
+
print("⚙️ [Processor] تهيئة نظام التقييم الهجين...")
|
| 43 |
+
tasks = []
|
| 44 |
+
if self.titan and not self.titan.initialized:
|
| 45 |
+
tasks.append(self.titan.initialize())
|
| 46 |
+
if self.pattern_engine and not self.pattern_engine.initialized:
|
| 47 |
+
tasks.append(self.pattern_engine.initialize())
|
| 48 |
+
|
| 49 |
+
if tasks:
|
| 50 |
+
await asyncio.gather(*tasks)
|
| 51 |
+
self.initialized = True
|
| 52 |
+
print("✅ [Processor] النظام الهجين جاهز.")
|
| 53 |
|
| 54 |
async def process_and_score_symbol_enhanced(self, raw_data):
|
| 55 |
"""
|
| 56 |
+
المعالجة المركزية الهجينة (Hybrid Core Processing)
|
|
|
|
| 57 |
"""
|
|
|
|
| 58 |
if not self.initialized: await self.initialize()
|
|
|
|
| 59 |
symbol = raw_data.get('symbol')
|
| 60 |
+
ohlcv_data = raw_data.get('ohlcv')
|
| 61 |
|
| 62 |
+
if not symbol or not ohlcv_data: return None
|
| 63 |
|
| 64 |
try:
|
| 65 |
+
# --- 1. تشغيل المحركات الثلاثة بالتوازي ---
|
| 66 |
+
# (للسرعة القصوى، لا ننتظر واحداً تلو الآخر)
|
| 67 |
+
|
| 68 |
+
# أ. مهمة Titan
|
| 69 |
+
titan_task = asyncio.to_thread(self.titan.predict, ohlcv_data) if self.titan else None
|
| 70 |
+
|
| 71 |
+
# ب. مهمة الأنماط
|
| 72 |
+
pattern_task = self.pattern_engine.detect_chart_patterns(ohlcv_data) if self.pattern_engine else None
|
| 73 |
+
|
| 74 |
+
# ج. مهمة مونت كارلو (على فريم الساعة كمعيار)
|
| 75 |
mc_score = 0.5
|
| 76 |
if '1h' in ohlcv_data:
|
| 77 |
closes = np.array([c[4] for c in ohlcv_data['1h']])
|
| 78 |
+
# تشغيل سريع غير متزامن للمحاكاة
|
| 79 |
mc_res = self.mc_analyzer.generate_1h_price_distribution_simple(closes)
|
| 80 |
+
# تطبيع النتيجة لتكون بين 0 و 1 (هي أصلاً احتمالية)
|
| 81 |
mc_score = mc_res.get('mc_prob_gain', 0.5)
|
| 82 |
|
| 83 |
+
# انتظار النتائج
|
| 84 |
+
titan_res = await titan_task if titan_task else {'score': 0.0}
|
| 85 |
+
pattern_res = await pattern_task if pattern_task else {'pattern_confidence': 0.0}
|
| 86 |
+
|
| 87 |
+
# --- 2. استخراج الدرجات الخام ---
|
| 88 |
+
score_titan = titan_res.get('score', 0.0)
|
| 89 |
+
score_patterns = pattern_res.get('pattern_confidence', 0.0)
|
| 90 |
+
score_mc = mc_score
|
| 91 |
+
|
| 92 |
+
# --- 3. تطبيق المعادلة الهجينة (The Hybrid Formula) ---
|
| 93 |
+
# Titan (50%) + Patterns (40%) + MC (10%)
|
| 94 |
+
hybrid_score = (score_titan * 0.50) + (score_patterns * 0.40) + (score_mc * 0.10)
|
| 95 |
+
|
| 96 |
+
# تجميع النتيجة النهائية
|
| 97 |
analysis_result = {
|
| 98 |
'symbol': symbol,
|
| 99 |
'current_price': raw_data.get('current_price', 0.0),
|
| 100 |
+
'enhanced_final_score': hybrid_score, # الدرجة النهائية المعتمدة
|
|
|
|
| 101 |
|
| 102 |
+
# تفاصيل للشفافية (Audit Trail)
|
| 103 |
+
'components': {
|
| 104 |
+
'titan_score': score_titan,
|
| 105 |
+
'patterns_score': score_patterns,
|
| 106 |
+
'mc_score': score_mc
|
| 107 |
+
},
|
| 108 |
+
'titan_details': titan_res,
|
| 109 |
+
'pattern_details': pattern_res.get('details', {}),
|
| 110 |
|
| 111 |
+
# عينة بيانات للحارس
|
| 112 |
'ohlcv_sample': {tf: data[-1] for tf, data in ohlcv_data.items() if data}
|
| 113 |
}
|
| 114 |
|
|
|
|
| 119 |
traceback.print_exc()
|
| 120 |
return None
|
| 121 |
|
| 122 |
+
print("✅ ML Processor V12.3 (Hybrid Core) loaded.")
|