Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -179,6 +179,7 @@ async def run_3_layer_analysis():
|
|
| 179 |
# إرسال كل عملة للنموذج الضخم على حدة
|
| 180 |
llm_analysis = await llm_service_global.get_trading_decision(candidate)
|
| 181 |
|
|
|
|
| 182 |
if llm_analysis and llm_analysis.get('action') in ['BUY', 'SELL']:
|
| 183 |
opportunity = {
|
| 184 |
'symbol': candidate['symbol'],
|
|
@@ -192,6 +193,8 @@ async def run_3_layer_analysis():
|
|
| 192 |
final_opportunities.append(opportunity)
|
| 193 |
|
| 194 |
print(f" ✅ {candidate['symbol']}: {llm_analysis.get('action')} - ثقة: {llm_analysis.get('confidence_level', 0):.2f}")
|
|
|
|
|
|
|
| 195 |
|
| 196 |
except Exception as e:
|
| 197 |
print(f"❌ خطأ في تحليل النموذج الضخم لـ {candidate.get('symbol')}: {e}")
|
|
@@ -241,19 +244,24 @@ async def re_analyze_open_trade_async(trade_data):
|
|
| 241 |
# استخدام LLM لإعادة التحليل
|
| 242 |
re_analysis_decision = await llm_service_global.re_analyze_trade_async(trade_data, processed_data)
|
| 243 |
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
except Exception as error:
|
| 258 |
print(f"❌ Error during trade re-analysis: {error}")
|
| 259 |
await r2_service_global.save_system_logs_async({
|
|
@@ -282,7 +290,7 @@ async def run_bot_cycle_async():
|
|
| 282 |
print(f"📋 الصفقات المفتوحة: {len(open_trades)}")
|
| 283 |
|
| 284 |
should_look_for_new_trade = len(open_trades) == 0
|
| 285 |
-
|
| 286 |
# إعادة تحليل الصفقات المفتوحة
|
| 287 |
if open_trades:
|
| 288 |
now = datetime.now()
|
|
@@ -364,6 +372,7 @@ async def lifespan(application: FastAPI):
|
|
| 364 |
state_manager.set_service_initialized('data_manager')
|
| 365 |
|
| 366 |
llm_service_global = LLMService()
|
|
|
|
| 367 |
state_manager.set_service_initialized('llm_service')
|
| 368 |
|
| 369 |
sentiment_analyzer_global = SentimentAnalyzer(data_manager_global)
|
|
@@ -442,6 +451,37 @@ async def analyze_market_api():
|
|
| 442 |
else:
|
| 443 |
return {"opportunity_found": False, "message": "No suitable opportunities found"}
|
| 444 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 445 |
async def cleanup_on_shutdown():
|
| 446 |
"""تنظيف الموارد عند الإغلاق"""
|
| 447 |
global r2_service_global, data_manager_global, trade_manager_global, learning_engine_global
|
|
@@ -477,11 +517,14 @@ async def cleanup_on_shutdown():
|
|
| 477 |
|
| 478 |
def signal_handler(signum, frame):
|
| 479 |
"""معالج إشارات الإغلاق"""
|
|
|
|
| 480 |
asyncio.create_task(cleanup_on_shutdown())
|
| 481 |
sys.exit(0)
|
| 482 |
|
|
|
|
| 483 |
signal.signal(signal.SIGINT, signal_handler)
|
| 484 |
signal.signal(signal.SIGTERM, signal_handler)
|
| 485 |
|
| 486 |
if __name__ == "__main__":
|
| 487 |
-
|
|
|
|
|
|
| 179 |
# إرسال كل عملة للنموذج الضخم على حدة
|
| 180 |
llm_analysis = await llm_service_global.get_trading_decision(candidate)
|
| 181 |
|
| 182 |
+
# ✅ التحقق من وجود قرار صالح من النموذج
|
| 183 |
if llm_analysis and llm_analysis.get('action') in ['BUY', 'SELL']:
|
| 184 |
opportunity = {
|
| 185 |
'symbol': candidate['symbol'],
|
|
|
|
| 193 |
final_opportunities.append(opportunity)
|
| 194 |
|
| 195 |
print(f" ✅ {candidate['symbol']}: {llm_analysis.get('action')} - ثقة: {llm_analysis.get('confidence_level', 0):.2f}")
|
| 196 |
+
else:
|
| 197 |
+
print(f" ⚠️ {candidate['symbol']}: لا يوجد قرار تداول من النموذج الضخم")
|
| 198 |
|
| 199 |
except Exception as e:
|
| 200 |
print(f"❌ خطأ في تحليل النموذج الضخم لـ {candidate.get('symbol')}: {e}")
|
|
|
|
| 244 |
# استخدام LLM لإعادة التحليل
|
| 245 |
re_analysis_decision = await llm_service_global.re_analyze_trade_async(trade_data, processed_data)
|
| 246 |
|
| 247 |
+
# ✅ التحقق من وجود قرار صالح من النموذج
|
| 248 |
+
if re_analysis_decision:
|
| 249 |
+
await r2_service_global.save_system_logs_async({
|
| 250 |
+
"trade_reanalyzed": True,
|
| 251 |
+
"symbol": symbol,
|
| 252 |
+
"action": re_analysis_decision.get('action'),
|
| 253 |
+
"strategy": re_analysis_decision.get('strategy', 'GENERIC')
|
| 254 |
+
})
|
| 255 |
+
|
| 256 |
+
return {
|
| 257 |
+
"symbol": symbol,
|
| 258 |
+
"decision": re_analysis_decision,
|
| 259 |
+
"current_price": processed_data.get('current_price')
|
| 260 |
+
}
|
| 261 |
+
else:
|
| 262 |
+
print(f"⚠️ لا يوجد قرار إعادة تحليل لـ {symbol}")
|
| 263 |
+
return None
|
| 264 |
+
|
| 265 |
except Exception as error:
|
| 266 |
print(f"❌ Error during trade re-analysis: {error}")
|
| 267 |
await r2_service_global.save_system_logs_async({
|
|
|
|
| 290 |
print(f"📋 الصفقات المفتوحة: {len(open_trades)}")
|
| 291 |
|
| 292 |
should_look_for_new_trade = len(open_trades) == 0
|
| 293 |
+
|
| 294 |
# إعادة تحليل الصفقات المفتوحة
|
| 295 |
if open_trades:
|
| 296 |
now = datetime.now()
|
|
|
|
| 372 |
state_manager.set_service_initialized('data_manager')
|
| 373 |
|
| 374 |
llm_service_global = LLMService()
|
| 375 |
+
llm_service_global.r2_service = r2_service_global # ✅ ربط R2Service مع LLMService
|
| 376 |
state_manager.set_service_initialized('llm_service')
|
| 377 |
|
| 378 |
sentiment_analyzer_global = SentimentAnalyzer(data_manager_global)
|
|
|
|
| 451 |
else:
|
| 452 |
return {"opportunity_found": False, "message": "No suitable opportunities found"}
|
| 453 |
|
| 454 |
+
@application.get("/portfolio")
|
| 455 |
+
async def get_portfolio_api():
|
| 456 |
+
"""الحصول على حالة المحفظة"""
|
| 457 |
+
if not state_manager.initialization_complete:
|
| 458 |
+
raise HTTPException(status_code=503, detail="الخدمات غير مهيأة بالكامل")
|
| 459 |
+
|
| 460 |
+
try:
|
| 461 |
+
portfolio_state = await r2_service_global.get_portfolio_state_async()
|
| 462 |
+
open_trades = await trade_manager_global.get_open_trades()
|
| 463 |
+
|
| 464 |
+
return {
|
| 465 |
+
"portfolio": portfolio_state,
|
| 466 |
+
"open_trades": open_trades,
|
| 467 |
+
"timestamp": datetime.now().isoformat()
|
| 468 |
+
}
|
| 469 |
+
except Exception as e:
|
| 470 |
+
raise HTTPException(status_code=500, detail=f"خطأ في جلب بيانات المحفظة: {str(e)}")
|
| 471 |
+
|
| 472 |
+
@application.get("/system-status")
|
| 473 |
+
async def get_system_status():
|
| 474 |
+
"""الحصول على حالة النظام التفصيلية"""
|
| 475 |
+
monitoring_status = trade_manager_global.get_monitoring_status() if trade_manager_global else {}
|
| 476 |
+
|
| 477 |
+
return {
|
| 478 |
+
"initialization_complete": state_manager.initialization_complete,
|
| 479 |
+
"services_initialized": state_manager.services_initialized,
|
| 480 |
+
"market_state_ok": state.MARKET_STATE_OK,
|
| 481 |
+
"monitoring_status": monitoring_status,
|
| 482 |
+
"timestamp": datetime.now().isoformat()
|
| 483 |
+
}
|
| 484 |
+
|
| 485 |
async def cleanup_on_shutdown():
|
| 486 |
"""تنظيف الموارد عند الإغلاق"""
|
| 487 |
global r2_service_global, data_manager_global, trade_manager_global, learning_engine_global
|
|
|
|
| 517 |
|
| 518 |
def signal_handler(signum, frame):
|
| 519 |
"""معالج إشارات الإغلاق"""
|
| 520 |
+
print(f"🛑 Received signal {signum}. Initiating shutdown...")
|
| 521 |
asyncio.create_task(cleanup_on_shutdown())
|
| 522 |
sys.exit(0)
|
| 523 |
|
| 524 |
+
# تسجيل معالجات الإشارات
|
| 525 |
signal.signal(signal.SIGINT, signal_handler)
|
| 526 |
signal.signal(signal.SIGTERM, signal_handler)
|
| 527 |
|
| 528 |
if __name__ == "__main__":
|
| 529 |
+
print("🚀 Starting AI Trading Bot with 3-Layer Analysis System...")
|
| 530 |
+
uvicorn.run(application, host="0.0.0.0", port=7860, log_level="info")
|