Riy777 commited on
Commit
2bd1c15
·
1 Parent(s): 507a112

Update simulation_engine/sim_runner.py

Browse files
Files changed (1) hide show
  1. simulation_engine/sim_runner.py +26 -35
simulation_engine/sim_runner.py CHANGED
@@ -1,11 +1,10 @@
1
  # simulation_engine/sim_runner.py
2
- # (V1.3 - Streamlined Simulation Loop - NO DEADLOCKS)
3
 
4
  import asyncio
5
  import os
6
  import pandas as pd
7
  import traceback
8
- # from tqdm.notebook import tqdm # (اختياري: يمكن استبداله بطباعة عادية إذا سبب مشاكل في البيئة الحالية)
9
  from tqdm import tqdm
10
  from datetime import datetime
11
 
@@ -23,8 +22,8 @@ except ImportError:
23
  # === إعدادات المحاكاة ===
24
  SIM_CONFIG = {
25
  "START_DATE": "2025-09-10",
26
- "END_DATE": "2025-11-09", # شهرين للتعلم الجيد
27
- "INITIAL_BALANCE": 10, # رصيد واقعي أكثر للبدء
28
  "TEST_SYMBOLS": [
29
  "BTC/USDT", "ETH/USDT", "SOL/USDT", "BNB/USDT", "XRP/USDT",
30
  "DOGE/USDT", "ADA/USDT", "AVAX/USDT", "LINK/USDT"
@@ -40,6 +39,10 @@ SIM_STATUS = {
40
  "trades_count": 0
41
  }
42
 
 
 
 
 
43
  async def run_realistic_simulation():
44
  global SIM_STATUS
45
  SIM_STATUS["running"] = True
@@ -54,16 +57,12 @@ async def run_realistic_simulation():
54
 
55
  print("🛠️ تجهيز البيئة...")
56
  mock_exchange = MockKuCoin(SIM_CONFIG["LOCAL_DATA_DIR"])
57
- # تحميل البيانات للأطر الزمنية الأساسية التي يحتاجها المعالج
58
  await mock_exchange.load_data(SIM_CONFIG["TEST_SYMBOLS"], ['5m', '15m', '1h', '4h', '1d'])
59
  virtual_wallet = VirtualExchange(SIM_CONFIG["INITIAL_BALANCE"])
60
 
61
  print("🧠 تهيئة النظام الهجين مع التعلم النشط...")
62
  data_manager = DataManager(None, None, r2_service=r2_service, mock_exchange=mock_exchange)
63
- # لا حاجة لتهيئة data_manager الكاملة هنا لأننا لن نستخدم stream_ohlcv_data المعقدة
64
- # await data_manager.initialize()
65
 
66
- # 🔥 تفعيل مركز التعلم بالكامل 🔥
67
  learning_hub = LearningHubManager(r2_service, None, data_manager)
68
  await learning_hub.initialize()
69
 
@@ -74,17 +73,15 @@ async def run_realistic_simulation():
74
 
75
  start_ts = int(pd.Timestamp(SIM_CONFIG["START_DATE"]).timestamp() * 1000)
76
  end_ts = int(pd.Timestamp(SIM_CONFIG["END_DATE"]).timestamp() * 1000)
77
- step_ms = 15 * 60 * 1000 # خطوة كل 15 دقيقة
78
  timeline = range(start_ts, end_ts, step_ms)
79
  total_steps = len(timeline)
80
 
81
- # استخدام tqdm العادي للطرفية، أو استبدله بـ range عادي إذا كنت في بيئة لا تدعمه
82
  progress_bar = tqdm(timeline, desc="Simulating", unit="step")
83
 
84
  for i, current_ts in enumerate(progress_bar):
85
  mock_exchange.set_time(current_ts)
86
 
87
- # تحديث الحالة العالمية كل 10 خطوات فقط لتخفيف الحمل
88
  if i % 10 == 0:
89
  SIM_STATUS["progress"] = (i / total_steps) * 100
90
  SIM_STATUS["current_balance"] = virtual_wallet.get_balance()
@@ -92,70 +89,67 @@ async def run_realistic_simulation():
92
 
93
  # --- أ. تحديث المحفظة + تعلم من الصفقات المغلقة ---
94
  current_prices = {}
95
- # جلب سريع للأسعار الحالية لكل الرموز دفعة واحدة (تحسين)
96
  for sym in SIM_CONFIG["TEST_SYMBOLS"]:
97
  ticker = await mock_exchange.fetch_ticker(sym)
98
  current_prices[sym] = ticker['last']
99
 
100
  closed_trades = virtual_wallet.update_positions(current_prices, current_ts)
101
  for trade in closed_trades:
102
- # print(f"🎓 Closed: {trade['symbol']} PnL: {trade['pnl_percent']:.2f}%") # اختياري للطباعة
103
  await learning_hub.analyze_trade_and_learn(trade, trade['close_reason'])
104
 
105
  # --- ب. دورة البحث عن فرص جديدة (مباشرة وبسيطة) ---
106
- # ننفذ المسح فقط إذا كان لدينا رصيد كافٍ
107
- if virtual_wallet.get_balance() > 1:
108
  for symbol in SIM_CONFIG["TEST_SYMBOLS"]:
109
  try:
110
- # 1. بناء حزمة البيانات المطلوبة للمعالج يدوياً وبسرعة
111
  ohlcv_packet = {}
112
  REQUIRED_TFS = ['5m', '15m', '1h', '4h', '1d']
113
  valid_packet = True
 
114
  for tf in REQUIRED_TFS:
115
- # نطلب عدداً كافياً من الشموع للتحليل (مثلاً 100)
116
- candles = await mock_exchange.fetch_ohlcv(symbol, tf, limit=100)
117
- if not candles or len(candles) < 50: # تحقق بسيط من كفاية البيانات
 
 
118
  valid_packet = False
119
  break
 
120
  ohlcv_packet[tf] = candles
121
 
122
  if not valid_packet: continue
123
-
124
  raw_data = {
125
  'symbol': symbol,
126
  'ohlcv': ohlcv_packet,
127
  'current_price': current_prices.get(symbol, 0.0)
128
  }
129
 
130
- # 2. المعالجة الفورية
131
- # نستخدم المعالج الهجين مباشرة
132
  res = await processor.process_and_score_symbol_enhanced(raw_data)
133
 
134
- # 3. اتخاذ القرار
135
- # نستخدم عتبة من DataManager أو قيمة ثابتة آمنة
136
  entry_threshold = getattr(data_manager, 'HYBRID_ENTRY_THRESHOLD', 0.75)
137
 
138
  if res and res['enhanced_final_score'] >= entry_threshold:
139
- # التحقق من عدم وجود صفقة مفتوحة لنفس الرمز
140
  if symbol not in virtual_wallet.positions:
141
- # حجم صفقة ثابت نسبياً (10% من الرصيد الحالي)
142
- pos_size = virtual_wallet.get_balance() * 0.95
143
- # تنفيذ الشراء
144
  virtual_wallet.execute_buy(
145
  symbol,
146
  res['current_price'],
147
  pos_size,
148
  current_ts,
149
- res.get('components', {}) # نحفظ تفاصيل القرار للتعلم لاحقاً
150
  )
151
- # print(f"🛒 BUY {symbol} at {res['current_price']} (Score: {res['enhanced_final_score']:.2f})")
152
 
153
  except Exception as e:
154
- # طباعة الخطأ مرة واحدة فقط لتجنب إغراق الشاشة
 
 
155
  # print(f"⚠️ Error processing {symbol} at {current_ts}: {e}")
156
  pass
157
 
158
- # --- الختام ---
159
  print("\n🏁 نهاية فترة المحاكاة. إغلاق الصفقات المتبقية...")
160
  final_ts = end_ts
161
  mock_exchange.set_time(final_ts)
@@ -168,17 +162,14 @@ async def run_realistic_simulation():
168
  trade = virtual_wallet.execute_sell(sym, final_prices.get(sym, 0), final_ts, "END_OF_SIM")
169
  if trade: await learning_hub.analyze_trade_and_learn(trade, "END_OF_SIM")
170
 
171
- # حفظ النتائج النهائية
172
  print("💾 جاري حفظ النتائج إلى R2...")
173
  await r2_service.save_simulation_results(virtual_wallet.trade_history, virtual_wallet.metrics)
174
 
175
- # حفظ ما تعلمناه (الأوزان الجديدة، إلخ)
176
  await learning_hub.shutdown()
177
 
178
  SIM_STATUS["running"] = False
179
  SIM_STATUS["progress"] = 100.0
180
 
181
- # طباعة ملخص سريع
182
  print("\n🎉 === تقرير المحاكاة السريع ===")
183
  print(f"💰 الرصيد النهائي: ${virtual_wallet.get_balance():.2f} (من ${SIM_CONFIG['INITIAL_BALANCE']})")
184
  print(f"📈 إجمالي الربح/الخسارة: ${virtual_wallet.metrics['total_pnl_usd']:.2f}")
 
1
  # simulation_engine/sim_runner.py
2
+ # (V1.4 - Streamlined Simulation Loop - FIXED TITAN DATA SCARCITY)
3
 
4
  import asyncio
5
  import os
6
  import pandas as pd
7
  import traceback
 
8
  from tqdm import tqdm
9
  from datetime import datetime
10
 
 
22
  # === إعدادات المحاكاة ===
23
  SIM_CONFIG = {
24
  "START_DATE": "2025-09-10",
25
+ "END_DATE": "2025-11-09",
26
+ "INITIAL_BALANCE": 10.0, # تم التعديل بناء على طلب المستخدم
27
  "TEST_SYMBOLS": [
28
  "BTC/USDT", "ETH/USDT", "SOL/USDT", "BNB/USDT", "XRP/USDT",
29
  "DOGE/USDT", "ADA/USDT", "AVAX/USDT", "LINK/USDT"
 
39
  "trades_count": 0
40
  }
41
 
42
+ # 🔥 متغير ثابت للإصلاح 🔥
43
+ REQUIRED_CANDLES = 200 # الحد الأدنى للشموع المطلوبة لحساب المؤشرات الكبيرة (مثل 200 EMA)
44
+ FETCH_LIMIT = 500 # نطلب 500 شمعة لضمان توفر الـ 200
45
+
46
  async def run_realistic_simulation():
47
  global SIM_STATUS
48
  SIM_STATUS["running"] = True
 
57
 
58
  print("🛠️ تجهيز البيئة...")
59
  mock_exchange = MockKuCoin(SIM_CONFIG["LOCAL_DATA_DIR"])
 
60
  await mock_exchange.load_data(SIM_CONFIG["TEST_SYMBOLS"], ['5m', '15m', '1h', '4h', '1d'])
61
  virtual_wallet = VirtualExchange(SIM_CONFIG["INITIAL_BALANCE"])
62
 
63
  print("🧠 تهيئة النظام الهجين مع التعلم النشط...")
64
  data_manager = DataManager(None, None, r2_service=r2_service, mock_exchange=mock_exchange)
 
 
65
 
 
66
  learning_hub = LearningHubManager(r2_service, None, data_manager)
67
  await learning_hub.initialize()
68
 
 
73
 
74
  start_ts = int(pd.Timestamp(SIM_CONFIG["START_DATE"]).timestamp() * 1000)
75
  end_ts = int(pd.Timestamp(SIM_CONFIG["END_DATE"]).timestamp() * 1000)
76
+ step_ms = 15 * 60 * 1000
77
  timeline = range(start_ts, end_ts, step_ms)
78
  total_steps = len(timeline)
79
 
 
80
  progress_bar = tqdm(timeline, desc="Simulating", unit="step")
81
 
82
  for i, current_ts in enumerate(progress_bar):
83
  mock_exchange.set_time(current_ts)
84
 
 
85
  if i % 10 == 0:
86
  SIM_STATUS["progress"] = (i / total_steps) * 100
87
  SIM_STATUS["current_balance"] = virtual_wallet.get_balance()
 
89
 
90
  # --- أ. تحديث المحفظة + تعلم من الصفقات المغلقة ---
91
  current_prices = {}
 
92
  for sym in SIM_CONFIG["TEST_SYMBOLS"]:
93
  ticker = await mock_exchange.fetch_ticker(sym)
94
  current_prices[sym] = ticker['last']
95
 
96
  closed_trades = virtual_wallet.update_positions(current_prices, current_ts)
97
  for trade in closed_trades:
 
98
  await learning_hub.analyze_trade_and_learn(trade, trade['close_reason'])
99
 
100
  # --- ب. دورة البحث عن فرص جديدة (مباشرة وبسيطة) ---
101
+ # تم تعديل الشرط ليناسب الرصيد الصغير (أكبر من 5 دولارات كحد أدنى)
102
+ if virtual_wallet.get_balance() > 5:
103
  for symbol in SIM_CONFIG["TEST_SYMBOLS"]:
104
  try:
 
105
  ohlcv_packet = {}
106
  REQUIRED_TFS = ['5m', '15m', '1h', '4h', '1d']
107
  valid_packet = True
108
+
109
  for tf in REQUIRED_TFS:
110
+ # 🔥 جلب 500 شمعة بدلاً من 100
111
+ candles = await mock_exchange.fetch_ohlcv(symbol, tf, limit=FETCH_LIMIT)
112
+
113
+ # 🔥 التحقق من الحد الأدنى للشموع المطلوبة
114
+ if not candles or len(candles) < REQUIRED_CANDLES:
115
  valid_packet = False
116
  break
117
+
118
  ohlcv_packet[tf] = candles
119
 
120
  if not valid_packet: continue
121
+
122
  raw_data = {
123
  'symbol': symbol,
124
  'ohlcv': ohlcv_packet,
125
  'current_price': current_prices.get(symbol, 0.0)
126
  }
127
 
 
 
128
  res = await processor.process_and_score_symbol_enhanced(raw_data)
129
 
 
 
130
  entry_threshold = getattr(data_manager, 'HYBRID_ENTRY_THRESHOLD', 0.75)
131
 
132
  if res and res['enhanced_final_score'] >= entry_threshold:
 
133
  if symbol not in virtual_wallet.positions:
134
+ # 🔥 حجم الصفقة 100% من الرصيد المتاح (للاستثمار بالكامل)
135
+ pos_size = virtual_wallet.get_balance()
136
+
137
  virtual_wallet.execute_buy(
138
  symbol,
139
  res['current_price'],
140
  pos_size,
141
  current_ts,
142
+ res.get('components', {})
143
  )
 
144
 
145
  except Exception as e:
146
+ # تتبع الأخطاء الصامتة فقط
147
+ if not valid_packet: continue # نمرر الأخطاء المتعلقة بالبيانات غير الكافية في بداية المحاكاة
148
+ # يمكنك إلغاء التعليق هنا إذا أردت رؤية الأخطاء الأخرى:
149
  # print(f"⚠️ Error processing {symbol} at {current_ts}: {e}")
150
  pass
151
 
152
+ # الختام
153
  print("\n🏁 نهاية فترة المحاكاة. إغلاق الصفقات المتبقية...")
154
  final_ts = end_ts
155
  mock_exchange.set_time(final_ts)
 
162
  trade = virtual_wallet.execute_sell(sym, final_prices.get(sym, 0), final_ts, "END_OF_SIM")
163
  if trade: await learning_hub.analyze_trade_and_learn(trade, "END_OF_SIM")
164
 
 
165
  print("💾 جاري حفظ النتائج إلى R2...")
166
  await r2_service.save_simulation_results(virtual_wallet.trade_history, virtual_wallet.metrics)
167
 
 
168
  await learning_hub.shutdown()
169
 
170
  SIM_STATUS["running"] = False
171
  SIM_STATUS["progress"] = 100.0
172
 
 
173
  print("\n🎉 === تقرير المحاكاة السريع ===")
174
  print(f"💰 الرصيد النهائي: ${virtual_wallet.get_balance():.2f} (من ${SIM_CONFIG['INITIAL_BALANCE']})")
175
  print(f"📈 إجمالي الربح/الخسارة: ${virtual_wallet.metrics['total_pnl_usd']:.2f}")