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)