Riy777 commited on
Commit
9b79926
·
1 Parent(s): d2775f3

Update whale_news_data.py

Browse files
Files changed (1) hide show
  1. whale_news_data.py +22 -86
whale_news_data.py CHANGED
@@ -20,6 +20,7 @@ class EnhancedWhaleMonitor:
20
 
21
  self.whale_threshold_usd = 100000
22
  self.contracts_db = contracts_db or {}
 
23
 
24
  self.address_labels = {}
25
  self._initialize_dynamic_labels()
@@ -72,7 +73,6 @@ class EnhancedWhaleMonitor:
72
  if self.infura_key:
73
  infura_endpoint = f"https://mainnet.infura.io/v3/{self.infura_key}"
74
  self.rpc_endpoints['ethereum'].insert(0, infura_endpoint)
75
- print(f"✅ تم تكوين Infura بنجاح - الشبكة: Ethereum")
76
 
77
  self.current_rpc_index = {network: 0 for network in self.rpc_endpoints.keys()}
78
  self.rpc_failures = {network: 0 for network in self.rpc_endpoints.keys()}
@@ -85,11 +85,8 @@ class EnhancedWhaleMonitor:
85
  'bsc': 'BNB'
86
  }
87
 
88
- # نظام تسجيل أداء أنماط الحيتان
89
  self.pattern_performance = {}
90
  self.pattern_success_rates = {}
91
-
92
- print("🎯 نظام تتبع الحيتان المحسن - تحليل صافي التدفق الذكي مفعل")
93
 
94
  def _initialize_dynamic_labels(self):
