Spaces:
Running
Running
Update data_manager.py
Browse files- data_manager.py +18 -24
data_manager.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# data_manager.py (Updated to V7.
|
| 2 |
import os
|
| 3 |
import asyncio
|
| 4 |
import httpx
|
|
@@ -67,7 +67,7 @@ class DataManager:
|
|
| 67 |
self.pattern_analyzer = ChartPatternAnalyzer(r2_service=None)
|
| 68 |
# --- (نهاية الإضافة) ---
|
| 69 |
|
| 70 |
-
print("✅ DataManager initialized - V7.
|
| 71 |
|
| 72 |
async def _load_markets(self):
|
| 73 |
try:
|
|
@@ -323,12 +323,13 @@ class DataManager:
|
|
| 323 |
except Exception as e:
|
| 324 |
return 0.0
|
| 325 |
|
|
|
|
| 326 |
def _calculate_1h_reversal_spark_score(self, analysis: Dict) -> float:
|
| 327 |
"""
|
| 328 |
-
(
|
| 329 |
"""
|
| 330 |
try:
|
| 331 |
-
# (1. واقي العملات المستقرة
|
| 332 |
ohlcv_candles = analysis.get('ohlcv_1h', {}).get('1h', [])
|
| 333 |
if not ohlcv_candles or len(ohlcv_candles) < 30:
|
| 334 |
return 0.0
|
|
@@ -364,7 +365,6 @@ class DataManager:
|
|
| 364 |
|
| 365 |
# --- (منطق فلترة "الشرارة") ---
|
| 366 |
|
| 367 |
-
# (النمط هو الأهم)
|
| 368 |
pattern_score = 0.0
|
| 369 |
if pattern_analysis.get('predicted_direction') == 'up':
|
| 370 |
pattern_score = pattern_analysis.get('pattern_confidence', 0)
|
|
@@ -389,12 +389,13 @@ class DataManager:
|
|
| 389 |
if avg_volume > 0 and (current_volume / avg_volume) > 1.1:
|
| 390 |
vol_score = 0.5 # (مجرد اهتمام بسيط)
|
| 391 |
|
| 392 |
-
# (الأوزان
|
| 393 |
-
WEIGHT_PATTERN = 0.
|
| 394 |
-
WEIGHT_RSI_SPARK = 0.
|
| 395 |
-
WEIGHT_ADX_COIL = 0.
|
| 396 |
WEIGHT_MC = 0.10
|
| 397 |
-
WEIGHT_VOL = 0.10
|
|
|
|
| 398 |
|
| 399 |
final_score = (
|
| 400 |
(pattern_score * WEIGHT_PATTERN) +
|
|
@@ -408,13 +409,14 @@ class DataManager:
|
|
| 408 |
|
| 409 |
except Exception as e:
|
| 410 |
return 0.0
|
|
|
|
| 411 |
|
| 412 |
|
| 413 |
async def layer1_rapid_screening(self) -> List[Dict[str, Any]]:
|
| 414 |
"""
|
| 415 |
-
الطبقة 1: فحص سريع - (محدث بالكامل V7.
|
| 416 |
"""
|
| 417 |
-
print("📊 الطبقة 1 (V7.
|
| 418 |
|
| 419 |
# الخطوة 1: جلب أفضل 100 عملة حسب الحجم
|
| 420 |
volume_data = await self._get_volume_data_optimal()
|
|
@@ -484,6 +486,7 @@ class DataManager:
|
|
| 484 |
|
| 485 |
# (2. إذا فشل فلتر الانفجار، جرب فلتر "الشرارة")
|
| 486 |
if burst_score < 0.50:
|
|
|
|
| 487 |
spark_score = self._calculate_1h_reversal_spark_score(analysis_output)
|
| 488 |
|
| 489 |
final_score = spark_score # (استخدام درجة الشرارة)
|
|
@@ -498,9 +501,8 @@ class DataManager:
|
|
| 498 |
if 'ohlcv_1h' in symbol_data: del symbol_data['ohlcv_1h']
|
| 499 |
|
| 500 |
final_candidates.append(symbol_data)
|
| 501 |
-
# (else: فشل في كلا الفلترين، يتم تجاهله)
|
| 502 |
|
| 503 |
-
print(f"🎯 اكتملت الغربلة (V7.
|
| 504 |
|
| 505 |
if final_candidates:
|
| 506 |
print("🏆 المرشحون الناجحون:")
|
|
@@ -511,7 +513,6 @@ class DataManager:
|
|
| 511 |
|
| 512 |
return final_candidates
|
| 513 |
|
| 514 |
-
# 🔴 --- START OF CHANGE (V7.8) --- 🔴
|
| 515 |
async def _run_mini_detector(self, symbol_data: Dict) -> Dict:
|
| 516 |
"""(محدث V7.8) يشغل المحللات + يطبع نتيجة الأنماط V8"""
|
| 517 |
ohlcv_1h = symbol_data.get('ohlcv_1h')
|
|
@@ -540,31 +541,24 @@ class DataManager:
|
|
| 540 |
pattern_result = results[1]
|
| 541 |
analysis_dict['pattern_analysis'] = pattern_result
|
| 542 |
|
| 543 |
-
# (استخراج البيانات للطباعة)
|
| 544 |
pattern_name = pattern_result.get('pattern_detected', 'no_clear_pattern')
|
| 545 |
confidence = pattern_result.get('pattern_confidence', 0)
|
| 546 |
tf = pattern_result.get('timeframe', 'N/A')
|
| 547 |
|
| 548 |
if pattern_name != "Neutral / No Pattern" and confidence > 0.5:
|
| 549 |
-
# (نمط مفيد ومرتفع الثقة)
|
| 550 |
print(f" 💡 [ML Pattern] {symbol}: نمط مُكتشف! "
|
| 551 |
f"'{pattern_name}' (الثقة: {confidence:.2f}) على إطار {tf}")
|
| 552 |
elif pattern_name == "Neutral / No Pattern":
|
| 553 |
-
# (لا يوجد نمط - لا نطبع شيئاً لتجنب إغراق السجل)
|
| 554 |
pass
|
| 555 |
else:
|
| 556 |
-
# (نمط ضعيف الثقة)
|
| 557 |
print(f" - [ML Pattern] {symbol}: نمط ضعيف. "
|
| 558 |
f"'{pattern_name}' (الثقة: {confidence:.2f}) على إطار {tf}")
|
| 559 |
|
| 560 |
else:
|
| 561 |
-
# (في حال فشل النموذج V8.8)
|
| 562 |
print(f" ❌ [ML Pattern] {symbol}: فشل تحليل الأنماط ({results[1]})")
|
| 563 |
-
analysis_dict['pattern_analysis'] = {}
|
| 564 |
-
# 🔴 --- END OF CHANGE (V7.8) --- 🔴
|
| 565 |
|
| 566 |
return analysis_dict
|
| 567 |
-
# 🔴 --- END OF CHANGE (V7.8) --- 🔴
|
| 568 |
|
| 569 |
|
| 570 |
async def _fetch_1h_ohlcv_for_screening(self, symbol: str) -> List:
|
|
@@ -809,4 +803,4 @@ class DataManager:
|
|
| 809 |
except Exception as e:
|
| 810 |
return {'action': 'HOLD', 'confidence': 0.3, 'reason': f'Error: {str(e)}', 'source': 'whale_analysis'}
|
| 811 |
|
| 812 |
-
print("✅ DataManager loaded - V7.
|
|
|
|
| 1 |
+
# data_manager.py (Updated to V7.9 - Re-balanced Spark Filter Weights)
|
| 2 |
import os
|
| 3 |
import asyncio
|
| 4 |
import httpx
|
|
|
|
| 67 |
self.pattern_analyzer = ChartPatternAnalyzer(r2_service=None)
|
| 68 |
# --- (نهاية الإضافة) ---
|
| 69 |
|
| 70 |
+
print("✅ DataManager initialized - V7.9 (Re-balanced Spark Weights)")
|
| 71 |
|
| 72 |
async def _load_markets(self):
|
| 73 |
try:
|
|
|
|
| 323 |
except Exception as e:
|
| 324 |
return 0.0
|
| 325 |
|
| 326 |
+
# 🔴 --- START OF CHANGE (V7.9) --- 🔴
|
| 327 |
def _calculate_1h_reversal_spark_score(self, analysis: Dict) -> float:
|
| 328 |
"""
|
| 329 |
+
(محدث V7.9) - الفلتر الثاني: "فلتر شرارة الانعكاس" (أوزان معدلة)
|
| 330 |
"""
|
| 331 |
try:
|
| 332 |
+
# (1. واقي العملات المستقرة)
|
| 333 |
ohlcv_candles = analysis.get('ohlcv_1h', {}).get('1h', [])
|
| 334 |
if not ohlcv_candles or len(ohlcv_candles) < 30:
|
| 335 |
return 0.0
|
|
|
|
| 365 |
|
| 366 |
# --- (منطق فلترة "الشرارة") ---
|
| 367 |
|
|
|
|
| 368 |
pattern_score = 0.0
|
| 369 |
if pattern_analysis.get('predicted_direction') == 'up':
|
| 370 |
pattern_score = pattern_analysis.get('pattern_confidence', 0)
|
|
|
|
| 389 |
if avg_volume > 0 and (current_volume / avg_volume) > 1.1:
|
| 390 |
vol_score = 0.5 # (مجرد اهتمام بسيط)
|
| 391 |
|
| 392 |
+
# (الأوزان الجديدة V7.9 - بناءً على طلبك)
|
| 393 |
+
WEIGHT_PATTERN = 0.10 # (تم الخفض)
|
| 394 |
+
WEIGHT_RSI_SPARK = 0.35 # (تم الرفع)
|
| 395 |
+
WEIGHT_ADX_COIL = 0.35 # (تم الرفع)
|
| 396 |
WEIGHT_MC = 0.10
|
| 397 |
+
WEIGHT_VOL = 0.10
|
| 398 |
+
# (المجموع = 1.0)
|
| 399 |
|
| 400 |
final_score = (
|
| 401 |
(pattern_score * WEIGHT_PATTERN) +
|
|
|
|
| 409 |
|
| 410 |
except Exception as e:
|
| 411 |
return 0.0
|
| 412 |
+
# 🔴 --- END OF CHANGE (V7.9) --- 🔴
|
| 413 |
|
| 414 |
|
| 415 |
async def layer1_rapid_screening(self) -> List[Dict[str, Any]]:
|
| 416 |
"""
|
| 417 |
+
الطبقة 1: فحص سريع - (محدث بالكامل V7.9)
|
| 418 |
"""
|
| 419 |
+
print("📊 الطبقة 1 (V7.9): بدء الغربلة (الكاشف المزدوج + أوزان الشرارة المعدلة)...")
|
| 420 |
|
| 421 |
# الخطوة 1: جلب أفضل 100 عملة حسب الحجم
|
| 422 |
volume_data = await self._get_volume_data_optimal()
|
|
|
|
| 486 |
|
| 487 |
# (2. إذا فشل فلتر الانفجار، جرب فلتر "الشرارة")
|
| 488 |
if burst_score < 0.50:
|
| 489 |
+
# (استخدام V7.9 بالأوزان الجديدة)
|
| 490 |
spark_score = self._calculate_1h_reversal_spark_score(analysis_output)
|
| 491 |
|
| 492 |
final_score = spark_score # (استخدام درجة الشرارة)
|
|
|
|
| 501 |
if 'ohlcv_1h' in symbol_data: del symbol_data['ohlcv_1h']
|
| 502 |
|
| 503 |
final_candidates.append(symbol_data)
|
|
|
|
| 504 |
|
| 505 |
+
print(f"🎯 اكتملت الغربلة (V7.9). تم تأهيل {len(final_candidates)} عملة من أصل 100 للطبقة 2.")
|
| 506 |
|
| 507 |
if final_candidates:
|
| 508 |
print("🏆 المرشحون الناجحون:")
|
|
|
|
| 513 |
|
| 514 |
return final_candidates
|
| 515 |
|
|
|
|
| 516 |
async def _run_mini_detector(self, symbol_data: Dict) -> Dict:
|
| 517 |
"""(محدث V7.8) يشغل المحللات + يطبع نتيجة الأنماط V8"""
|
| 518 |
ohlcv_1h = symbol_data.get('ohlcv_1h')
|
|
|
|
| 541 |
pattern_result = results[1]
|
| 542 |
analysis_dict['pattern_analysis'] = pattern_result
|
| 543 |
|
|
|
|
| 544 |
pattern_name = pattern_result.get('pattern_detected', 'no_clear_pattern')
|
| 545 |
confidence = pattern_result.get('pattern_confidence', 0)
|
| 546 |
tf = pattern_result.get('timeframe', 'N/A')
|
| 547 |
|
| 548 |
if pattern_name != "Neutral / No Pattern" and confidence > 0.5:
|
|
|
|
| 549 |
print(f" 💡 [ML Pattern] {symbol}: نمط مُكتشف! "
|
| 550 |
f"'{pattern_name}' (الثقة: {confidence:.2f}) على إطار {tf}")
|
| 551 |
elif pattern_name == "Neutral / No Pattern":
|
|
|
|
| 552 |
pass
|
| 553 |
else:
|
|
|
|
| 554 |
print(f" - [ML Pattern] {symbol}: نمط ضعيف. "
|
| 555 |
f"'{pattern_name}' (الثقة: {confidence:.2f}) على إطار {tf}")
|
| 556 |
|
| 557 |
else:
|
|
|
|
| 558 |
print(f" ❌ [ML Pattern] {symbol}: فشل تحليل الأنماط ({results[1]})")
|
| 559 |
+
analysis_dict['pattern_analysis'] = {}
|
|
|
|
| 560 |
|
| 561 |
return analysis_dict
|
|
|
|
| 562 |
|
| 563 |
|
| 564 |
async def _fetch_1h_ohlcv_for_screening(self, symbol: str) -> List:
|
|
|
|
| 803 |
except Exception as e:
|
| 804 |
return {'action': 'HOLD', 'confidence': 0.3, 'reason': f'Error: {str(e)}', 'source': 'whale_analysis'}
|
| 805 |
|
| 806 |
+
print("✅ DataManager loaded - V7.9 (Re-balanced Spark Weights)")
|