Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -96,6 +96,35 @@ async def monitor_market_async():
|
|
| 96 |
state.MARKET_STATE_OK = True
|
| 97 |
await asyncio.sleep(60)
|
| 98 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
async def run_3_layer_analysis():
|
| 100 |
"""
|
| 101 |
تشغيل النظام الطبقي المكون من 3 طبقات:
|
|
@@ -128,18 +157,15 @@ async def run_3_layer_analysis():
|
|
| 128 |
print("❌ فشل جلب بيانات OHLCV للمرشحين")
|
| 129 |
return None
|
| 130 |
|
| 131 |
-
# الطبقة 2: التحليل المتقدم بشكل متوازي
|
| 132 |
-
print("\n📈 الطبقة 2: التحليل المتقدم (MLProcessor) بشكل
|
| 133 |
market_context = await data_manager_global.get_market_context_async()
|
| 134 |
|
| 135 |
# إنشاء معالج ML
|
| 136 |
ml_processor = MLProcessor(market_context, data_manager_global, learning_engine_global)
|
| 137 |
|
| 138 |
-
#
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
# تجهيز المهام
|
| 142 |
-
tasks = []
|
| 143 |
for ohlcv_data in ohlcv_data_list:
|
| 144 |
try:
|
| 145 |
# إضافة أسباب الترشيح من الطبقة 1
|
|
@@ -149,36 +175,34 @@ async def run_3_layer_analysis():
|
|
| 149 |
ohlcv_data['reasons_for_candidacy'] = layer1_candidate.get('reasons', [])
|
| 150 |
ohlcv_data['layer1_score'] = layer1_candidate.get('layer1_score', 0)
|
| 151 |
|
| 152 |
-
|
| 153 |
-
task = ml_processor.process_and_score_symbol_enhanced(ohlcv_data)
|
| 154 |
-
tasks.append(task)
|
| 155 |
|
| 156 |
except Exception as e:
|
| 157 |
print(f"❌ خطأ في إعداد تحليل {ohlcv_data.get('symbol')}: {e}")
|
| 158 |
continue
|
| 159 |
|
| 160 |
-
#
|
| 161 |
-
|
|
|
|
|
|
|
| 162 |
|
| 163 |
-
|
| 164 |
-
layer2_candidates = []
|
| 165 |
-
successful_analyses = 0
|
| 166 |
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
|
| 181 |
-
print(f"✅ اكتمل التحليل المتقدم: {
|
| 182 |
|
| 183 |
if not layer2_candidates:
|
| 184 |
print("❌ لم يتم العثور على مرشحين في الطبقة 2")
|
|
|
|
| 96 |
state.MARKET_STATE_OK = True
|
| 97 |
await asyncio.sleep(60)
|
| 98 |
|
| 99 |
+
async def process_batch_parallel(batch, ml_processor, batch_num, total_batches):
|
| 100 |
+
"""معالجة دفعة من الرموز بشكل متوازي"""
|
| 101 |
+
try:
|
| 102 |
+
print(f" 🔄 معالجة الدفعة {batch_num}/{total_batches} ({len(batch)} عملة)...")
|
| 103 |
+
|
| 104 |
+
# إنشاء مهام للدفعة الحالية
|
| 105 |
+
batch_tasks = []
|
| 106 |
+
for symbol_data in batch:
|
| 107 |
+
task = asyncio.create_task(ml_processor.process_and_score_symbol_enhanced(symbol_data))
|
| 108 |
+
batch_tasks.append(task)
|
| 109 |
+
|
| 110 |
+
# انتظار انتهاء جميع مهام الدفعة الحالية
|
| 111 |
+
batch_results = await asyncio.gather(*batch_tasks, return_exceptions=True)
|
| 112 |
+
|
| 113 |
+
# تصفية النتائج الناجحة
|
| 114 |
+
successful_results = []
|
| 115 |
+
for result in batch_results:
|
| 116 |
+
if isinstance(result, Exception):
|
| 117 |
+
continue
|
| 118 |
+
if result and result.get('enhanced_final_score', 0) > 0.4:
|
| 119 |
+
successful_results.append(result)
|
| 120 |
+
|
| 121 |
+
print(f" ✅ اكتملت الدفعة {batch_num}: {len(successful_results)}/{len(batch)} ناجحة")
|
| 122 |
+
return successful_results
|
| 123 |
+
|
| 124 |
+
except Exception as error:
|
| 125 |
+
print(f"❌ خطأ في معالجة الدفعة {batch_num}: {error}")
|
| 126 |
+
return []
|
| 127 |
+
|
| 128 |
async def run_3_layer_analysis():
|
| 129 |
"""
|
| 130 |
تشغيل النظام الطبقي المكون من 3 طبقات:
|
|
|
|
| 157 |
print("❌ فشل جلب بيانات OHLCV للمرشحين")
|
| 158 |
return None
|
| 159 |
|
| 160 |
+
# الطبقة 2: التحليل المتقدم بشكل متوازي حقيقي
|
| 161 |
+
print(f"\n📈 الطبقة 2: التحليل المتقدم (MLProcessor) بشكل متوازي لـ {len(ohlcv_data_list)} عملة...")
|
| 162 |
market_context = await data_manager_global.get_market_context_async()
|
| 163 |
|
| 164 |
# إنشاء معالج ML
|
| 165 |
ml_processor = MLProcessor(market_context, data_manager_global, learning_engine_global)
|
| 166 |
|
| 167 |
+
# تجهيز البيانات للطبقة 2
|
| 168 |
+
layer2_data = []
|
|
|
|
|
|
|
|
|
|
| 169 |
for ohlcv_data in ohlcv_data_list:
|
| 170 |
try:
|
| 171 |
# إضافة أسباب الترشيح من الطبقة 1
|
|
|
|
| 175 |
ohlcv_data['reasons_for_candidacy'] = layer1_candidate.get('reasons', [])
|
| 176 |
ohlcv_data['layer1_score'] = layer1_candidate.get('layer1_score', 0)
|
| 177 |
|
| 178 |
+
layer2_data.append(ohlcv_data)
|
|
|
|
|
|
|
| 179 |
|
| 180 |
except Exception as e:
|
| 181 |
print(f"❌ خطأ في إعداد تحليل {ohlcv_data.get('symbol')}: {e}")
|
| 182 |
continue
|
| 183 |
|
| 184 |
+
# تقسيم العمل إلى دفعات للمعالجة المتوازية
|
| 185 |
+
batch_size = 20 # 20 عملة في كل دفعة
|
| 186 |
+
batches = [layer2_data[i:i + batch_size] for i in range(0, len(layer2_data), batch_size)]
|
| 187 |
+
total_batches = len(batches)
|
| 188 |
|
| 189 |
+
print(f" 🚀 تقسيم العمل إلى {total_batches} دفعة ({batch_size} عملة لكل دفعة)...")
|
|
|
|
|
|
|
| 190 |
|
| 191 |
+
# معالجة جميع الدفعات بشكل متوازي
|
| 192 |
+
batch_tasks = []
|
| 193 |
+
for i, batch in enumerate(batches):
|
| 194 |
+
task = asyncio.create_task(process_batch_parallel(batch, ml_processor, i+1, total_batches))
|
| 195 |
+
batch_tasks.append(task)
|
| 196 |
+
|
| 197 |
+
# جمع نتائج جميع الدفعات
|
| 198 |
+
batch_results = await asyncio.gather(*batch_tasks)
|
| 199 |
+
|
| 200 |
+
# دمج جميع النتائج
|
| 201 |
+
layer2_candidates = []
|
| 202 |
+
for batch_result in batch_results:
|
| 203 |
+
layer2_candidates.extend(batch_result)
|
| 204 |
|
| 205 |
+
print(f"✅ اكتمل التحليل المتقدم: {len(layer2_candidates)}/{len(ohlcv_data_list)} عملة تم تحليلها بنجاح")
|
| 206 |
|
| 207 |
if not layer2_candidates:
|
| 208 |
print("❌ لم يتم العثور على مرشحين في الطبقة 2")
|