# app.py (وضع المحاكاة المؤقت - V1.0) # هذا الملف يحل محل البوت الحي لتشغيل اختبارات تاريخية. import sys import os # 🔥 إصلاح حاسم: إضافة مجلد المشروع الجذري إلى مسار بايثون # هذا يضمن أن يرى النظام مجلدات ml_engine و simulation_engine أينما كنت CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) if CURRENT_DIR not in sys.path: sys.path.append(CURRENT_DIR) # ... (باقي التيم بورتات والكود كما هو) ... import uvicorn import asyncio # ... import os from fastapi import FastAPI, BackgroundTasks from contextlib import asynccontextmanager # محاولة استيراد محرك المحاكاة # يجب أن يكون مجلد simulation_engine بجانب هذا الملف تماماً try: from simulation_engine.sim_runner import run_realistic_simulation, SIM_STATUS, SIM_CONFIG SIMULATION_AVAILABLE = True except ImportError as e: print(f"❌ خطأ فادح: لم يتم العثور على محرك المحاكاة. تأكد من وجود مجلد 'simulation_engine' والمِلَف '__init__.py' بداخله.\nالتفاصيل: {e}") SIMULATION_AVAILABLE = False # --- مهمة الخلفية المستمرة --- async def auto_start_simulation(): """تبدأ المحاكاة تلقائياً بعد فترة قصيرة من تشغيل التطبيق""" if not SIMULATION_AVAILABLE: print("🚫 لن يتم بدء المحاكاة بسبب أخطاء الاستيراد.") return print("⏳ ستبدأ المحاكاة تلقائياً خلال 15 ثانية... (تأكد من أن البيانات جاهزة)") await asyncio.sleep(15) # تشغيل المحاكاة (هذه الدالة ستستغرق وقتاً طويلاً حتى تنتهي) await run_realistic_simulation() print("✅ انتهت جلسة المحاكاة. يمكنك مراجعة النتائج في R2.") # --- إعداد FastAPI --- @asynccontextmanager async def lifespan(app: FastAPI): # عند بدء التشغيل، نطلق مهمة المحاكاة في الخلفية task = asyncio.create_task(auto_start_simulation()) yield # عند الإيقاف (لا يوجد شيء خاص للتنظيف هنا حالياً) pass app = FastAPI(lifespan=lifespan, title="Titan Simulation Runner (Temporary)") @app.get("/") async def root(): """واجهة بسيطة لعرض حالة المحاكاة""" if not SIMULATION_AVAILABLE: return {"status": "ERROR", "message": "Simulation engine not found."} return { "status": "RUNNING" if SIM_STATUS["running"] else "IDLE (Waiting or Finished)", "progress": f"{SIM_STATUS['progress']:.2f}%", "virtual_balance": f"${SIM_STATUS['current_balance']:.2f}", "trades_executed": SIM_STATUS["trades_count"], "simulation_period": f"{SIM_CONFIG['START_DATE']} -> {SIM_CONFIG['END_DATE']}" } if __name__ == "__main__": # تشغيل السيرفر print("🔥 تشغيل خادم المحاكاة (Titan Sim)...") # نستخدم منفذ مختلف قليلاً أو نفسه حسب رغبتك، هنا نستخدم الافتراضي 7860 uvicorn.run(app, host="0.0.0.0", port=7860)