Riy777 commited on
Commit
7b72a98
·
verified ·
1 Parent(s): d933adc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -219
app.py CHANGED
@@ -1,4 +1,4 @@
1
- # app.py (V11.1.1 - With Diagnostic Prints)
2
  import os
3
  import traceback
4
  import signal
@@ -13,19 +13,18 @@ from fastapi import FastAPI, HTTPException, BackgroundTasks
13
  from datetime import datetime
14
  from typing import List, Dict, Any
15
 
16
- # --- استيراد الخدمات الأساسية للنظام ---
17
  try:
18
  from r2 import R2Service
19
  from LLM import LLMService
20
- from data_manager import DataManager
21
  from ml_engine.processor import MLProcessor
22
  from learning_hub.hub_manager import LearningHubManager
23
  from trade_manager import TradeManager
24
  except ImportError as e:
25
- print(f"❌ [App] خطأ فادح في استيراد الوحدات الأساسية: {e}")
26
- sys.exit(1)
27
 
28
- # --- المتغيرات العالمية (Global Instances) ---
29
  r2_service_global = None
30
  data_manager_global = None
31
  llm_service_global = None
@@ -33,136 +32,81 @@ learning_hub_global = None
33
  trade_manager_global = None
34
  ml_processor_global = None
35
 
36
- MARKET_STATE_OK = True
37
-
38
- # --- مدير حالة النظام ---
39
  class StateManager:
40
  def __init__(self):
41
  self.initialization_complete = False
42
- self.initialization_error = None
43
- self.services_initialized = {
44
- 'r2': False, 'data': False, 'llm': False,
45
- 'hub': False, 'processor': False, 'trade': False
46
- }
47
 
48
  def set_service_initialized(self, service_name):
49
  self.services_initialized[service_name] = True
50
- if all(self.services_initialized.values()):
51
  self.initialization_complete = True
52
- print("🎯 [System] اكتملت تهيئة جميع الخدمات بنجاح.")
53
-
54
- async def wait_for_initialization(self, timeout=120):
55
- """انتظار آمن لاكتمال التهيئة مع مهلة زمنية"""
56
- start_time = time.time()
57
- while not self.initialization_complete:
58
- if time.time() - start_time > timeout:
59
- print("⚠️ [System] تجاوزت مهلة انتظار التهيئة.")
60
- return False
61
- if self.initialization_error:
62
- print(f"❌ [System] توقف الانتظار بسبب خطأ في التهيئة: {self.initialization_error}")
63
- return False
64
- await asyncio.sleep(2)
65
- return True
66
 
67
  state_manager = StateManager()
68
 
69
- # --- دالة التهيئة المركزية ---
70
  async def initialize_services():
71
  global r2_service_global, data_manager_global, llm_service_global
72
  global learning_hub_global, trade_manager_global, ml_processor_global
73
 
74
  try:
75
- print("🚀 [System V11.1] بدء تهيئة الخدمات (وضع توفير الذاكرة)...")
76
 
77
- # 1. الطبقة الأساسية (R2 & Data)
78
  r2_service_global = R2Service()
79
  state_manager.set_service_initialized('r2')
80
 
81
- # تحميل قاعدة العقود (إن وجدت)
82
  contracts_db = await r2_service_global.load_contracts_db_async() or {}
83
-
84
- data_manager_global = DataManager(contracts_db, whale_monitor=None, r2_service=r2_service_global)
85
  await data_manager_global.initialize()
86
  state_manager.set_service_initialized('data')
87
 
88
- # 2. طبقة الذكاء (LLM & Learning Hub)
89
  llm_service_global = LLMService()
90
  llm_service_global.r2_service = r2_service_global
91
-
92
  learning_hub_global = LearningHubManager(r2_service_global, llm_service_global, data_manager_global)
93
  await learning_hub_global.initialize()
94
- llm_service_global.learning_hub = learning_hub_global # ربط عكسي
95
- state_manager.set_service_initialized('llm')
96
  state_manager.set_service_initialized('hub')
97
 
98
- # 3. طبقة التنفيذ والمعالجة
99
- ml_processor_global = MLProcessor(
100
- market_context=None, # سيتم تحديثه في كل دورة
101
- data_manager=data_manager_global,
102
- learning_hub=learning_hub_global
103
- )
104
  state_manager.set_service_initialized('processor')
