Riy777 commited on
Commit
2e06244
·
verified ·
1 Parent(s): c1bc90c

Update ml_engine/processor.py

Browse files
Files changed (1) hide show
  1. ml_engine/processor.py +148 -72
ml_engine/processor.py CHANGED
@@ -1,122 +1,198 @@
1
  # ml_engine/processor.py
2
- # (V12.4 - Fix: Pass Full OHLCV to Brain)
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
17
 
18
  class MLProcessor:
19
- def __init__(self, market_context, data_manager, learning_hub):
20
- self.market_context = market_context
21
- self.data_manager = data_manager
22
- self.learning_hub = learning_hub
23
-
24
- # 1. المحرك الرئيسي (Titan)
25
- self.titan = TitanEngine() if TitanEngine else None
26
-
27
- # 2. المحرك المساند (Patterns)
28
- if self.data_manager and self.data_manager.pattern_analyzer:
29
- self.pattern_engine = self.data_manager.pattern_analyzer
30
- else:
31
- self.pattern_engine = ChartPatternAnalyzer()
32
 
33
- # 3. المحرك الاحتمالي (Monte Carlo)
 
 
 
 
 
34
  self.mc_analyzer = MonteCarloAnalyzer()
 
 
35
 
 
 
 
 
 
 
 
36
  self.initialized = False
 
37
 
38
  async def initialize(self):
39
- """تهيئة جميع المحركات الفرعية"""
40
  if not self.initialized:
41
- print("⚙️ [Processor] تهيئة نظام التقييم الهجين...")
42
- tasks = []
43
- if self.titan and not self.titan.initialized:
44
- tasks.append(self.titan.initialize())
45
- if self.pattern_engine and not self.pattern_engine.initialized:
46
- tasks.append(self.pattern_engine.initialize())
47
-
48
- if tasks:
49
- await asyncio.gather(*tasks)
50
- self.initialized = True
51
- print("✅ [Processor] النظام الهجين جاهز.")
 
 
 
 
 
 
52
 
53
- async def process_and_score_symbol_enhanced(self, raw_data):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  """
55
- المعالجة المركزية الهجينة (Hybrid Core Processing)
 
56
  """
57
  if not self.initialized: await self.initialize()
 
58
  symbol = raw_data.get('symbol')
59
  ohlcv_data = raw_data.get('ohlcv')
60
-
 
61
  if not symbol or not ohlcv_data: return None
62
 
63
  try:
64
- # --- 1. تشغيل المحركات الثلاثة بالتوازي ---
65
-
66
- # أ. مهمة Titan
67
- titan_task = asyncio.to_thread(self.titan.predict, ohlcv_data) if self.titan else None
68
 
69
- # ب. مهمة الأنماط
70
- pattern_task = self.pattern_engine.detect_chart_patterns(ohlcv_data) if self.pattern_engine else None
71
-
72
- # ج. مهمة مونت كارلو (السريعة)
73
  mc_score = 0.5
74
  if '1h' in ohlcv_data:
75
  closes = np.array([c[4] for c in ohlcv_data['1h']])
76
- # تشغيل سريع غير متزامن للمحاكاة البسيطة
77
  mc_res = self.mc_analyzer.generate_1h_price_distribution_simple(closes)
78
  mc_score = mc_res.get('mc_prob_gain', 0.5)
79
 
80
  # انتظار النتائج
81
- titan_res = await titan_task if titan_task else {'score': 0.0}
82
- pattern_res = await pattern_task if pattern_task else {'pattern_confidence': 0.0}
83
-
84
- # --- 2. استخراج الدرجات الخام ---
85
  score_titan = titan_res.get('score', 0.0)
86
  score_patterns = pattern_res.get('pattern_confidence', 0.0)
87
- score_mc = mc_score
88
 
89
- # --- 3. تطبيق المعادلة الهجينة ---
90
- hybrid_score = (score_titan * 0.50) + (score_patterns * 0.40) + (score_mc * 0.10)
91
 
