420 lines
7.0 KiB
Markdown
420 lines
7.0 KiB
Markdown
# Build 059.2 — WebSocket OHLC Schema Validation
|
||
|
||
**Проект:** Dzentra
|
||
|
||
**Подсистема:** Market Data Acquisition
|
||
|
||
**Этап:** 059.2
|
||
|
||
**Статус:** Completed
|
||
|
||
---
|
||
|
||
# Цель
|
||
|
||
Добавить структурную (schema) валидацию сообщений
|
||
Dzengi WebSocket OHLC Market Data.
|
||
|
||
На данном этапе выполняется исключительно проверка структуры
|
||
полученного JSON.
|
||
|
||
Никакой parser, предметная проверка значений,
|
||
Decimal, datetime или mapping во внутренние модели
|
||
ещё не выполняются.
|
||
|
||
---
|
||
|
||
# Причина изменения
|
||
|
||
Во время Build 058 было подтверждено,
|
||
что WebSocket OHLC использует отдельный runtime-протокол.
|
||
|
||
После подписки
|
||
|
||
```
|
||
OHLCMarketData.subscribe
|
||
```
|
||
|
||
биржа начинает отправлять события
|
||
|
||
```
|
||
destination = ohlc.event
|
||
```
|
||
|
||
с payload следующего вида:
|
||
|
||
```json
|
||
{
|
||
"symbol": "BTC/USD_LEVERAGE",
|
||
"interval": "1m",
|
||
"type": "classic",
|
||
"t": 1784224740000,
|
||
"o": 63992.0,
|
||
"h": 64032.55,
|
||
"l": 63984.0,
|
||
"c": 64032.55
|
||
}
|
||
```
|
||
|
||
До данного Build
|
||
никакой schema validation
|
||
для подобных сообщений в проекте не существовало.
|
||
|
||
---
|
||
|
||
# Реализовано
|
||
|
||
Добавлена отдельная схема проверки
|
||
WebSocket OHLC сообщений.
|
||
|
||
Добавлены:
|
||
|
||
```
|
||
ValidatedWebSocketOhlcDocument
|
||
```
|
||
|
||
и
|
||
|
||
```
|
||
validate_dzengi_websocket_ohlc_schema()
|
||
```
|
||
|
||
в файл
|
||
|
||
```
|
||
src/market_data/acquisition/validation/schema.py
|
||
```
|
||
|
||
---
|
||
|
||
# Проверяемые элементы
|
||
|
||
Проверяется исключительно структура документа.
|
||
|
||
Проверяются:
|
||
|
||
- JSON object
|
||
|
||
- наличие payload
|
||
|
||
- наличие symbol
|
||
|
||
- наличие interval
|
||
|
||
- наличие type
|
||
|
||
- наличие timestamp
|
||
|
||
- наличие open
|
||
|
||
- наличие high
|
||
|
||
- наличие low
|
||
|
||
- наличие close
|
||
|
||
Никакие значения ещё не интерпретируются.
|
||
|
||
Например,
|
||
|
||
```
|
||
t
|
||
```
|
||
|
||
может быть любым объектом.
|
||
|
||
Его корректность будет проверяться
|
||
на этапе Value Validation.
|
||
|
||
---
|
||
|
||
# Поддерживаемые оболочки
|
||
|
||
Schema validator поддерживает все известные варианты,
|
||
которые уже используются в проекте
|
||
для остальных WebSocket Feed.
|
||
|
||
Поддерживаются:
|
||
|
||
## Без оболочки
|
||
|
||
```json
|
||
{
|
||
...
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## payload
|
||
|
||
```json
|
||
{
|
||
"payload": {
|
||
...
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Payload
|
||
|
||
```json
|
||
{
|
||
"Payload": {
|
||
...
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Двойная вложенность
|
||
|
||
```json
|
||
{
|
||
"payload": {
|
||
"payload": {
|
||
...
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
Такая логика полностью соответствует
|
||
реализованной ранее
|
||
для Quotes Feed.
|
||
|
||
---
|
||
|
||
# Что НЕ проверяется
|
||
|
||
Schema Validation намеренно
|
||
не проверяет:
|
||
|
||
- формат символа
|
||
|
||
- существование инструмента
|
||
|
||
- допустимость интервала
|
||
|
||
- допустимость типа свечи
|
||
|
||
- положительность цен
|
||
|
||
- порядок OHLC
|
||
|
||
- timestamp
|
||
|
||
Все перечисленные проверки
|
||
относятся к следующему слою архитектуры
|
||
(Value Validation).
|
||
|
||
---
|
||
|
||
# Новые исключения
|
||
|
||
Добавлено специализированное исключение
|
||
|
||
```
|
||
CandleWebSocketSchemaError
|
||
```
|
||
|
||
в
|
||
|
||
```
|
||
src/market_data/acquisition/exceptions.py
|
||
```
|
||
|
||
Это исключение используется исключительно
|
||
для структурных ошибок WebSocket OHLC.
|
||
|
||
Ошибки структуры
|
||
отделены
|
||
от ошибок:
|
||
|
||
- REST Candles
|
||
|
||
- Quotes Feed
|
||
|
||
- Instrument Feed
|
||
|
||
---
|
||
|
||
# Архитектурное разделение
|
||
|
||
После Build 059.2
|
||
конвейер имеет следующий вид:
|
||
|
||
```
|
||
WebSocket
|
||
|
||
↓
|
||
|
||
Schema Validation
|
||
|
||
↓
|
||
|
||
Parser
|
||
|
||
↓
|
||
|
||
Value Validation
|
||
|
||
↓
|
||
|
||
Mapping
|
||
```
|
||
|
||
Таким образом
|
||
каждый слой
|
||
остаётся полностью независимым.
|
||
|
||
---
|
||
|
||
# Unit Tests
|
||
|
||
Добавлен новый файл
|
||
|
||
```
|
||
tests/unit/market_data/acquisition/validation/test_websocket_ohlc_schema.py
|
||
```
|
||
|
||
Проверяются:
|
||
|
||
- корректное сообщение
|
||
|
||
- отсутствие payload
|
||
|
||
- отсутствие symbol
|
||
|
||
- отсутствие interval
|
||
|
||
- отсутствие type
|
||
|
||
- отсутствие t
|
||
|
||
- отсутствие o
|
||
|
||
- отсутствие h
|
||
|
||
- отсутствие l
|
||
|
||
- отсутствие c
|
||
|
||
- некорректный JSON object
|
||
|
||
- вложенные payload
|
||
|
||
- вложенные Payload
|
||
|
||
- двойная вложенность
|
||
|
||
- различные допустимые варианты структуры
|
||
|
||
Всего реализовано:
|
||
|
||
```
|
||
20 unit tests
|
||
```
|
||
|
||
---
|
||
|
||
# Проверка
|
||
|
||
Выполнено:
|
||
|
||
```bash
|
||
python -m compileall \
|
||
src/market_data/acquisition/exceptions.py \
|
||
src/market_data/acquisition/validation/schema.py \
|
||
tests/unit/market_data/acquisition/validation/test_websocket_ohlc_schema.py
|
||
```
|
||
|
||
Успешно.
|
||
|
||
---
|
||
|
||
Выполнено:
|
||
|
||
```bash
|
||
python -m pytest -q \
|
||
tests/unit/market_data/acquisition/validation/test_websocket_ohlc_schema.py
|
||
```
|
||
|
||
Результат:
|
||
|
||
```
|
||
20 passed
|
||
```
|
||
|
||
---
|
||
|
||
Выполнена регрессия
|
||
всех schema validation:
|
||
|
||
```bash
|
||
python -m pytest -q \
|
||
tests/unit/market_data/acquisition/validation/test_schema.py \
|
||
tests/unit/market_data/acquisition/validation/test_quote_schema.py \
|
||
tests/unit/market_data/acquisition/validation/test_candle_schema.py \
|
||
tests/unit/market_data/acquisition/validation/test_websocket_quote_schema.py \
|
||
tests/unit/market_data/acquisition/validation/test_websocket_ohlc_schema.py
|
||
```
|
||
|
||
Результат:
|
||
|
||
```
|
||
80 passed
|
||
```
|
||
|
||
---
|
||
|
||
Также выполнено:
|
||
|
||
```bash
|
||
git diff --check
|
||
```
|
||
|
||
Ошибок форматирования не обнаружено.
|
||
|
||
---
|
||
|
||
# Совместимость
|
||
|
||
Изменение полностью обратно совместимо.
|
||
|
||
Не изменены:
|
||
|
||
- REST Candles Feed
|
||
|
||
- Quotes Feed
|
||
|
||
- ExchangeService
|
||
|
||
- runtime
|
||
|
||
- Market Analysis
|
||
|
||
- Trading
|
||
|
||
---
|
||
|
||
# Итог
|
||
|
||
Build 059.2 завершает создание полноценного
|
||
структурного слоя проверки сообщений
|
||
Dzengi WebSocket OHLC.
|
||
|
||
После данного этапа
|
||
проект способен безопасно принимать
|
||
и структурно валидировать
|
||
входящие сообщения `ohlc.event`,
|
||
не выполняя их предметной интерпретации.
|
||
|
||
Следующим этапом является Build 059.3 —
|
||
Parser, который будет преобразовывать
|
||
структурно проверенный документ
|
||
в транспортную модель
|
||
`DzengiWebSocketOhlcEvent`. |