14. finishing connectors

This commit is contained in:
Dobromir Popov
2025-08-05 00:13:38 +03:00
parent d0b678015e
commit 3bbfde5d2b
6 changed files with 465 additions and 15 deletions

View File

@ -251,23 +251,161 @@ class MEXCConnector(BaseExchangeConnector):
async def _handle_orderbook_update(self, data: Dict) -> None:
"""Handle order book update from MEXC."""
# Implementation would parse MEXC-specific order book update format
logger.debug("Received MEXC order book update")
try:
set_correlation_id()
symbol_data = data.get('s', '') # Symbol
if not symbol_data:
logger.warning("Order book update missing symbol")
return
symbol = symbol_data # Already in standard format
order_data = data.get('d', {})
# Parse bids and asks
bids = []
for bid_data in order_data.get('bids', []):
price = float(bid_data[0])
size = float(bid_data[1])
if validate_price(price) and validate_volume(size):
bids.append(PriceLevel(price=price, size=size))
asks = []
for ask_data in order_data.get('asks', []):
price = float(ask_data[0])
size = float(ask_data[1])
if validate_price(price) and validate_volume(size):
asks.append(PriceLevel(price=price, size=size))
# Create order book snapshot
orderbook = OrderBookSnapshot(
symbol=symbol,
exchange=self.exchange_name,
timestamp=datetime.fromtimestamp(int(data.get('t', 0)) / 1000, tz=timezone.utc),
bids=bids,
asks=asks,
sequence_id=order_data.get('lastUpdateId')
)
# Notify callbacks
self._notify_data_callbacks(orderbook)
logger.debug(f"Processed order book update for {symbol}")
except Exception as e:
logger.error(f"Error handling order book update: {e}")
async def _handle_orderbook_snapshot(self, data: Dict) -> None:
"""Handle order book snapshot from MEXC."""
# Implementation would parse MEXC-specific order book snapshot format
logger.debug("Received MEXC order book snapshot")
try:
set_correlation_id()
symbol_data = data.get('s', '') # Symbol
if not symbol_data:
logger.warning("Order book snapshot missing symbol")
return
symbol = symbol_data # Already in standard format
order_data = data.get('d', {})
# Parse bids and asks
bids = []
for bid_data in order_data.get('bids', []):
price = float(bid_data[0])
size = float(bid_data[1])
if validate_price(price) and validate_volume(size):
bids.append(PriceLevel(price=price, size=size))
asks = []
for ask_data in order_data.get('asks', []):
price = float(ask_data[0])
size = float(ask_data[1])
if validate_price(price) and validate_volume(size):
asks.append(PriceLevel(price=price, size=size))
# Create order book snapshot
orderbook = OrderBookSnapshot(
symbol=symbol,
exchange=self.exchange_name,
timestamp=datetime.fromtimestamp(int(data.get('t', 0)) / 1000, tz=timezone.utc),
bids=bids,
asks=asks,
sequence_id=order_data.get('lastUpdateId')
)
# Notify callbacks
self._notify_data_callbacks(orderbook)
logger.debug(f"Processed order book snapshot for {symbol}")
except Exception as e:
logger.error(f"Error handling order book snapshot: {e}")
async def _handle_trade_update(self, data: Dict) -> None:
"""Handle trade update from MEXC."""
# Implementation would parse MEXC-specific trade format
logger.debug("Received MEXC trade update")
try:
set_correlation_id()
symbol_data = data.get('s', '') # Symbol
if not symbol_data:
logger.warning("Trade update missing symbol")
return
symbol = symbol_data # Already in standard format
trade_data = data.get('d', {})
# MEXC trade data format
trades = trade_data.get('deals', [])
for trade_info in trades:
price = float(trade_info.get('p', 0))
quantity = float(trade_info.get('v', 0))
# Validate data
if not validate_price(price) or not validate_volume(quantity):
logger.warning(f"Invalid trade data: price={price}, quantity={quantity}")
continue
# Determine side (MEXC uses 'S' field: 1=buy, 2=sell)
side_code = trade_info.get('S', 0)
side = 'buy' if side_code == 1 else 'sell'
# Create trade event
trade = TradeEvent(
symbol=symbol,
exchange=self.exchange_name,
timestamp=datetime.fromtimestamp(int(trade_info.get('t', 0)) / 1000, tz=timezone.utc),
price=price,
size=quantity,
side=side,
trade_id=str(trade_info.get('i', ''))
)
# Notify callbacks
self._notify_data_callbacks(trade)
logger.debug(f"Processed trade for {symbol}: {side} {quantity} @ {price}")
except Exception as e:
logger.error(f"Error handling trade update: {e}")
async def _handle_pong(self, data: Dict) -> None:
"""Handle pong response from MEXC."""
logger.debug("Received MEXC pong")
async def _send_ping(self) -> None:
"""Send ping to keep connection alive."""
try:
ping_msg = {"method": "PING"}
await self._send_message(ping_msg)
logger.debug("Sent ping to MEXC")
except Exception as e:
logger.error(f"Error sending ping: {e}")
def get_mexc_stats(self) -> Dict[str, Any]:
"""Get MEXC-specific statistics."""
base_stats = self.get_stats()