Spaces:
Running
Running
Update data_manager.py
Browse files- data_manager.py +32 -22
data_manager.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# data_manager.py (Updated to V7.8 - Added Pattern
|
| 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.8 (
|
| 71 |
|
| 72 |
async def _load_markets(self):
|
| 73 |
try:
|
|
@@ -328,7 +328,7 @@ class DataManager:
|
|
| 328 |
(جديد V7.7) - الفلتر الثاني: "فلتر شرارة الانعكاس" (بداية الزخم)
|
| 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
|
|
@@ -414,7 +414,7 @@ class DataManager:
|
|
| 414 |
"""
|
| 415 |
الطبقة 1: فحص سريع - (محدث بالكامل V7.7 - فلتر مزدوج)
|
| 416 |
"""
|
| 417 |
-
print("📊 الطبقة 1 (V7.
|
| 418 |
|
| 419 |
# الخطوة 1: جلب أفضل 100 عملة حسب الحجم
|
| 420 |
volume_data = await self._get_volume_data_optimal()
|
|
@@ -498,8 +498,9 @@ class DataManager:
|
|
| 498 |
if 'ohlcv_1h' in symbol_data: del symbol_data['ohlcv_1h']
|
| 499 |
|
| 500 |
final_candidates.append(symbol_data)
|
|
|
|
| 501 |
|
| 502 |
-
print(f"🎯 اكتملت الغربلة (V7.
|
| 503 |
|
| 504 |
if final_candidates:
|
| 505 |
print("🏆 المرشحون الناجحون:")
|
|
@@ -510,17 +511,16 @@ class DataManager:
|
|
| 510 |
|
| 511 |
return final_candidates
|
| 512 |
|
| 513 |
-
# 🔴 --- START OF CHANGE (V7.8
|
| 514 |
async def _run_mini_detector(self, symbol_data: Dict) -> Dict:
|
| 515 |
-
"""(V7.8) يشغل المحللات
|
| 516 |
-
|
| 517 |
-
symbol = symbol_data.get('symbol', 'UNKNOWN') # (جديد V7.8)
|
| 518 |
ohlcv_1h = symbol_data.get('ohlcv_1h')
|
| 519 |
current_price = symbol_data.get('current_price')
|
|
|
|
| 520 |
|
| 521 |
df = self._create_dataframe(ohlcv_1h.get('1h'))
|
| 522 |
if df.empty:
|
| 523 |
-
raise ValueError(
|
| 524 |
|
| 525 |
analysis_dict = {'current_price': current_price}
|
| 526 |
|
|
@@ -535,26 +535,36 @@ class DataManager:
|
|
| 535 |
if not isinstance(results[0], Exception):
|
| 536 |
analysis_dict['monte_carlo_distribution'] = results[0]
|
| 537 |
|
| 538 |
-
# (
|
| 539 |
if not isinstance(results[1], Exception):
|
| 540 |
pattern_result = results[1]
|
| 541 |
analysis_dict['pattern_analysis'] = pattern_result
|
| 542 |
|
|
|
|
| 543 |
pattern_name = pattern_result.get('pattern_detected', 'no_clear_pattern')
|
| 544 |
-
|
| 545 |
-
|
| 546 |
-
|
| 547 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 548 |
else:
|
| 549 |
-
# (
|
| 550 |
-
|
| 551 |
-
|
|
|
|
| 552 |
else:
|
| 553 |
-
|
| 554 |
-
|
|
|
|
|
|
|
| 555 |
|
| 556 |
return analysis_dict
|
| 557 |
-
# 🔴 --- END OF CHANGE --- 🔴
|
| 558 |
|
| 559 |
|
| 560 |
async def _fetch_1h_ohlcv_for_screening(self, symbol: str) -> List:
|
|
@@ -799,4 +809,4 @@ class DataManager:
|
|
| 799 |
except Exception as e:
|
| 800 |
return {'action': 'HOLD', 'confidence': 0.3, 'reason': f'Error: {str(e)}', 'source': 'whale_analysis'}
|
| 801 |
|
| 802 |
-
print("✅ DataManager loaded - V7.8 (
|
|
|
|
| 1 |
+
# data_manager.py (Updated to V7.8 - Added Pattern V8 Diagnostic Print)
|
| 2 |
import os
|
| 3 |
import asyncio
|
| 4 |
import httpx
|
|
|
|
| 67 |
self.pattern_analyzer = ChartPatternAnalyzer(r2_service=None)
|
| 68 |
# --- (نهاية الإضافة) ---
|
| 69 |
|
| 70 |
+
print("✅ DataManager initialized - V7.8 (Pattern V8 Diagnostic Print)")
|
| 71 |
|
| 72 |
async def _load_markets(self):
|
| 73 |
try:
|
|
|
|
| 328 |
(جديد V7.7) - الفلتر الثاني: "فلتر شرارة الانعكاس" (بداية الزخم)
|
| 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
|
|
|
|
| 414 |
"""
|
| 415 |
الطبقة 1: فحص سريع - (محدث بالكامل V7.7 - فلتر مزدوج)
|
| 416 |
"""
|
| 417 |
+
print("📊 الطبقة 1 (V7.8): بدء الغربلة (الكاشف المزدوج + طباعة الأنماط)...")
|
| 418 |
|
| 419 |
# الخطوة 1: جلب أفضل 100 عملة حسب الحجم
|
| 420 |
volume_data = await self._get_volume_data_optimal()
|
|
|
|
| 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.8). تم تأهيل {len(final_candidates)} عملة من أصل 100 للطبقة 2.")
|
| 504 |
|
| 505 |
if final_candidates:
|
| 506 |
print("🏆 المرشحون الناجحون:")
|
|
|
|
| 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')
|
| 518 |
current_price = symbol_data.get('current_price')
|
| 519 |
+
symbol = symbol_data.get('symbol', 'UNKNOWN') # (للطباعة)
|
| 520 |
|
| 521 |
df = self._create_dataframe(ohlcv_1h.get('1h'))
|
| 522 |
if df.empty:
|
| 523 |
+
raise ValueError("DataFrame فارغ لتحليل 1H")
|
| 524 |
|
| 525 |
analysis_dict = {'current_price': current_price}
|
| 526 |
|
|
|
|
| 535 |
if not isinstance(results[0], Exception):
|
| 536 |
analysis_dict['monte_carlo_distribution'] = results[0]
|
| 537 |
|
| 538 |
+
# (إضافة طباعة تشخيصية لنموذج الأنماط V8)
|
| 539 |
if not isinstance(results[1], Exception):
|
| 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 |
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.8 (Pattern V8 Diagnostic Print)")
|