Build 060.13 — WebSocket Trade Mapper

This commit is contained in:
2026-07-19 22:13:33 +03:00
parent 6d121abe96
commit b7bef85d20
3 changed files with 1571 additions and 0 deletions

View File

@@ -17,6 +17,7 @@ from src.market_data.acquisition.adapters.dzengi.models import (
DzengiTicker24hrResponse,
DzengiWebSocketOhlcEvent,
DzengiWebSocketQuoteResponse,
DzengiWebSocketTradeEvent,
)
from src.market_data.acquisition.exceptions import (
CandleMappingError,
@@ -37,6 +38,7 @@ from src.market_data.acquisition.models.trade import (
_DZENGI_SOURCE_NAME = "dzengi"
_DZENGI_WEBSOCKET_OHLC_SOURCE_NAME = "dzengi_websocket_ohlc"
_DZENGI_WEBSOCKET_TRADE_SOURCE_NAME = "dzengi_websocket_trade"
def map_dzengi_symbol_to_instrument(
@@ -537,6 +539,41 @@ def map_dzengi_rest_agg_trades_to_trades(
)
def map_dzengi_websocket_trade_to_trade(
event: DzengiWebSocketTradeEvent,
) -> Trade:
"""
Преобразовать проверенную transport-модель
WebSocket Trade в каноническую модель Trade.
Предполагается, что ранее успешно выполнены:
- Schema Validation
- Parser
- Value Validation
"""
return Trade(
symbol=event.symbol.strip(),
trade_id=event.trade_id,
price=_required_trade_decimal(
event.price,
field_name="price",
),
quantity=_required_trade_decimal(
event.size,
field_name="size",
),
executed_at=_trade_timestamp_ms_to_utc_datetime(
event.timestamp,
),
aggressor_side=_websocket_trade_aggressor_side(
event.buyer,
),
source=_DZENGI_WEBSOCKET_TRADE_SOURCE_NAME,
)
def _map_dzengi_rest_agg_trade(
trade: DzengiRestAggTrade,
*,
@@ -572,6 +609,24 @@ def _trade_aggressor_side(
return TradeAggressorSide.BUY
def _websocket_trade_aggressor_side(
buyer: bool,
) -> TradeAggressorSide:
"""
Преобразовать направление WebSocket Trade
в каноническую сторону агрессора.
WebSocket:
buyer=True -> BUY
buyer=False -> SELL
"""
if buyer:
return TradeAggressorSide.BUY
return TradeAggressorSide.SELL
def _required_trade_decimal(
value: DzengiRawNumeric,
*,