File size: 6,303 Bytes
3031827
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# learning_hub/hub_manager.py
import asyncio
from typing import Any, Dict

# (استيراد جميع المكونات الداخلية للمركز)
from .schemas import *
from .policy_engine import PolicyEngine
from .memory_store import MemoryStore
from .statistical_analyzer import StatisticalAnalyzer
from .reflector import Reflector
from .curator import Curator

class LearningHubManager:
    def __init__(self, r2_service: Any, llm_service: Any, data_manager: Any):
        print("🚀 Initializing Learning Hub Manager...")
        
        # 1. الخدمات الأساسية (يتم تمريرها من app.py)
        self.r2_service = r2_service
        self.llm_service = llm_service
        self.data_manager = data_manager

        # 2. تهيئة المكونات (بناء النظام)
        self.policy_engine = PolicyEngine()
        self.memory_store = MemoryStore(
            r2_service=self.r2_service, 
            policy_engine=self.policy_engine,
            llm_service=self.llm_service 
        )
        self.reflector = Reflector(
            llm_service=self.llm_service,
            memory_store=self.memory_store
        )
        self.curator = Curator(
            llm_service=self.llm_service,
            memory_store=self.memory_store
        )
        self.statistical_analyzer = StatisticalAnalyzer(
            r2_service=self.r2_service,
            data_manager=self.data_manager
        )
        
        self.initialized = False
        print("✅ Learning Hub Manager constructed. Ready for initialization.")

    async def initialize(self):
        """
        تهيئة جميع الأنظمة الفرعية، وخاصة تحميل الإحصائيات والأوزان.
        """
        if self.initialized:
            return
            
        print("🔄 [HubManager] Initializing all sub-modules...")
        await self.statistical_analyzer.initialize()
        self.initialized = True
        print("✅ [HubManager] All sub-modules initialized. Learning Hub is LIVE.")

    async def analyze_trade_and_learn(self, trade_object: Dict[str, Any], close_reason: str):
        """
        هذه هي الدالة الرئيسية التي يستدعيها TradeManager.
        إنها تشغل كلاً من نظام التعلم السريع (Reflector) والبطيء (StatsAnalyzer).
        """
        if not self.initialized:
            print("⚠️ [HubManager] Learning Hub not initialized. Skipping learning.")
            return

        print(f"🧠 [HubManager] Learning from trade {trade_object.get('symbol')}...")

        try:
            # 1. التعلم السريع (Reflector):
            await self.reflector.analyze_trade_outcome(trade_object, close_reason)
        except Exception as e:
            print(f"❌ [HubManager] Reflector (Fast-Learner) failed: {e}")

        try:
            # 2. التعلم البطيء (StatisticalAnalyzer):
            await self.statistical_analyzer.update_statistics(trade_object, close_reason)
        except Exception as e:
            print(f"❌ [HubManager] StatisticalAnalyzer (Slow-Learner) failed: {e}")
            
        print(f"✅ [HubManager] Learning complete for {trade_object.get('symbol')}.")
        
    async def get_active_context_for_llm(self, domain: str, query: str) -> str:
        """
        يُستخدم بواسطة LLMService لجلب "الدفتر" (Playbook) / القواعد (Deltas).
        """
        if not self.initialized:
            return "Learning Hub not initialized."
            
        return await self.memory_store.get_active_context(domain, query)
        
    async def get_statistical_feedback_for_llm(self, entry_strategy: str) -> str:
        """
        يُستخدم بواسطة LLMService لجلب أفضل ملف خروج (إحصائياً).
        """
        if not self.initialized:
            return "Learning Hub not initialized."

        best_profile = await self.statistical_analyzer.get_best_exit_profile(entry_strategy)
        
        if best_profile != "unknown":
            # (Prompt in English as requested)
            feedback = f"Statistical Feedback: For the '{entry_strategy}' strategy, the '{best_profile}' exit profile has historically performed best."
            return feedback
        else:
            return "No statistical feedback available for this strategy yet."

    async def get_optimized_weights(self, market_condition: str) -> Dict[str, float]:
        """
        يُستخدم بواسطة MLProcessor/StrategyEngine لجلب الأوزان المعدلة إحصائياً.
        """
        if not self.initialized:
            defaults = await self.statistical_analyzer.get_default_strategy_weights()
            return defaults.get("strategy_weights", {})
            
        return await self.statistical_analyzer.get_optimized_strategy_weights(market_condition)
        
    async def run_distillation_check(self):
        """
        (يتم استدعاؤها دورياً من app.py)
        للتحقق من جميع المجالات وتشغيل التقطير إذا لزم الأمر.
        """
        if not self.initialized:
            return
            
        print("ℹ️ [HubManager] Running periodic distillation check...")
        for domain in self.memory_store.domain_files.keys():
            await self.curator.check_and_distill_domain(domain)
        print("✅ [HubManager] Distillation check complete.")
        
    # 🔴 --- START OF CHANGE --- 🔴
    # (New function to save all data on shutdown)
    async def shutdown(self):
        """
        Saves all persistent data from the statistical analyzer.
        """
        if not self.initialized:
            return
            
        print("🔄 [HubManager] Shutting down... Saving all learning data.")
        try:
            await self.statistical_analyzer.save_weights_to_r2()
            await self.statistical_analyzer.save_performance_history()
            await self.statistical_analyzer.save_exit_profile_effectiveness()
            print("✅ [HubManager] All statistical (slow-learner) data saved.")
        except Exception as e:
            print(f"❌ [HubManager] Failed to save learning data on shutdown: {e}")
    # 🔴 --- END OF CHANGE --- 🔴