|
@@ -95,6 +95,10 @@ class PositionTracker:
|
|
# Convert exchange ROE from decimal to percentage
|
|
# Convert exchange ROE from decimal to percentage
|
|
roe_percentage = pos_data['return_on_equity'] * 100
|
|
roe_percentage = pos_data['return_on_equity'] * 100
|
|
|
|
|
|
|
|
+ # Get current leverage from database to compare
|
|
|
|
+ old_leverage = trade.get('leverage', 0)
|
|
|
|
+ new_leverage = pos_data['current_leverage']
|
|
|
|
+
|
|
# Update database with live market data
|
|
# Update database with live market data
|
|
self.trading_stats.update_trade_market_data(
|
|
self.trading_stats.update_trade_market_data(
|
|
trade_lifecycle_id=trade['trade_lifecycle_id'],
|
|
trade_lifecycle_id=trade['trade_lifecycle_id'],
|
|
@@ -102,9 +106,15 @@ class PositionTracker:
|
|
unrealized_pnl=pos_data['unrealized_pnl'],
|
|
unrealized_pnl=pos_data['unrealized_pnl'],
|
|
roe_percentage=roe_percentage,
|
|
roe_percentage=roe_percentage,
|
|
margin_used=pos_data['margin_used'],
|
|
margin_used=pos_data['margin_used'],
|
|
- leverage=pos_data['max_leverage']
|
|
|
|
|
|
+ leverage=new_leverage # Use current leverage, not max leverage
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+ # Log leverage changes
|
|
|
|
+ if old_leverage and abs(old_leverage - new_leverage) > 0.1:
|
|
|
|
+ logger.info(f"📊 Database updated - Leverage changed for {symbol}: {old_leverage:.1f}x → {new_leverage:.1f}x")
|
|
|
|
+ else:
|
|
|
|
+ logger.debug(f"Updated market data for {symbol}: leverage={new_leverage:.1f}x, ROE={roe_percentage:.2f}%")
|
|
|
|
+
|
|
except Exception as e:
|
|
except Exception as e:
|
|
logger.warning(f"Error updating market data for trade {trade.get('trade_lifecycle_id', 'unknown')}: {e}")
|
|
logger.warning(f"Error updating market data for trade {trade.get('trade_lifecycle_id', 'unknown')}: {e}")
|
|
continue
|
|
continue
|
|
@@ -130,12 +140,22 @@ class PositionTracker:
|
|
if size != 0: # Only include open positions
|
|
if size != 0: # Only include open positions
|
|
symbol = position_data.get('coin', '')
|
|
symbol = position_data.get('coin', '')
|
|
if symbol:
|
|
if symbol:
|
|
|
|
+ # Get actual current leverage from leverage object
|
|
|
|
+ leverage_info = position_data.get('leverage', {})
|
|
|
|
+ if isinstance(leverage_info, dict) and 'value' in leverage_info:
|
|
|
|
+ current_leverage = float(leverage_info['value'])
|
|
|
|
+ logger.debug(f"Using current leverage {current_leverage}x for {symbol} (max: {position_data.get('maxLeverage', 'N/A')}x)")
|
|
|
|
+ else:
|
|
|
|
+ current_leverage = float(position_data.get('maxLeverage', '1'))
|
|
|
|
+ logger.debug(f"Fallback to max leverage {current_leverage}x for {symbol} (no current leverage data)")
|
|
|
|
+
|
|
new_positions[symbol] = {
|
|
new_positions[symbol] = {
|
|
'size': size,
|
|
'size': size,
|
|
'entry_px': float(position_data.get('entryPx', '0')),
|
|
'entry_px': float(position_data.get('entryPx', '0')),
|
|
'unrealized_pnl': float(position_data.get('unrealizedPnl', '0')),
|
|
'unrealized_pnl': float(position_data.get('unrealizedPnl', '0')),
|
|
'margin_used': float(position_data.get('marginUsed', '0')),
|
|
'margin_used': float(position_data.get('marginUsed', '0')),
|
|
'max_leverage': float(position_data.get('maxLeverage', '1')),
|
|
'max_leverage': float(position_data.get('maxLeverage', '1')),
|
|
|
|
+ 'current_leverage': current_leverage, # Add current leverage
|
|
'return_on_equity': float(position_data.get('returnOnEquity', '0'))
|
|
'return_on_equity': float(position_data.get('returnOnEquity', '0'))
|
|
}
|
|
}
|
|
|
|
|
|
@@ -174,7 +194,7 @@ class PositionTracker:
|
|
f"Side: {side}\n"
|
|
f"Side: {side}\n"
|
|
f"Size: {abs(size):.4f}\n"
|
|
f"Size: {abs(size):.4f}\n"
|
|
f"Entry: ${position['entry_px']:.4f}\n"
|
|
f"Entry: ${position['entry_px']:.4f}\n"
|
|
- f"Leverage: {position['max_leverage']:.1f}x"
|
|
|
|
|
|
+ f"Leverage: {position.get('current_leverage', position['max_leverage']):.1f}x"
|
|
)
|
|
)
|
|
|
|
|
|
await self.notification_manager.send_notification(message)
|
|
await self.notification_manager.send_notification(message)
|
|
@@ -225,10 +245,12 @@ class PositionTracker:
|
|
logger.error(f"Error handling position closed for {symbol}: {e}")
|
|
logger.error(f"Error handling position closed for {symbol}: {e}")
|
|
|
|
|
|
async def _handle_position_changed(self, symbol: str, previous: Dict, current: Dict):
|
|
async def _handle_position_changed(self, symbol: str, previous: Dict, current: Dict):
|
|
- """Handle position size or direction changes"""
|
|
|
|
|
|
+ """Handle position size, direction, or leverage changes"""
|
|
try:
|
|
try:
|
|
prev_size = previous['size']
|
|
prev_size = previous['size']
|
|
curr_size = current['size']
|
|
curr_size = current['size']
|
|
|
|
+ prev_leverage = previous.get('current_leverage', 0)
|
|
|
|
+ curr_leverage = current.get('current_leverage', 0)
|
|
|
|
|
|
# Check if position reversed (long to short or vice versa)
|
|
# Check if position reversed (long to short or vice versa)
|
|
if (prev_size > 0 and curr_size < 0) or (prev_size < 0 and curr_size > 0):
|
|
if (prev_size > 0 and curr_size < 0) or (prev_size < 0 and curr_size > 0):
|
|
@@ -237,6 +259,22 @@ class PositionTracker:
|
|
await self._handle_position_opened(symbol, current)
|
|
await self._handle_position_opened(symbol, current)
|
|
return
|
|
return
|
|
|
|
|
|
|
|
+ # Check if leverage changed
|
|
|
|
+ if abs(prev_leverage - curr_leverage) > 0.1: # Threshold to avoid noise
|
|
|
|
+ logger.info(f"📊 Leverage changed for {symbol}: {prev_leverage:.1f}x → {curr_leverage:.1f}x")
|
|
|
|
+
|
|
|
|
+ # Optional: Send notification for significant leverage changes
|
|
|
|
+ if abs(prev_leverage - curr_leverage) >= 1.0: # Only notify for changes >= 1x
|
|
|
|
+ side = "Long" if curr_size > 0 else "Short"
|
|
|
|
+ change_direction = "Increased" if curr_leverage > prev_leverage else "Decreased"
|
|
|
|
+ message = (
|
|
|
|
+ f"⚖️ Leverage {change_direction}\n"
|
|
|
|
+ f"Token: {symbol}\n"
|
|
|
|
+ f"Side: {side}\n"
|
|
|
|
+ f"Leverage: {prev_leverage:.1f}x → {curr_leverage:.1f}x"
|
|
|
|
+ )
|
|
|
|
+ await self.notification_manager.send_notification(message)
|
|
|
|
+
|
|
# Check if position size changed significantly
|
|
# Check if position size changed significantly
|
|
size_change = abs(curr_size) - abs(prev_size)
|
|
size_change = abs(curr_size) - abs(prev_size)
|
|
if abs(size_change) > 0.001: # Threshold to avoid noise
|
|
if abs(size_change) > 0.001: # Threshold to avoid noise
|