92
- # تجميع النتيجة النهائية
93
- analysis_result = {
94
  'symbol': symbol,
95
- 'current_price': raw_data.get('current_price', 0.0),
96
  'enhanced_final_score': hybrid_score,
97
-
98
- # تفاصيل للشفافية
99
  'components': {
100
  'titan_score': score_titan,
101
  'patterns_score': score_patterns,
102
- 'mc_score': score_mc
103
  },
 
104
  'titan_details': titan_res,
105
- 'pattern_details': pattern_res.get('details', {}),
106
-
107
- # [ 🚀 التعديل الجوهري V12.4 ]
108
- # تمرير البيانات الكاملة لكي يستلمها LLM
109
- 'ohlcv': ohlcv_data,
110
-
111
- # نبقي العينة فقط للاستخدامات الخفيفة (Sentry)
112
- 'ohlcv_sample': {tf: data[-1] for tf, data in ohlcv_data.items() if data}
113
  }
114
 
115
- return analysis_result
116
-
117
  except Exception as e:
118
- print(f"❌ [Processor] خطأ في معالجة {symbol}: {e}")
119
- traceback.print_exc()
120
  return None
121
 
122
- print("✅ ML Processor V12.4 (Full Data Pass) loaded.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # ml_engine/processor.py
2
+ # (V13.0 - The Central Nervous System - Full Orchestration)
3
 
4
  import asyncio
5
  import traceback
6
+ import logging
7
+ import os
8
  import numpy as np
9
 
10
+ # --- استيراد المحركات الفرعية ---
11
+ # ملاحظة: نفترض أن جميع الملفات موجودة في نفس المجلد ml_engine
12
  try:
13
+ from .titan_engine import TitanEngine
14
+ from .patterns import ChartPatternAnalyzer
15
+ from .monte_carlo import MonteCarloAnalyzer
16
+ from .oracle_engine import OracleEngine
17
+ from .sniper_engine import SniperEngine
18
+ from .hybrid_guardian import HybridDeepSteward
19
+ except ImportError as e:
20
+ # Fallback للإستيراد المحلي إذا تم التشغيل كسكربت منفصل
21
+ print(f"⚠️ [Processor] Import Warning: {e}")
22
+ from titan_engine import TitanEngine
23
+ from patterns import ChartPatternAnalyzer
24
+ from monte_carlo import MonteCarloAnalyzer
25
+ from oracle_engine import OracleEngine
26
+ from sniper_engine import SniperEngine
27
+ from hybrid_guardian import HybridDeepSteward
28
+
29
+ # إعداد المسارات الافتراضية للنماذج
30
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
31
+ MODELS_L2_DIR = os.path.join(BASE_DIR, "ml_models", "layer2")
32
+ MODELS_PATTERN_DIR = os.path.join(BASE_DIR, "ml_models", "xgboost_pattern2")
33
+ MODELS_UNIFIED_DIR = os.path.join(BASE_DIR, "ml_models", "Unified_Models_V1")
34
+ MODELS_GUARD_DIR = os.path.join(BASE_DIR, "ml_models", "guard_v2")
35
+
36
+ # مسارات الحارس الهجين
37
+ GUARD_V2_PATH = os.path.join(BASE_DIR, "ml_models", "DeepSteward_Production_V1.json")
38
+ GUARD_V3_PATH = os.path.join(BASE_DIR, "ml_models", "DeepSteward_V3_Production.json")
39
+ GUARD_V3_FEAT_PATH = os.path.join(BASE_DIR, "ml_models", "DeepSteward_V3_Features.json")
40
 
 
 
41
 
42
  class MLProcessor:
43
+ """
44
+ 💎 GEM-Architect Design:
45
+ وحدة المعالجة المركزية (CPU) للمنصة.
46
+ هي الوحيدة المخولة بالتواصل مع جميع المحركات الفرعية (Titan, Patterns, Oracle, Sniper, Guardian).
47
+ """
 
 
 
 
 
 
 
 
48
 
49
+ def __init__(self, data_manager=None):
50
+ self.data_manager = data_manager # للاستخدام المستقبلي إذا احتاج المعالج جلب بيانات بنفسه
51
+
52
+ # 1. تهيئة الكائنات (Instances) للمحركات
53
+ self.titan = TitanEngine(model_dir=MODELS_L2_DIR)
54
+ self.pattern_engine = ChartPatternAnalyzer(models_dir=MODELS_PATTERN_DIR)
55
  self.mc_analyzer = MonteCarloAnalyzer()
56
+ self.oracle = OracleEngine(model_dir=MODELS_UNIFIED_DIR)
57
+ self.sniper = SniperEngine(models_dir=MODELS_GUARD_DIR)
58
 
59
+ # الحارس الهجين يتطلب مسارات ملفات محددة
60
+ self.guardian = HybridDeepSteward(
61
+ v2_model_path=GUARD_V2_PATH,
62
+ v3_model_path=GUARD_V3_PATH,
63
+ v3_features_map_path=GUARD_V3_FEAT_PATH
64
+ )
65
+
66
  self.initialized = False
67
+ print("🧠 [MLProcessor V13] Central Brain Created. Waiting for initialization...")
68
 
69
  async def initialize(self):
70
+ """تهيئة متوازية لجميع المحركات الفرعية لتقليل وقت التشغيل"""
71
  if not self.initialized:
72
+ print("⚙️ [Processor] بدء تهيئة النظام العصبي الكامل...")
73
+ try:
74
+ # تجميع مهام التهيئة غير المتزامنة
75
+ tasks = []
76
+
77
+ # Titan
78
+ if hasattr(self.titan, 'initialize'): tasks.append(self.titan.initialize())
79
+ # Patterns
80
+ if hasattr(self.pattern_engine, 'initialize'): tasks.append(self.pattern_engine.initialize())
81
+ # Oracle
82
+ if hasattr(self.oracle, 'initialize'): tasks.append(self.oracle.initialize())
83
+ # Sniper
84
+ if hasattr(self.sniper, 'initialize'): tasks.append(self.sniper.initialize())
85
+
86
+ # تشغيل المهام المتزامنة
87
+ if tasks:
88
+ await asyncio.gather(*tasks)
89
 
90
+ # الحارس الهجين (متزامن حالياً)
91
+ if hasattr(self.guardian, 'initialize'):
92
+ self.guardian.initialize()
93
+
94
+ self.initialized = True
95
+ print("✅ [Processor] جميع المحركات جاهزة للعمل.")
96
+
97
+ except Exception as e:
98
+ print(f"❌ [Processor FATAL] فشل في تهيئة أحد المحركات: {e}")
99
+ traceback.print_exc()
100
+
101
+ # ==========================================================================
102
+ # 🔍 واجهات الاستخدام (API Methods for App.py)
103
+ # ==============================================================================
104
+
105
+ # --- 1. التحليل الأولي (L1 Screening & Patterns) ---
106
+ async def process_compound_signal(self, raw_data):
107
  """
108
+ تشغيل Titan + Patterns + Simple MC للحصول على تقييم أولي (L1/L2 Score).
109
+ يستبدل `process_and_score_symbol_enhanced` القديمة.
110
  """
111
  if not self.initialized: await self.initialize()
112
+
113
  symbol = raw_data.get('symbol')
114
  ohlcv_data = raw_data.get('ohlcv')
115
+ current_price = raw_data.get('current_price', 0.0)
116
+
117
  if not symbol or not ohlcv_data: return None
118
 
119
  try:
120
+ # أ. تشغيل Titan & Patterns بالتوازي
121
+ titan_task = asyncio.to_thread(self.titan.predict, ohlcv_data)
122
+ pattern_task = self.pattern_engine.detect_chart_patterns(ohlcv_data)
 
123
 
124
+ # ب. تشغيل مونت كارلو السريع (على 1h)
 
 
 
125
  mc_score = 0.5
126
  if '1h' in ohlcv_data:
127
  closes = np.array([c[4] for c in ohlcv_data['1h']])
 
128
  mc_res = self.mc_analyzer.generate_1h_price_distribution_simple(closes)
129
  mc_score = mc_res.get('mc_prob_gain', 0.5)
130
 
131
  # انتظار النتائج
132
+ titan_res, pattern_res = await asyncio.gather(titan_task, pattern_task)
133
+
134
+ # استخراج الدرجات
 
135
  score_titan = titan_res.get('score', 0.0)
136
  score_patterns = pattern_res.get('pattern_confidence', 0.0)
 
137
 
138
+ # المعادلة الهجينة
139
+ hybrid_score = (score_titan * 0.50) + (score_patterns * 0.40) + (mc_score * 0.10)
140
 
141
+ return {
 
142
  'symbol': symbol,
143
+ 'current_price': current_price,
144
  'enhanced_final_score': hybrid_score,
 
 
145
  'components': {
146
  'titan_score': score_titan,
147
  'patterns_score': score_patterns,
148
+ 'mc_score': mc_score
149
  },
150
+ 'ohlcv': ohlcv_data, # تمرير البيانات للمراحل التالية
151
  'titan_details': titan_res,
152
+ 'pattern_details': pattern_res.get('details', {})
 
 
 
 
 
 
 
153
  }
154
 
 
 
155
  except Exception as e:
156
+ print(f"❌ [Processor] Error processing {symbol}: {e}")
 
157
  return None
158
 
159
+ # --- 2. التحليل الإحصائي المتقدم (L2 Boosting) ---
160
+ async def run_advanced_monte_carlo(self, ohlcv_data):
161
+ """واجهة لاستدعاء مونت كارلو المتقدم"""
162
+ return await self.mc_analyzer.generate_1h_distribution_advanced(ohlcv_data)
163
+
164
+ # --- 3. العقل الاحتمالي (L3 Oracle) ---
165
+ async def consult_oracle(self, symbol_data):
166
+ """واجهة لاستشارة Oracle"""
167
+ if not self.initialized: await self.initialize()
168
+ return await self.oracle.predict(symbol_data)
169
+
170
+ # --- 4. القناص (L4 Entry Sniper) ---
171
+ async def check_sniper_entry(self, ohlcv_1m_data):
172
+ """واجهة لاستدعاء Sniper"""
173
+ if not self.initialized: await self.initialize()
174
+ return await self.sniper.check_entry_signal_async(ohlcv_1m_data)
175
+
176
+ def set_sniper_threshold(self, threshold):
177
+ """تعديل حساسية القناص"""
178
+ if self.sniper:
179
+ self.sniper.set_entry_threshold(threshold)
180
+
181
+ # --- 5. الحارس الهجين (Active Trade Management) ---
182
+ def consult_guardian(self, ohlcv_1m, ohlcv_5m, ohlcv_15m, entry_price):
183
+ """
184
+ واجهة لاستشارة الحارس الهجين (Hybrid Guardian).
185
+ يعيد قرار: HOLD, EXIT_SOFT, EXIT_HARD
186
+ """
187
+ if not self.guardian or not self.guardian.initialized:
188
+ return {'action': 'HOLD', 'reason': 'Guardian Disabled'}
189
+
190
+ return self.guardian.analyze_position(ohlcv_1m, ohlcv_5m, ohlcv_15m, float(entry_price))
191
+
192
+ # --- 6. الوصول إلى الخصائص الداخلية (للإحصائيات فقط) ---
193
+ @property
194
+ def guardian_instance(self):
195
+ """إتاحة الوصول المباشر للحارس فقط لأغراض عرض الإحصائيات في app.py"""
196
+ return self.guardian
197
+
198
+ print("✅ ML Processor V13.0 (Unified Orchestrator) loaded.")