|
@@ -30,13 +30,23 @@ class PositionTracker:
|
|
return
|
|
return
|
|
|
|
|
|
self.is_running = True
|
|
self.is_running = True
|
|
- logger.info("Starting position tracker")
|
|
|
|
|
|
+ logger.info("🔄 Starting position tracker")
|
|
|
|
|
|
- # Initialize current positions
|
|
|
|
- await self._update_current_positions()
|
|
|
|
-
|
|
|
|
- # Start monitoring loop
|
|
|
|
- asyncio.create_task(self._monitoring_loop())
|
|
|
|
|
|
+ try:
|
|
|
|
+ # Initialize current positions
|
|
|
|
+ logger.info("📊 Initializing current positions...")
|
|
|
|
+ await self._update_current_positions()
|
|
|
|
+ logger.info(f"✅ Position tracker initialized with {len(self.current_positions)} open positions")
|
|
|
|
+
|
|
|
|
+ # Start monitoring loop
|
|
|
|
+ logger.info("🔄 Starting position monitoring loop...")
|
|
|
|
+ asyncio.create_task(self._monitoring_loop())
|
|
|
|
+ logger.info("✅ Position tracker started successfully")
|
|
|
|
+
|
|
|
|
+ except Exception as e:
|
|
|
|
+ logger.error(f"❌ Error starting position tracker: {e}", exc_info=True)
|
|
|
|
+ self.is_running = False
|
|
|
|
+ raise
|
|
|
|
|
|
async def stop(self):
|
|
async def stop(self):
|
|
"""Stop position tracking"""
|
|
"""Stop position tracking"""
|
|
@@ -45,14 +55,26 @@ class PositionTracker:
|
|
|
|
|
|
async def _monitoring_loop(self):
|
|
async def _monitoring_loop(self):
|
|
"""Main monitoring loop"""
|
|
"""Main monitoring loop"""
|
|
|
|
+ logger.info(f"🔄 Position tracker monitoring loop started (heartbeat: {Config.BOT_HEARTBEAT_SECONDS}s)")
|
|
|
|
+ loop_count = 0
|
|
|
|
+
|
|
while self.is_running:
|
|
while self.is_running:
|
|
try:
|
|
try:
|
|
|
|
+ loop_count += 1
|
|
|
|
+ logger.debug(f"📊 Position tracker loop #{loop_count} - checking for position changes...")
|
|
await self._check_position_changes()
|
|
await self._check_position_changes()
|
|
|
|
+
|
|
|
|
+ # Log periodically to show it's alive
|
|
|
|
+ if loop_count % 12 == 0: # Every 12 loops (60 seconds with 5s heartbeat)
|
|
|
|
+ logger.info(f"📊 Position tracker alive - loop #{loop_count}, {len(self.current_positions)} positions tracked")
|
|
|
|
+
|
|
await asyncio.sleep(Config.BOT_HEARTBEAT_SECONDS) # Use config heartbeat
|
|
await asyncio.sleep(Config.BOT_HEARTBEAT_SECONDS) # Use config heartbeat
|
|
except Exception as e:
|
|
except Exception as e:
|
|
- logger.error(f"Error in position tracking loop: {e}")
|
|
|
|
|
|
+ logger.error(f"❌ Error in position tracking loop #{loop_count}: {e}", exc_info=True)
|
|
await asyncio.sleep(Config.BOT_HEARTBEAT_SECONDS)
|
|
await asyncio.sleep(Config.BOT_HEARTBEAT_SECONDS)
|
|
|
|
|
|
|
|
+ logger.info("🛑 Position tracker monitoring loop stopped")
|
|
|
|
+
|
|
async def _check_position_changes(self):
|
|
async def _check_position_changes(self):
|
|
"""Check for any position changes"""
|
|
"""Check for any position changes"""
|
|
try:
|
|
try:
|
|
@@ -125,10 +147,16 @@ class PositionTracker:
|
|
async def _update_current_positions(self):
|
|
async def _update_current_positions(self):
|
|
"""Update current positions from exchange"""
|
|
"""Update current positions from exchange"""
|
|
try:
|
|
try:
|
|
|
|
+ logger.debug("🔍 Fetching positions from Hyperliquid client...")
|
|
positions = self.hl_client.get_positions()
|
|
positions = self.hl_client.get_positions()
|
|
|
|
+
|
|
if not positions:
|
|
if not positions:
|
|
|
|
+ logger.debug("📊 No positions returned from exchange")
|
|
|
|
+ self.current_positions = {}
|
|
return
|
|
return
|
|
|
|
|
|
|
|
+ logger.debug(f"📊 Processing {len(positions)} positions from exchange...")
|
|
|
|
+
|
|
new_positions = {}
|
|
new_positions = {}
|
|
for position in positions:
|
|
for position in positions:
|
|
# Access nested position data from info.position
|
|
# Access nested position data from info.position
|
|
@@ -160,9 +188,10 @@ class PositionTracker:
|
|
}
|
|
}
|
|
|
|
|
|
self.current_positions = new_positions
|
|
self.current_positions = new_positions
|
|
|
|
+ logger.debug(f"✅ Updated current positions: {len(new_positions)} open positions ({list(new_positions.keys()) if new_positions else 'none'})")
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
- logger.error(f"Error updating current positions: {e}")
|
|
|
|
|
|
+ logger.error(f"❌ Error updating current positions: {e}", exc_info=True)
|
|
|
|
|
|
async def _process_position_changes(self, previous: Dict, current: Dict):
|
|
async def _process_position_changes(self, previous: Dict, current: Dict):
|
|
"""Process changes between previous and current positions"""
|
|
"""Process changes between previous and current positions"""
|