105
 
 
106
  trade_manager_global = TradeManager(
107
- r2_service_global, learning_hub_global, data_manager_global,
108
- state_manager, callback_on_close=run_bot_cycle_wrapper
 
109
  )
110
  await trade_manager_global.initialize_sentry_exchanges()
111
  state_manager.set_service_initialized('trade')
112
 
113
  return True
114
  except Exception as e:
115
- error_msg = f"فشل تهيئة الخدمات: {e}"
116
- print(f"❌ [System] {error_msg}")
117
  traceback.print_exc()
118
- state_manager.initialization_error = error_msg
119
  return False
120
 
121
- # --- دورة المستكشف الرئيسية (مع إدارة الذاكرة) ---
122
  async def run_explorer_cycle():
123
- """
124
- دورة المستكشف الكاملة (Layer 1).
125
- تقوم بتحميل النماذج عند البدء، وتفريغها عند الانتهاء لتوفير الذاكرة.
126
- """
127
- if not await state_manager.wait_for_initialization():
128
- print("⏳ [Explorer] الخدمات غير جاهزة بعد. تم تخطي الدورة.")
129
- return
130
-
131
- print("\n🔭 [Explorer V11.1] بدء دورة استكشاف جديدة...")
132
-
133
- # 🔴 1. [إدارة الذاكرة] إعادة تحميل النماذج قبل البدء
134
- print("🔄 [Memory] التأكد من تحميل نماذج ML للدورة الحالية...")
135
- try:
136
- if data_manager_global.pattern_analyzer and not data_manager_global.pattern_analyzer.initialized:
137
- await data_manager_global.pattern_analyzer.initialize()
138
- if data_manager_global.layer1_ranker and not data_manager_global.layer1_ranker.model:
139
- await data_manager_global.layer1_ranker.initialize()
140
- except Exception as e:
141
- print(f"⚠️ [Memory] تحذير أثناء إعادة تحميل النماذج: {e}")
142
-
143
  try:
144
- # أ. تحديث سياق السوق
145
- market_ctx = await data_manager_global.get_market_context_async()
146
- ml_processor_global.market_context = market_ctx
147
-
148
- if market_ctx.get('market_trend') == 'bear_market' and market_ctx.get('fear_and_greed_index', 50) < 20:
149
- print("🐻 [Explorer] السوق في حالة خوف شديد. قد يتم تقليل النشاط.")
150
-
151
- # ب. الغربلة الأولية السريعة (Layer 1.1)
152
- candidates_l1 = await data_manager_global.layer1_rapid_screening()
153
- if not candidates_l1:
154
- print("😴 [Explorer] لم يتم العثور على مرشحين في الغربلة الأولية.")
155
- return
156
 
157
- # ج. التحليل العميق المتوازي (Layer 1.2 & 1.3)
158
- print(f"🔬 [Explorer] تحليل عميق لـ {len(candidates_l1)} عملة...")
159
- analyzed_candidates = []
160
- all_results_debug = [] # (V11.1.1) لتخزين كل النتائج لأغراض التشخيص
161
 
162
- data_queue = asyncio.Queue(maxsize=5) # طابور صغير لتوفير الذاكرة
163
-
164
- # تشغيل المنتج (جلب البيانات) والمستهلك (التحليل) بالتوازي
165
- producer_task = asyncio.create_task(data_manager_global.stream_ohlcv_data(candidates_l1, data_queue))
166
 
167
  while True:
168
  batch = await data_queue.get()
@@ -170,150 +114,42 @@ async def run_explorer_cycle():
170
  data_queue.task_done()
171
  break
172
 
173
- # تحليل الدفعة
174
- tasks = [ml_processor_global.process_and_score_symbol_enhanced(c) for c in batch]
175
- results = await asyncio.gather(*tasks, return_exceptions=True)
176
-
177
- for res in results:
178
- if res and isinstance(res, dict):
179
- score = res.get('enhanced_final_score', 0)
180
- all_results_debug.append(res) # تخزين للتشخيص
181
-
182
- # شرط التأهل للقرار النهائي: درجة >= 60%
183
- if score >= 0.60:
184
- analyzed_candidates.append(res)
185
 
186
  data_queue.task_done()
187
-
188
- await producer_task
189
 
