Spaces:
Running
Running
Update whale_news_data.py
Browse files- whale_news_data.py +120 -75
whale_news_data.py
CHANGED
|
@@ -85,6 +85,10 @@ class EnhancedWhaleMonitor:
|
|
| 85 |
'bsc': 'BNB'
|
| 86 |
}
|
| 87 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
print("🎯 نظام تتبع الحيتان المحسن - تحليل صافي التدفق الذكي مفعل")
|
| 89 |
|
| 90 |
def _initialize_dynamic_labels(self):
|
|
@@ -326,7 +330,8 @@ class EnhancedWhaleMonitor:
|
|
| 326 |
trading_signals = []
|
| 327 |
|
| 328 |
try:
|
| 329 |
-
|
|
|
|
| 330 |
if price_usd is None:
|
| 331 |
print(f"⚠️ سعر {network} غير متوفر، تخطي المسح")
|
| 332 |
return [], []
|
|
@@ -532,81 +537,14 @@ class EnhancedWhaleMonitor:
|
|
| 532 |
'trading_signals': []
|
| 533 |
}
|
| 534 |
|
| 535 |
-
async def
|
| 536 |
-
|
| 537 |
-
cache_key = f"{network}_price"
|
| 538 |
-
|
| 539 |
-
if cache_key in self.price_cache and (now - self.price_cache[cache_key]['timestamp']) < 300:
|
| 540 |
-
return self.price_cache[cache_key]['price']
|
| 541 |
-
|
| 542 |
-
symbol = self.kucoin_symbols.get(network)
|
| 543 |
-
if not symbol:
|
| 544 |
-
return await self._get_price_from_coingecko_fallback(network)
|
| 545 |
-
|
| 546 |
try:
|
| 547 |
-
|
| 548 |
-
|
| 549 |
-
|
| 550 |
-
return price
|
| 551 |
-
|
| 552 |
-
price = await self._get_price_from_coingecko_fallback(network)
|
| 553 |
-
if price and price > 0:
|
| 554 |
-
self.price_cache[cache_key] = {'price': price, 'timestamp': now, 'source': 'coingecko'}
|
| 555 |
-
return price
|
| 556 |
-
|
| 557 |
-
return None
|
| 558 |
-
|
| 559 |
except Exception as e:
|
| 560 |
-
print(f"⚠️ فشل جلب
|
| 561 |
-
return None
|
| 562 |
-
|
| 563 |
-
async def _get_price_from_kucoin(self, symbol):
|
| 564 |
-
try:
|
| 565 |
-
exchange = ccxt.kucoin({
|
| 566 |
-
'sandbox': False,
|
| 567 |
-
'enableRateLimit': True
|
| 568 |
-
})
|
| 569 |
-
|
| 570 |
-
trading_symbol = f"{symbol}/USDT"
|
| 571 |
-
try:
|
| 572 |
-
ticker = await exchange.fetch_ticker(trading_symbol)
|
| 573 |
-
price = ticker.get('last')
|
| 574 |
-
if price and price > 0:
|
| 575 |
-
print(f"✅ سعر {symbol} من KuCoin: ${price:.2f}")
|
| 576 |
-
await exchange.close()
|
| 577 |
-
return float(price)
|
| 578 |
-
except Exception as e:
|
| 579 |
-
print(f"⚠️ رمز التداول {trading_symbol} غير مدعوم في KuCoin: {e}")
|
| 580 |
-
|
| 581 |
-
await exchange.close()
|
| 582 |
-
return None
|
| 583 |
-
|
| 584 |
-
except Exception as e:
|
| 585 |
-
print(f"⚠️ فشل جلب السعر من KuCoin لـ {symbol}: {e}")
|
| 586 |
-
return None
|
| 587 |
-
|
| 588 |
-
async def _get_price_from_coingecko_fallback(self, network):
|
| 589 |
-
coin_map = {
|
| 590 |
-
'ethereum': 'ethereum',
|
| 591 |
-
'bsc': 'binancecoin'
|
| 592 |
-
}
|
| 593 |
-
|
| 594 |
-
coin_id = coin_map.get(network)
|
| 595 |
-
if not coin_id:
|
| 596 |
-
return None
|
| 597 |
-
|
| 598 |
-
try:
|
| 599 |
-
await asyncio.sleep(0.5)
|
| 600 |
-
url = f"https://api.coingecko.com/api/v3/simple/price?ids={coin_id}&vs_currencies=usd"
|
| 601 |
-
response = await self.http_client.get(url)
|
| 602 |
-
response.raise_for_status()
|
| 603 |
-
price = response.json().get(coin_id, {}).get('usd', 0)
|
| 604 |
-
if price > 0:
|
| 605 |
-
print(f"✅ سعر {network} من CoinGecko: ${price:.2f}")
|
| 606 |
-
return price
|
| 607 |
-
return None
|
| 608 |
-
except Exception as e:
|
| 609 |
-
print(f"⚠️ فشل جلب سعر {network} من CoinGecko: {e}")
|
| 610 |
return None
|
| 611 |
|
| 612 |
async def _call_rpc_async(self, network, method, params=[]):
|
|
@@ -975,7 +913,7 @@ class EnhancedWhaleMonitor:
|
|
| 975 |
|
| 976 |
for network in networks_to_scan:
|
| 977 |
try:
|
| 978 |
-
price = await self.
|
| 979 |
if price:
|
| 980 |
print(f"✅ تم العثور على {symbol} على شبكة {network} بسعر ${price:.2f}")
|
| 981 |
return {
|
|
@@ -1020,4 +958,111 @@ class EnhancedWhaleMonitor:
|
|
| 1020 |
|
| 1021 |
return stats
|
| 1022 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1023 |
whale_monitor_global = 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):
|
|
|
|
| 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 [], []
|
|
|
|
| 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=[]):
|
|
|
|
| 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 {
|
|
|
|
| 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 |
+
|
| 967 |
+
total_transactions = whale_data.get('transfer_count', 0)
|
| 968 |
+
total_volume = whale_data.get('total_volume', 0)
|
| 969 |
+
score = 0.0
|
| 970 |
+
|
| 971 |
+
if total_transactions >= 10:
|
| 972 |
+
score += 0.3
|
| 973 |
+
elif total_transactions >= 5:
|
| 974 |
+
score += 0.15
|
| 975 |
+
|
| 976 |
+
if total_volume > 500000:
|
| 977 |
+
score += 0.2
|
| 978 |
+
elif total_volume > 100000:
|
| 979 |
+
score += 0.1
|
| 980 |
+
|
| 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
|
| 988 |
+
|
| 989 |
+
whale_score = self._calculate_whale_activity_score(whale_data)
|
| 990 |
+
total_volume = whale_data.get('total_volume', 0)
|
| 991 |
+
transfer_count = whale_data.get('transfer_count', 0)
|
| 992 |
+
|
| 993 |
+
signal = {
|
| 994 |
+
'symbol': symbol,
|
| 995 |
+
'whale_score': whale_score,
|
| 996 |
+
'total_volume': total_volume,
|
| 997 |
+
'transfer_count': transfer_count,
|
| 998 |
+
'timestamp': datetime.now().isoformat()
|
| 999 |
+
}
|
| 1000 |
+
|
| 1001 |
+
if whale_score > 0.4 and total_volume > 500000:
|
| 1002 |
+
signal.update({
|
| 1003 |
+
'action': 'STRONG_BUY',
|
| 1004 |
+
'confidence': min(0.9, whale_score),
|
| 1005 |
+
'reason': f'نشاط حيتان قوي: {transfer_count} تحويل بإجمالي ${total_volume:,.0f}',
|
| 1006 |
+
'critical_alert': total_volume > 1000000
|
| 1007 |
+
})
|
| 1008 |
+
elif whale_score > 0.2 and total_volume > 100000:
|
| 1009 |
+
signal.update({
|
| 1010 |
+
'action': 'BUY',
|
| 1011 |
+
'confidence': min(0.7, whale_score),
|
| 1012 |
+
'reason': f'نشاط حيتان متوسط: {transfer_count} تحويل بإجمالي ${total_volume:,.0f}',
|
| 1013 |
+
'critical_alert': False
|
| 1014 |
+
})
|
| 1015 |
+
else:
|
| 1016 |
+
signal.update({
|
| 1017 |
+
'action': 'HOLD',
|
| 1018 |
+
'confidence': 0.5,
|
| 1019 |
+
'reason': f'نشاط حيتان طبيعي: {transfer_count} تحويل',
|
| 1020 |
+
'critical_alert': False
|
| 1021 |
+
})
|
| 1022 |
+
|
| 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 |
+
|
| 1034 |
+
pattern_name = pattern_analysis.get('pattern_detected')
|
| 1035 |
+
confidence = pattern_analysis.get('pattern_confidence', 0)
|
| 1036 |
+
|
| 1037 |
+
if pattern_name not in ['no_clear_pattern', 'insufficient_data']:
|
| 1038 |
+
if pattern_name not in self.pattern_performance:
|
| 1039 |
+
self.pattern_performance[pattern_name] = {
|
| 1040 |
+
'total_trades': 0,
|
| 1041 |
+
'successful_trades': 0,
|
| 1042 |
+
'total_profit': 0,
|
| 1043 |
+
'total_confidence': 0
|
| 1044 |
+
}
|
| 1045 |
+
|
| 1046 |
+
stats = self.pattern_performance[pattern_name]
|
| 1047 |
+
stats['total_trades'] += 1
|
| 1048 |
+
stats['total_confidence'] += confidence
|
| 1049 |
+
|
| 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()
|