File size: 6,826 Bytes
8627b02 a65d968 249c1ff a65d968 1ec0cc0 a65d968 1ec0cc0 a65d968 cdb0782 5b421c2 7b72a98 a65d968 06c3da5 a65d968 2d4b98a a65d968 7b72a98 a65d968 7b72a98 a65d968 1ec0cc0 a65d968 7b72a98 a65d968 7b72a98 a65d968 8627b02 a65d968 50ade6b a65d968 7b72a98 a65d968 cdb0782 a65d968 8627b02 cdb0782 852690d cdb0782 7b72a98 cdb0782 a65d968 cdb0782 7b72a98 50ade6b 1ec0cc0 a65d968 7b72a98 50ade6b a65d968 cdb0782 a65d968 cdb0782 7b72a98 1ec0cc0 cdb0782 a65d968 7b72a98 cdb0782 50ade6b 8627b02 7b72a98 1ec0cc0 7b72a98 50ade6b cdb0782 7b72a98 8627b02 ca2a31f 7b72a98 6274dab cdb0782 1ec0cc0 cdb0782 1ec0cc0 9d9872a 7b72a98 8627b02 2d4b98a cdb0782 7b72a98 cdb0782 8627b02 50ade6b 8627b02 a65d968 cdb0782 7b72a98 50ade6b 1ec0cc0 7b72a98 a65d968 7b72a98 a65d968 1ec0cc0 7b72a98 cdb0782 50ade6b cdb0782 8627b02 cdb0782 8627b02 50ade6b 8627b02 50ade6b 8627b02 1ec0cc0 a65d968 175ba68 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
# app.py (V12.2 - Titan Orchestrator + Diagnostics)
import os
import traceback
import signal
import sys
import uvicorn
import asyncio
import json
import gc
import time
from contextlib import asynccontextmanager
from fastapi import FastAPI, HTTPException, BackgroundTasks
from datetime import datetime
from typing import List, Dict, Any
# --- استيراد الخدمات ---
try:
from r2 import R2Service
from LLM import LLMService
from data_manager import DataManager
from ml_engine.processor import MLProcessor
from learning_hub.hub_manager import LearningHubManager
from trade_manager import TradeManager
except ImportError as e:
sys.exit(f"❌ Fatal Error: {e}")
# --- المتغيرات العالمية ---
r2_service_global = None
data_manager_global = None
llm_service_global = None
learning_hub_global = None
trade_manager_global = None
ml_processor_global = None
# --- مدير الحالة ---
class StateManager:
def __init__(self):
self.initialization_complete = False
self.services_initialized = {}
def set_service_initialized(self, service_name):
self.services_initialized[service_name] = True
if len(self.services_initialized) >= 5:
self.initialization_complete = True
print("🎯 [System] All services initialized. Ready for external triggers.")
state_manager = StateManager()
# --- التهيئة المركزية ---
async def initialize_services():
global r2_service_global, data_manager_global, llm_service_global
global learning_hub_global, trade_manager_global, ml_processor_global
try:
print("🚀 [System V12.2] Starting Titan-Powered Initialization...")
r2_service_global = R2Service()
state_manager.set_service_initialized('r2')
contracts_db = await r2_service_global.load_contracts_db_async() or {}
data_manager_global = DataManager(contracts_db, None, r2_service_global)
await data_manager_global.initialize()
state_manager.set_service_initialized('data')
llm_service_global = LLMService()
llm_service_global.r2_service = r2_service_global
learning_hub_global = LearningHubManager(r2_service_global, llm_service_global, data_manager_global)
await learning_hub_global.initialize()
state_manager.set_service_initialized('hub')
ml_processor_global = MLProcessor(None, data_manager_global, learning_hub_global)
await ml_processor_global.initialize()
state_manager.set_service_initialized('processor')
trade_manager_global = TradeManager(
r2_service_global,
data_manager_global,
titan_engine=ml_processor_global.titan
)
await trade_manager_global.initialize_sentry_exchanges()
state_manager.set_service_initialized('trade')
return True
except Exception as e:
print(f"❌ [Init Error] {e}")
traceback.print_exc()
return False
# --- دورة المستكشف (Titan Explorer Cycle) ---
async def run_explorer_cycle():
if not state_manager.initialization_complete:
print("⏳ [Cycle Skipped] System still initializing...")
return
print(f"\n🔭 [Explorer V12.2] Cycle started at {datetime.now().strftime('%H:%M:%S')}")
try:
# 1. غربلة سريعة (Layer 1)
candidates = await data_manager_global.layer1_rapid_screening()
if not candidates:
print("😴 [Explorer] No candidates found in Layer 1.")
return
# 2. تحليل عميق (Layer 2 - Titan)
print(f"🔬 [Titan] analyzing {len(candidates)} candidates...")
titan_candidates = []
all_scored_debug = [] # 🔥 قائمة جديدة للتشخيص
data_queue = asyncio.Queue(maxsize=10)
producer = asyncio.create_task(data_manager_global.stream_ohlcv_data(candidates, data_queue))
while True:
batch = await data_queue.get()
if batch is None:
data_queue.task_done()
break
for raw_data in batch:
res = await ml_processor_global.process_and_score_symbol_enhanced(raw_data)
if res:
score = res.get('enhanced_final_score', 0.0)
# تخزين للتشخيص
all_scored_debug.append(res)
if score >= data_manager_global.TITAN_ENTRY_THRESHOLD:
print(f" 🌟 [Titan Approved] {res['symbol']} Score: {score:.4f}")
titan_candidates.append(res)
data_queue.task_done()
await producer
# 3. التحديث النهائي للحارس (مع التشخيص)
if titan_candidates:
titan_candidates.sort(key=lambda x: x['enhanced_final_score'], reverse=True)
top_picks = titan_candidates[:5]
print(f"✅ [Explorer] Sending {len(top_picks)} to Sentry.")
await trade_manager_global.update_sentry_watchlist(top_picks)
else:
print("📉 [Explorer] Titan rejected all candidates this cycle.")
# 🔥 طباعة تشخيصية لأفضل المرفوضين
if all_scored_debug:
print(f"\n🔍 [Debug] أفضل 10 مرفوضين (العتبة المطلوبة: {data_manager_global.TITAN_ENTRY_THRESHOLD}):")
all_scored_debug.sort(key=lambda x: x.get('enhanced_final_score', 0.0), reverse=True)
for i, cand in enumerate(all_scored_debug[:10]):
print(f" #{i+1} {cand['symbol']}: {cand.get('enhanced_final_score', 0.0):.4f}")
print("-" * 40)
except Exception as e:
print(f"❌ [Cycle Error] {e}")
traceback.print_exc()
finally:
gc.collect()
# --- FastAPI Setup ---
@asynccontextmanager
async def lifespan(app: FastAPI):
asyncio.create_task(initialize_services())
yield
if trade_manager_global: await trade_manager_global.stop_sentry_loops()
if data_manager_global: await data_manager_global.close()
print("👋 [System] Shutdown complete.")
app = FastAPI(lifespan=lifespan, title="Titan Trading Bot V12.2")
@app.get("/")
async def root():
return {"status": "Titan Online", "initialized": state_manager.initialization_complete}
@app.get("/run-cycle")
async def trigger_cycle(background_tasks: BackgroundTasks):
if not state_manager.initialization_complete:
raise HTTPException(status_code=503, detail="System initializing...")
background_tasks.add_task(run_explorer_cycle)
return {"message": "Cycle triggered"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860) |