190
- # د. الترشيح النهائي والاختيار (Layer 1.4 LLM)
191
- if analyzed_candidates:
192
- analyzed_candidates.sort(key=lambda x: x['enhanced_final_score'], reverse=True)
193
- top_candidates = analyzed_candidates[:5] # نرسل أفضل 5 فقط
194
-
195
- print(f"🧠 [Explorer] إرسال أفضل {len(top_candidates)} عملة إلى LLM...")
196
- watchlist = []
197
- for cand in top_candidates:
198
- # استدعاء LLM لاتخاذ قرار استراتيجي
199
- decision = await llm_service_global.get_trading_decision(cand)
200
- if decision and decision.get('action') == 'WATCH':
201
- watchlist.append({
202
- 'symbol': cand['symbol'],
203
- 'strategy_hint': decision.get('strategy_to_watch', 'GENERIC'),
204
- 'llm_decision_context': {'decision': decision},
205
- 'explorer_score': cand.get('enhanced_final_score', 0)
206
- })
207
- print(f" ✅ [LLM] وافق على {cand['symbol']} (Strategy: {decision.get('strategy_to_watch')})")
208
- else:
209
- print(f" ❌ [LLM] رفض {cand['symbol']}")
210
-
211
- # تحديث قائمة الحارس
212
- await trade_manager_global.update_sentry_watchlist(watchlist)
213
- else:
214
- print("📉 [Explorer] لا يوجد مرشحين مؤهلين (Score >= 0.60) بعد التحليل العميق.")
215
-
216
- # (V11.1.1) طباعة تشخيصية لأفضل الفاشلين
217
- if all_results_debug:
218
- print("\n🔍 [Debug Explorer] أفضل 10 عملات مرفوضة:")
219
- all_results_debug.sort(key=lambda x: x.get('enhanced_final_score', 0), reverse=True)
220
- for i, fail in enumerate(all_results_debug[:10]):
221
- sc = fail.get('enhanced_final_score', 0)
222
- pat = fail.get('pattern_analysis', {}).get('pattern_confidence', 0)
223
- mc = fail.get('monte_carlo_distribution', {}).get('probability_of_gain', 0)
224
- print(f" #{i+1} {fail['symbol']}: {sc:.2f} [Patterns: {pat:.2f} | MC_Prob: {mc:.2f}]")
225
- print("")
226
-
227
- await trade_manager_global.update_sentry_watchlist([])
228
 
229
  except Exception as e:
230
- print(f"❌ [Explorer Error] حدث خطأ غير متوقع أثناء الدورة: {e}")
231
- traceback.print_exc()
232
-
233
  finally:
234
- # 🔴 2. [إدارة الذاكرة] تنظيف الذاكرة بعد انتهاء الدورة
235
- print("🧹 [System] بدء تنظيف الذاكرة وإسبات النماذج...")
236
- if data_manager_global.pattern_analyzer:
237
- data_manager_global.pattern_analyzer.clear_memory()
238
- if data_manager_global.layer1_ranker:
239
- data_manager_global.layer1_ranker.clear_memory()
240
-
241
- gc.collect() # إجبار النظام على تحرير الذاكرة غير المستخدمة
242
- print("✅ [System] اكتمل التنظيف. النظام في وضع الخمول (Idle).")
243
-
244
- # غلاف للدورة ليتوافق مع callback مدير الصفقات
245
- async def run_bot_cycle_wrapper():
246
- await run_explorer_cycle()
247
-
248
- # --- مهام الخلفية المجدولة ---
249
- async def scheduled_tasks_loop():
250
- """حلقة المهام المجدولة (مثل الدورة الرئيسية كل فترة)"""
251
- await state_manager.wait_for_initialization()
252
- while True:
253
- try:
254
- # تشغيل دورة المستكشف كل 15 دقيقة (مثلاً)
255
- await asyncio.sleep(900)
256
- if not trade_manager_global.sentry_watchlist: # إذا كانت القائمة فارغة، نبحث عن فرص جديدة
257
- await run_explorer_cycle()
258
- except asyncio.CancelledError: break
259
- except Exception as e:
260
- print(f"⚠️ [Scheduler] خطأ في المهام المجدولة: {e}")
261
- await asyncio.sleep(60)
262
 
263
- # --- إعداد تطبيق FastAPI ---
264
  @asynccontextmanager
265
  async def lifespan(app: FastAPI):