95
  self.address_categories = {
@@ -188,8 +185,6 @@ class EnhancedWhaleMonitor:
188
  self.netflow_data[network][token_symbol]['inflow'].append(value_usd)
189
  self.netflow_data[network][token_symbol]['timestamps'].append(datetime.now())
190
 
191
- print(f"📥 تدفق إلى منصة: {value_usd:,.0f} USD ({token_symbol})")
192
-
193
  if self._is_exchange_address(from_address):
194
  if token_symbol not in self.netflow_data[network]:
195
  self._initialize_token_metrics(network, token_symbol)
@@ -197,8 +192,6 @@ class EnhancedWhaleMonitor:
197
  self.netflow_data[network][token_symbol]['outflow'].append(value_usd)
198
  self.netflow_data[network][token_symbol]['timestamps'].append(datetime.now())
199
 
200
- print(f"📤 تدفق من منصة: {value_usd:,.0f} USD ({token_symbol})")
201
-
202
  if token_symbol in self.netflow_data[network]:
203
  current_inflow = sum(list(self.netflow_data[network][token_symbol]['inflow'])[-12:])
204
  current_outflow = sum(list(self.netflow_data[network][token_symbol]['outflow'])[-12:])
@@ -207,7 +200,7 @@ class EnhancedWhaleMonitor:
207
  self.netflow_data[network][token_symbol]['netflow'].append(current_netflow)
208
 
209
  except Exception as e:
210
- print(f"⚠️ خطأ في تحديث مقاييس صافي التدفق: {e}")
211
 
212
  def _initialize_token_metrics(self, network, token_symbol):
213
  self.netflow_data[network][token_symbol] = {
@@ -247,7 +240,7 @@ class EnhancedWhaleMonitor:
247
  return zscore
248
 
249
  except Exception as e:
250
- print(f"⚠️ خطأ في حساب Z-score: {e}")
251
  return 0
252
 
253
  def _generate_netflow_signal(self, network, token_symbol):
@@ -322,7 +315,7 @@ class EnhancedWhaleMonitor:
322
  return signal
323
 
324
  except Exception as e:
325
- print(f"⚠️ خطأ في توليد إشارة التداول: {e}")
326
  return None
327
 
328
  async def _scan_single_evm_network(self, network):
@@ -330,10 +323,11 @@ class EnhancedWhaleMonitor:
330
  trading_signals = []
331
 
332
  try:
333
- # الحصول على السعر من DataManager بدلاً من هنا
334
- price_usd = await self._get_native_price_from_external()
 
 
335
  if price_usd is None:
336
- print(f"⚠️ سعر {network} غير متوفر، تخطي المسح")
337
  return [], []
338
 
339
  latest_block_hex = await self._call_rpc_async(network, 'eth_blockNumber')
@@ -400,16 +394,13 @@ class EnhancedWhaleMonitor:
400
  if signal:
401
  trading_signals.append(signal)
402
 
403
- print(f"✅ مسح {network}: {scanned_blocks} كتل، {len(whale_alerts)} تنبيهات، {len(trading_signals)} إشارات")
404
 
405
  except Exception as e:
406
- print(f"⚠️ خطأ في مسح شبكة {network}: {e}")
407
-
408
- return whale_alerts, trading_signals
409
 
410
  async def get_general_whale_activity(self):
411
- print("🌊 بدء مراقبة الحيتان وتحليل صافي التدفق...")
412
-
413
  try:
414
  tasks = []
415
  networks_to_scan = ['ethereum', 'bsc']
@@ -537,23 +528,12 @@ class EnhancedWhaleMonitor:
537
  'trading_signals': []
538
  }
539
 
540
- async def _get_native_price_from_external(self):
541
- """الحصول على الأسعار من DataManager بدلاً من هنا"""
542
- try:
543
- # محاكاة الحصول على السعر من DataManager
544
- # في التطبيق الفعلي، سيتم استدعاء DataManager
545
- return 3500.0 # قيمة افتراضية
546
- except Exception as e:
547
- print(f"⚠️ فشل جلب السعر من DataManager: {e}")
548
- return None
549
-
550
  async def _call_rpc_async(self, network, method, params=[]):
551
  max_retries = 2
552
 
553
  for attempt in range(max_retries):
554
  endpoint = self._get_next_rpc_endpoint(network)
555
  if not endpoint:
556
- print(f"❌ لا توجد نقاط نهاية RPC متاحة لـ {network}")
557
  return None
558
 
559
  try:
@@ -571,11 +551,9 @@ class EnhancedWhaleMonitor:
571
  response = await client.post(endpoint, json=payload)
572
 
573
  if response.status_code == 401:
574
- print(f"🔐 خطأ مصادقة في {endpoint}")
575
  self.rpc_failures[network] += 1
576
  continue
577
  elif response.status_code == 429:
578
- print(f"⏳ Rate limit على {endpoint}")
579
  await asyncio.sleep(2 * (attempt + 1))
580
  continue
581
 
@@ -587,26 +565,21 @@ class EnhancedWhaleMonitor:
587
 
588
  except httpx.HTTPStatusError as e:
589
  if e.response.status_code == 429:
590
- print(f"⚠️ Rate limit على {endpoint} لـ {network}")
591
  self.rpc_failures[network] += 1
592
  await asyncio.sleep(3 * (attempt + 1))
593
  continue
594
  elif e.response.status_code == 401:
595
- print(f"🔐 خطأ مصادقة في {endpoint}")
596
  self.rpc_failures[network] += 1
597
  continue
598
  else:
599
- print(f"⚠️ خطأ HTTP {e.response.status_code} في {endpoint}")
600
  self.rpc_failures[network] += 1
601
 
602
  except Exception as e:
603
- print(f"⚠️ فشل اتصال RPC لـ {network}: {e}")
604
  self.rpc_failures[network] += 1
605
 
606
  if attempt < max_retries - 1:
607
  await asyncio.sleep(1 * (attempt + 1))
608
 
609
- print(f"❌ فشل جميع محاولات RPC لـ {network}")
610
  return None
611
 
612
  def _get_next_rpc_endpoint(self, network):
@@ -662,21 +635,17 @@ class EnhancedWhaleMonitor:
662
  if api_name == 'etherscan':
663
  if stats['requests_per_second'] > 4:
664
  delay = 0.2 * (stats['requests_per_second'] - 4)
665
- print(f"⏳ تأخير {delay:.2f} ثانية لـ {api_name}")
666
  await asyncio.sleep(delay)
667
 
668
  if stats['requests_today'] > 95000:
669
- print(f"🚨 تجاوز الحد اليومي لطلبات {api_name}")
670
  return True
671
 
672
  elif api_name == 'infura':
673
  if stats['requests_per_second'] > 400:
674
  delay = 0.1 * (stats['requests_per_second'] - 400)
675
- print(f"⏳ تأخير {delay:.2f} ثانية لـ {api_name}")
676
  await asyncio.sleep(delay)
677
 
678
  if stats['requests_today'] > 2800000:
679
- print(f"🚨 تجاوز الحد اليومي لطلبات {api_name}")
680
  return True
681
 
682
  return False
@@ -691,8 +660,6 @@ class EnhancedWhaleMonitor:
691
  if not contract_address:
692
  return await self._scan_networks_for_symbol(symbol, base_symbol)
693
 
694
- print(f"🔍 جلب بيانات الحيتان لـ {symbol}")
695
-
696
  api_data = await self._get_combined_api_data(contract_address)
697
 
698
  if api_data:
@@ -739,7 +706,6 @@ class EnhancedWhaleMonitor:
739
  self._update_api_usage_stats('etherscan')
740
 
741
  if await self._api_rate_limit_delay('etherscan'):
742
- print("⚠️ تجاوز حدود Etherscan، تخطي الطلب")
743
  return []
744
 
745
  params = {
@@ -754,13 +720,10 @@ class EnhancedWhaleMonitor:
754
 
755
  base_url = "https://api.etherscan.io/api"
756
 
757
- print(f"🔍 جلب بيانات Etherscan للعقد: {contract_address[:10]}...")
758
-
759
  async with httpx.AsyncClient(timeout=10.0) as client:
760
  response = await client.get(base_url, params=params)
761
 
762
  if response.status_code == 429:
763
- print("⏳ تجاوز حد معدل Etherscan")
764
  await asyncio.sleep(2)
765
  return []
766
 
@@ -769,18 +732,13 @@ class EnhancedWhaleMonitor:
769
 
770
  if data.get('status') == '1' and data.get('message') == 'OK':
771
  result = data.get('result', [])
772
- print(f"✅ بيانات Etherscan: {len(result)} تحويل")
773
  return result
774
  else:
775
- error_message = data.get('message', 'Unknown error')
776
- print(f"⚠️ خطأ في استجابة Etherscan: {error_message}")
777
  return []
778
 
779
  except httpx.HTTPStatusError as e:
780
- print(f"⚠️ خطأ HTTP في Etherscan API: {e.response.status_code}")
781
  return []
782
  except Exception as e:
783
- print(f"⚠️ فشل جلب بيانات Etherscan: {e}")
784
  return []
785
 
786
  async def _get_moralis_token_data(self, contract_address):
@@ -796,14 +754,11 @@ class EnhancedWhaleMonitor:
796
 
797
  if response.status_code == 200:
798
  result = response.json().get('result', [])
799
- print(f"✅ بيانات Moralis: {len(result)} تحويل")
800
  return result
801
  else:
802
- print(f"⚠️ خطأ Moralis API: {response.status_code}")
803
  return []
804
 
805
  except Exception as e:
806
- print(f"⚠️ Moralis API error: {e}")
807
  return []
808
 
809
  async def _enrich_api_data_with_timing(self, api_data):
@@ -829,7 +784,6 @@ class EnhancedWhaleMonitor:
829
  enriched_data.append(enriched_transfer)
830
 
831
  except Exception as e:
832
- print(f"⚠️ خطأ في إثراء بيانات التحويل: {e}")
833
  continue
834
 
835
  return enriched_data
@@ -903,28 +857,24 @@ class EnhancedWhaleMonitor:
903
  if symbol_lower in key.lower():
904
  return address
905
 
906
- print(f"🔍 لم يتم العثور على عقد لـ {symbol} في قاعدة البيانات")
907
  return None
908
 
909
  async def _scan_networks_for_symbol(self, symbol, base_symbol):
910
- print(f"🔍 مسح الشبكات للعثور على {symbol}...")
911
-
912
  networks_to_scan = ['ethereum', 'bsc']
913
 
914
  for network in networks_to_scan:
915
  try:
916
- price = await self._get_native_price_from_external()
917
- if price:
918
- print(f"✅ تم العثور على {symbol} على شبكة {network} بسعر ${price:.2f}")
919
- return {
920
- 'data_available': True,
921
- 'description': f'تم اكتشاف {symbol} على شبكة {network}',
922
- 'network': network,
923
- 'price_usd': price,
924
- 'source': 'network_scan'
925
- }
926
  except Exception as e:
927
- print(f"⚠️ فشل مسح {network} لـ {symbol}: {e}")
928
  continue
929
 
930
  return {
@@ -958,9 +908,7 @@ class EnhancedWhaleMonitor:
958
 
959
  return stats
960
 
961
- # دوال تحليل الحيتان المنقولة من ML.py
962
  def _calculate_whale_activity_score(self, whale_data):
963
- """حساب درجة نشاط الحيتان - منقول من ML.py"""
964
  if not whale_data.get('data_available', False):
965
  return 0.0
966
 
@@ -981,7 +929,6 @@ class EnhancedWhaleMonitor:
981
  return min(score, 0.5)
982
 
983
  async def generate_whale_trading_signal(self, symbol, whale_data, market_context):
984
- """توليد إشارة تداول مباشرة من بيانات الحيتان"""
985
  try:
986
  if not whale_data.get('data_available', False):
987
  return None
@@ -1023,11 +970,9 @@ class EnhancedWhaleMonitor:
1023
  return signal
1024
 
1025
  except Exception as e:
1026
- print(f"⚠️ خطأ في توليد إشارة تداول الحيتان: {e}")
1027
  return None
1028
 
1029
  async def track_pattern_outcome(self, symbol, pattern_analysis, success, profit_percent):
1030
- """تتبع أداء أنماط الحيتان - منقول من ML.py"""
1031
  if not pattern_analysis:
1032
  return
1033
 
@@ -1050,19 +995,10 @@ class EnhancedWhaleMonitor:
1050
  if success:
1051
  stats['successful_trades'] += 1
1052
  stats['total_profit'] += profit_percent
1053
-
1054
- success_rate = stats['successful_trades'] / stats['total_trades']
1055
- avg_profit = stats['total_profit'] / stats['successful_trades'] if stats['successful_trades'] > 0 else 0
1056
- avg_confidence = stats['total_confidence'] / stats['total_trades']
1057
-
1058
- print(f"📊 تحديث أداء النمط {pattern_name}: نجاح {success_rate:.1%}, ربح متوسط {avg_profit:.2f}%")
1059
 
1060
  def get_pattern_reliability(self, pattern_name):
1061
- """الحصول على موثوقية النمط - منقول من ML.py"""
1062
  if pattern_name in self.pattern_performance:
1063
  stats = self.pattern_performance[pattern_name]
1064
  if stats['total_trades'] > 0:
1065
  return stats['successful_trades'] / stats['total_trades']
1066
- return 0.5
1067
-
1068
- whale_monitor_global = EnhancedWhaleMonitor()
 
20
 
21
  self.whale_threshold_usd = 100000
22
  self.contracts_db = contracts_db or {}
23
+ self.data_manager = None
24
 
25
  self.address_labels = {}
26
  self._initialize_dynamic_labels()
 
73
  if self.infura_key:
74
  infura_endpoint = f"https://mainnet.infura.io/v3/{self.infura_key}"
75
  self.rpc_endpoints['ethereum'].insert(0, infura_endpoint)
 
76
 
77
  self.current_rpc_index = {network: 0 for network in self.rpc_endpoints.keys()}
78
  self.rpc_failures = {network: 0 for network in self.rpc_endpoints.keys()}
 
85
  'bsc': 'BNB'
86
  }
87
 
 
88
  self.pattern_performance = {}
89
  self.pattern_success_rates = {}
 
 
90
 
91
  def _initialize_dynamic_labels(self):
92
  self.address_categories = {
 
185
  self.netflow_data[network][token_symbol]['inflow'].append(value_usd)
186
  self.netflow_data[network][token_symbol]['timestamps'].append(datetime.now())
187
 
 
 
188
  if self._is_exchange_address(from_address):
189
  if token_symbol not in self.netflow_data[network]:
190
  self._initialize_token_metrics(network, token_symbol)
 
192
  self.netflow_data[network][token_symbol]['outflow'].append(value_usd)
193
  self.netflow_data[network][token_symbol]['timestamps'].append(datetime.now())
194
 
 
 
195
  if token_symbol in self.netflow_data[network]:
196
  current_inflow = sum(list(self.netflow_data[network][token_symbol]['inflow'])[-12:])
197
  current_outflow = sum(list(self.netflow_data[network][token_symbol]['outflow'])[-12:])
 
200
  self.netflow_data[network][token_symbol]['netflow'].append(current_netflow)
201
 
202
  except Exception as e:
203
+ print(f"خطأ في تحديث مقاييس صافي التدفق: {e}")
204
 
205
  def _initialize_token_metrics(self, network, token_symbol):
206
  self.netflow_data[network][token_symbol] = {
 
240
  return zscore
241
 
242
  except Exception as e:
243
+ print(f"خطأ في حساب Z-score: {e}")
244
  return 0
245
 
246
  def _generate_netflow_signal(self, network, token_symbol):
 
315
  return signal
316
 
317
  except Exception as e:
318
+ print(f"خطأ في توليد إشارة التداول: {e}")
319
  return None
320
 
321
  async def _scan_single_evm_network(self, network):
 
323
  trading_signals = []
324
 
325
  try:
326
+ if not self.data_manager:
327
+ return [], []
328
+
329
+ price_usd = await self.data_manager.get_native_coin_price(network)
330
  if price_usd is None:
 
331
  return [], []
332
 
333
  latest_block_hex = await self._call_rpc_async(network, 'eth_blockNumber')
 
394
  if signal:
395
  trading_signals.append(signal)
396
 
397
+ return whale_alerts, trading_signals
398
 
399
  except Exception as e:
400
+ print(f"خطأ في مسح شبكة {network}: {e}")
401
+ return [], []
 
402
 
403
  async def get_general_whale_activity(self):
 
 
404
  try:
405
  tasks = []
406
  networks_to_scan = ['ethereum', 'bsc']
 
528
  'trading_signals': []
529
  }
530
 
 
 
 
 
 
 
 
 
 
 
531
  async def _call_rpc_async(self, network, method, params=[]):
532
  max_retries = 2
533
 
534
  for attempt in range(max_retries):
535
  endpoint = self._get_next_rpc_endpoint(network)
536
  if not endpoint:
 
537
  return None
538
 
539
  try:
 
551
  response = await client.post(endpoint, json=payload)
552
 
553
  if response.status_code == 401:
 
554
  self.rpc_failures[network] += 1
555
  continue
556
  elif response.status_code == 429:
 
557
  await asyncio.sleep(2 * (attempt + 1))
558
  continue
559
 
 
565
 
566
  except httpx.HTTPStatusError as e:
567
  if e.response.status_code == 429:
 
568
  self.rpc_failures[network] += 1
569
  await asyncio.sleep(3 * (attempt + 1))
570
  continue
571
  elif e.response.status_code == 401:
 
572
  self.rpc_failures[network] += 1
573
  continue
574
  else:
 
575
  self.rpc_failures[network] += 1
576
 
577
  except Exception as e:
 
578
  self.rpc_failures[network] += 1
579
 
580
  if attempt < max_retries - 1:
581
  await asyncio.sleep(1 * (attempt + 1))
582
 
 
583
  return None
584
 
585
  def _get_next_rpc_endpoint(self, network):
 
635
  if api_name == 'etherscan':
636
  if stats['requests_per_second'] > 4:
637
  delay = 0.2 * (stats['requests_per_second'] - 4)
 
638
  await asyncio.sleep(delay)
639
 
640
  if stats['requests_today'] > 95000:
 
641
  return True
642
 
643
  elif api_name == 'infura':
644
  if stats['requests_per_second'] > 400:
645
  delay = 0.1 * (stats['requests_per_second'] - 400)
 
646
  await asyncio.sleep(delay)
647
 
648
  if stats['requests_today'] > 2800000:
 
649
  return True
650
 
651
  return False
 
660
  if not contract_address:
661
  return await self._scan_networks_for_symbol(symbol, base_symbol)
662
 
 
 
663
  api_data = await self._get_combined_api_data(contract_address)
664
 
665
  if api_data:
 
706
  self._update_api_usage_stats('etherscan')
707
 
708
  if await self._api_rate_limit_delay('etherscan'):
 
709
  return []
710
 
711
  params = {
 
720
 
721
  base_url = "https://api.etherscan.io/api"
722
 
 
 
723
  async with httpx.AsyncClient(timeout=10.0) as client:
724
  response = await client.get(base_url, params=params)
725
 
726
  if response.status_code == 429:
 
727
  await asyncio.sleep(2)
728
  return []
729
 
 
732
 
733
  if data.get('status') == '1' and data.get('message') == 'OK':
734
  result = data.get('result', [])
 
735
  return result
736
  else:
 
 
737
  return []
738
 
739
  except httpx.HTTPStatusError as e:
 
740
  return []
741
  except Exception as e:
 
742
  return []
743
 
744
  async def _get_moralis_token_data(self, contract_address):
 
754
 
755
  if response.status_code == 200:
756
  result = response.json().get('result', [])
 
757
  return result
758
  else:
 
759
  return []
760
 
761
  except Exception as e:
 
762
  return []
763
 
764
  async def _enrich_api_data_with_timing(self, api_data):
 
784
  enriched_data.append(enriched_transfer)
785
 
786
  except Exception as e:
 
787
  continue
788
 
789
  return enriched_data
 
857
  if symbol_lower in key.lower():
858
  return address
859
 
 
860
  return None
861
 
862
  async def _scan_networks_for_symbol(self, symbol, base_symbol):
 
 
863
  networks_to_scan = ['ethereum', 'bsc']
864
 
865
  for network in networks_to_scan:
866
  try:
867
+ if self.data_manager:
868
+ price = await self.data_manager.get_native_coin_price(network)
869
+ if price:
870
+ return {
871
+ 'data_available': True,
872
+ 'description': f'تم اكتشاف {symbol} على شبكة {network}',
873
+ 'network': network,
874
+ 'price_usd': price,
875
+ 'source': 'network_scan'
876
+ }
877
  except Exception as e:
 
878
  continue
879
 
880
  return {
 
908
 
909
  return stats
910
 
 
911
  def _calculate_whale_activity_score(self, whale_data):
 
912
  if not whale_data.get('data_available', False):
913
  return 0.0
914
 
 
929
  return min(score, 0.5)
930
 
931
  async def generate_whale_trading_signal(self, symbol, whale_data, market_context):
 
932
  try:
933
  if not whale_data.get('data_available', False):
934
  return None
 
970
  return signal
971
 
972
  except Exception as e:
 
973
  return None
974
 
975
  async def track_pattern_outcome(self, symbol, pattern_analysis, success, profit_percent):
 
976
  if not pattern_analysis:
977
  return
978
 
 
995
  if success:
996
  stats['successful_trades'] += 1
997
  stats['total_profit'] += profit_percent
 
 
 
 
 
 
998
 
999
  def get_pattern_reliability(self, pattern_name):
 
1000
  if pattern_name in self.pattern_performance:
1001
  stats = self.pattern_performance[pattern_name]
1002
  if stats['total_trades'] > 0:
1003
  return stats['successful_trades'] / stats['total_trades']
1004
+ return 0.5