Riy777 commited on
Commit
d74f533
·
1 Parent(s): f375b09

Update data_manager.py

Browse files
Files changed (1) hide show
  1. data_manager.py +18 -24
data_manager.py CHANGED
@@ -1,4 +1,4 @@
1
- # data_manager.py (Updated to V7.8 - Added Pattern V8 Diagnostic Print)
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 (Pattern V8 Diagnostic Print)")
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
- (جديد 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
@@ -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.40 # (الأهم)
394
- WEIGHT_RSI_SPARK = 0.20
395
- WEIGHT_ADX_COIL = 0.20
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.7 - فلتر مزدوج)
416
  """
417
- print("📊 الطبقة 1 (V7.8): بدء الغربلة (الكاشف المزدوج + طباعة الأنماط)...")
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.8). تم تأهيل {len(final_candidates)} عملة من أصل 100 للطبقة 2.")
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.8 (Pattern V8 Diagnostic Print)")
 
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)")