266
- # عند البدء
267
- print("🏁 [Lifespan] بدء تشغيل النظام...")
268
- init_task = asyncio.create_task(initialize_services())
269
- yield # هنا يعمل التطبيق
270
- # عند الإيقاف
271
- print("🛑 [Lifespan] إيقاف النظام...")
272
  if trade_manager_global: await trade_manager_global.stop_sentry_loops()
273
  if data_manager_global: await data_manager_global.close()
274
- print("👋 [Lifespan] تم الإيقاف بنجاح.")
275
 
276
- app = FastAPI(lifespan=lifespan, title="AI Trading Bot V11.1", version="11.1.0")
277
 
278
- # --- نقاط النهاية (API Endpoints) ---
279
  @app.get("/")
280
  async def root():
281
- return {
282
- "status": "running" if state_manager.initialization_complete else "initializing",
283
- "system": "Explorer-Sentry-Executor V11.1 (Memory Optimized)",
284
- "timestamp": datetime.now().isoformat()
285
- }
286
-
287
- @app.get("/run-cycle")
288
- async def trigger_cycle(background_tasks: BackgroundTasks):
289
- """تشغيل دورة مستكشف يدوياً في الخلفية"""
290
- if not state_manager.initialization_complete:
291
- raise HTTPException(status_code=503, detail="System initializing...")
292
- background_tasks.add_task(run_explorer_cycle)
293
- return {"message": "Explorer cycle triggered in background"}
294
-
295
- @app.get("/status")
296
- async def get_status():
297
- """جلب حالة النظام والحارس"""
298
- sentry_status = {}
299
- if trade_manager_global:
300
- sentry_status = trade_manager_global.get_sentry_status()
301
-
302
- return {
303
- "initialization": state_manager.initialization_complete,
304
- "services": state_manager.services_initialized,
305
- "sentry": sentry_status,
306
- "memory_mode": "On-Demand Loading Active"
307
- }
308
 
309
- @app.on_event("startup")
310
- async def startup_event():
311
- """تشغيل حلقات المراقبة الخلفية بعد بدء التطبيق"""
312
- asyncio.create_task(scheduled_tasks_loop())
313
- # تشغيل حلقة الحارس إذا كان مهيأ
314
- if trade_manager_global:
315
- asyncio.create_task(trade_manager_global.start_sentry_and_monitoring_loops())
316
 
317
  if __name__ == "__main__":
318
- # تشغيل الخادم
319
  uvicorn.run(app, host="0.0.0.0", port=7860)
 
1
+ # app.py (V12.0 - Titan Orchestrator)
2
  import os
3
  import traceback
4
  import signal
 
13
  from datetime import datetime
14
  from typing import List, Dict, Any
15
 
16
+ # --- استيراد الخدمات ---
17
  try:
18
  from r2 import R2Service
19
  from LLM import LLMService
20
+ from ml_engine.data_manager import DataManager
21
  from ml_engine.processor import MLProcessor
22
  from learning_hub.hub_manager import LearningHubManager
23
  from trade_manager import TradeManager
24
  except ImportError as e:
25
+ sys.exit(f"❌ Fatal Error: {e}")
 
26
 
27
+ # --- المتغيرات العالمية ---
28
  r2_service_global = None
29
  data_manager_global = None
30
  llm_service_global = None
 
32
  trade_manager_global = None
33
  ml_processor_global = None
34
 
35
+ # --- مدير الحالة ---
 
 
36
  class StateManager:
37
  def __init__(self):
38
  self.initialization_complete = False
39
+ self.services_initialized = {}
 
 
 
 
40
 
41
  def set_service_initialized(self, service_name):
42
  self.services_initialized[service_name] = True
43
+ if len(self.services_initialized) >= 5: # r2, data, hub, processor, trade
44
  self.initialization_complete = True
45
+ print("🎯 [System] All services initialized.")
 
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
  state_manager = StateManager()
48
 
49
+ # --- التهيئة المركزية ---
50
  async def initialize_services():
51
  global r2_service_global, data_manager_global, llm_service_global
52
  global learning_hub_global, trade_manager_global, ml_processor_global
53
 
54
  try:
55
+ print("🚀 [System V12.0] Starting Titan-Powered Initialization...")
56
 
57
+ # 1. الأساسيات
58
  r2_service_global = R2Service()
59
  state_manager.set_service_initialized('r2')
60
 
 
61
  contracts_db = await r2_service_global.load_contracts_db_async() or {}
