14. finishing connectors
This commit is contained in:
@ -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()
|
||||
|
Reference in New Issue
Block a user