62
+ data_manager_global = DataManager(contracts_db, None, r2_service_global)
 
63
  await data_manager_global.initialize()
64
  state_manager.set_service_initialized('data')
65
 
66
+ # 2. الذكاء
67
  llm_service_global = LLMService()
68
  llm_service_global.r2_service = r2_service_global
 
69
  learning_hub_global = LearningHubManager(r2_service_global, llm_service_global, data_manager_global)
70
  await learning_hub_global.initialize()
 
 
71
  state_manager.set_service_initialized('hub')
72
 
73
+ # 3. المعالج (Titan Core)
74
+ ml_processor_global = MLProcessor(None, data_manager_global, learning_hub_global)
75
+ await ml_processor_global.initialize() # تهيئة Titan هنا
 
 
 
76
  state_manager.set_service_initialized('processor')
77
 
78
+ # 4. مدير التداول (تمرير محرك Titan له)
79
  trade_manager_global = TradeManager(
80
+ r2_service_global,
81
+ data_manager_global,
82
+ titan_engine=ml_processor_global.titan # 🔥 تمرير Titan للحارس
83
  )
84
  await trade_manager_global.initialize_sentry_exchanges()
85
  state_manager.set_service_initialized('trade')
86
 
87
  return True
88
  except Exception as e:
89
+ print(f" [Init Error] {e}")
 
90
  traceback.print_exc()
 
91
  return False
92
 
93
+ # --- دورة المستكشف (Titan Explorer Cycle) ---
94
  async def run_explorer_cycle():
95
+ if not state_manager.initialization_complete: return
96
+ print("\n🔭 [Explorer V12.0] Titan scanning market...")
97
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  try:
99
+ # 1. غربلة سريعة (Layer 1)
100
+ candidates = await data_manager_global.layer1_rapid_screening()
101
+ if not candidates: return
 
 
 
 
 
 
 
 
 
102
 
103
+ # 2. تحليل عميق (Layer 2 - Titan)
104
+ print(f"🔬 [Titan] analyzing {len(candidates)} candidates...")
105
+ titan_candidates = []
 
106
 
107
+ # استخدام دفق البيانات الجديد الذي يدعم Titan
108
+ data_queue = asyncio.Queue(maxsize=10)
109
+ producer = asyncio.create_task(data_manager_global.stream_ohlcv_data(candidates, data_queue))
 
110
 
111
  while True:
112
  batch = await data_queue.get()
 
114
  data_queue.task_done()
115
  break
116
 
117
+ for raw_data in batch:
118
+ res = await ml_processor_global.process_and_score_symbol_enhanced(raw_data)
119
+ if res and res['enhanced_final_score'] >= data_manager_global.TITAN_ENTRY_THRESHOLD:
120
+ print(f" 🌟 [Titan Approved] {res['symbol']} Score: {res['enhanced_final_score']:.4f}")
121
+ titan_candidates.append(res)
 
 
 
 
 
 
 
122
 
123
  data_queue.task_done()
124
+ await producer
 
125
 
126
+ # 3. التحديث النهائي للحارس
127
+ titan_candidates.sort(key=lambda x: x['enhanced_final_score'], reverse=True)
128
+ await trade_manager_global.update_sentry_watchlist(titan_candidates[:5])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
 
130
  except Exception as e:
131
+ print(f"❌ [Cycle Error] {e}")
 
 
132
  finally:
133
+ gc.collect()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
 
135
+ # --- FastAPI Setup ---
136
  @asynccontextmanager
137
  async def lifespan(app: FastAPI):
138
+ asyncio.create_task(initialize_services())
139
+ yield
 
 
 
 
140
  if trade_manager_global: await trade_manager_global.stop_sentry_loops()
141
  if data_manager_global: await data_manager_global.close()
 
142
 
143
+ app = FastAPI(lifespan=lifespan, title="Titan Trading Bot V12.0")
144
 
 
145
  @app.get("/")
146
  async def root():
147
+ return {"status": "Titan Online", "init_done": state_manager.initialization_complete}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
 
149
+ @app.get("/force-scan")
150
+ async def force_scan(bg_tasks: BackgroundTasks):
151
+ bg_tasks.add_task(run_explorer_cycle)
152
+ return {"msg": "Scan started"}
 
 
 
153
 
154
  if __name__ == "__main__":
 
155
  uvicorn.run(app, host="0.0.0.0", port=7860)