328 lines
7.5 KiB
Markdown
328 lines
7.5 KiB
Markdown
# Build 060.5 — REST Trade Value Validation
|
||
|
||
## Цель
|
||
|
||
Реализовать слой проверки допустимости значений (`Value Validation`) для REST aggTrades после завершения этапов структурной проверки (`Schema Validation`) и преобразования в transport-модели (`REST Parser`).
|
||
|
||
Build завершает третий этап конвейера обработки REST Trades и обеспечивает, что все transport-модели содержат только корректные значения перед передачей в Mapper.
|
||
|
||
---
|
||
|
||
# Место Build в общей архитектуре
|
||
|
||
До Build 060.5 конвейер выглядел следующим образом:
|
||
|
||
```text
|
||
REST JSON
|
||
│
|
||
▼
|
||
Schema Validation
|
||
│
|
||
▼
|
||
ValidatedRestAggTradesDocument
|
||
│
|
||
▼
|
||
REST Parser
|
||
│
|
||
▼
|
||
tuple[DzengiRestAggTrade]
|
||
```
|
||
|
||
После Build 060.5:
|
||
|
||
```text
|
||
REST JSON
|
||
│
|
||
▼
|
||
Schema Validation
|
||
│
|
||
▼
|
||
ValidatedRestAggTradesDocument
|
||
│
|
||
▼
|
||
REST Parser
|
||
│
|
||
▼
|
||
tuple[DzengiRestAggTrade]
|
||
│
|
||
▼
|
||
REST Trade Value Validation
|
||
│
|
||
▼
|
||
tuple[DzengiRestAggTrade]
|
||
```
|
||
|
||
Следующим этапом станет:
|
||
|
||
```text
|
||
Mapper
|
||
│
|
||
▼
|
||
Canonical Trade
|
||
```
|
||
|
||
---
|
||
|
||
# Архитектурная ответственность
|
||
|
||
Value Validation отвечает исключительно за проверку допустимости значений transport-моделей.
|
||
|
||
Validator:
|
||
|
||
- не изменяет transport-модель;
|
||
- не выполняет mapping;
|
||
- не преобразует данные в canonical-модель;
|
||
- не нормализует значения;
|
||
- не возвращает преобразованные объекты.
|
||
|
||
При успешной проверке функция завершается без результата.
|
||
|
||
При обнаружении ошибки выбрасывается специализированное исключение.
|
||
|
||
---
|
||
|
||
# Добавлено новое исключение
|
||
|
||
Файл:
|
||
|
||
```text
|
||
src/market_data/acquisition/exceptions.py
|
||
```
|
||
|
||
Добавлено:
|
||
|
||
```python
|
||
TradeValueError
|
||
```
|
||
|
||
Назначение:
|
||
|
||
- ошибки проверки допустимости значений REST Trade transport-моделей.
|
||
|
||
---
|
||
|
||
# Новый публичный API
|
||
|
||
Файл:
|
||
|
||
```text
|
||
src/market_data/acquisition/validation/values.py
|
||
```
|
||
|
||
Добавлена функция:
|
||
|
||
```python
|
||
validate_rest_agg_trade_values(
|
||
trades: tuple[DzengiRestAggTrade, ...],
|
||
) -> None
|
||
```
|
||
|
||
Ответственность функции:
|
||
|
||
- проверить все transport-модели;
|
||
- при первой ошибке выбросить `TradeValueError`;
|
||
- при отсутствии ошибок успешно завершиться.
|
||
|
||
---
|
||
|
||
# Внутренняя архитектура
|
||
|
||
Реализация построена по тому же принципу, что уже используется для Instrument, Quote и Candle.
|
||
|
||
```text
|
||
validate_rest_agg_trade_values()
|
||
│
|
||
▼
|
||
_validate_rest_agg_trade()
|
||
│
|
||
├────────────► _trade_positive_int()
|
||
├────────────► _trade_positive_decimal()
|
||
└────────────► _trade_decimal()
|
||
```
|
||
|
||
Каждая helper-функция отвечает только за одну проверку.
|
||
|
||
---
|
||
|
||
# Проверяемые поля
|
||
|
||
## aggregate_trade_id
|
||
|
||
Проверяется:
|
||
|
||
- тип int (bool исключается);
|
||
- значение больше нуля.
|
||
|
||
---
|
||
|
||
## price
|
||
|
||
Проверяется:
|
||
|
||
- успешное преобразование в Decimal;
|
||
- конечность числа;
|
||
- значение больше нуля.
|
||
|
||
Поддерживаются значения:
|
||
|
||
- str
|
||
- int
|
||
- float
|
||
|
||
---
|
||
|
||
## quantity
|
||
|
||
Проверяется аналогично полю price.
|
||
|
||
---
|
||
|
||
## timestamp
|
||
|
||
Проверяется:
|
||
|
||
- тип int (bool исключается);
|
||
- значение больше нуля.
|
||
|
||
---
|
||
|
||
## buyer_is_maker
|
||
|
||
Дополнительная проверка отсутствует.
|
||
|
||
Корректность типа bool уже гарантируется предыдущим этапом — REST Parser.
|
||
|
||
---
|
||
|
||
# Что НЕ входит в Value Validation
|
||
|
||
Build сознательно не выполняет:
|
||
|
||
- преобразование transport-моделей;
|
||
- mapping;
|
||
- создание Canonical Trade;
|
||
- преобразование чисел в Decimal для дальнейшей обработки;
|
||
- проверку возраста сделки;
|
||
- проверку порядка timestamp;
|
||
- проверку последовательности aggregateTradeId;
|
||
- проверку дубликатов.
|
||
|
||
Все перечисленные задачи относятся к последующим слоям Acquisition Pipeline.
|
||
|
||
---
|
||
|
||
# Диагностика ошибок
|
||
|
||
Все сообщения содержат полный путь до ошибочного поля.
|
||
|
||
Примеры:
|
||
|
||
```text
|
||
$[0].price должно быть больше нуля.
|
||
|
||
$[1].quantity должно быть корректным числом.
|
||
|
||
$[2].timestamp должно быть целым числом больше нуля.
|
||
```
|
||
|
||
Такой формат полностью соответствует существующей архитектуре Validation Layer.
|
||
|
||
---
|
||
|
||
# Unit Tests
|
||
|
||
Добавлены тесты для:
|
||
|
||
## Позитивных сценариев
|
||
|
||
- одна корректная сделка;
|
||
- несколько корректных сделок;
|
||
- пустой tuple;
|
||
- строковые числовые значения;
|
||
- int;
|
||
- float;
|
||
- оба значения buyer_is_maker.
|
||
|
||
---
|
||
|
||
## Негативных сценариев
|
||
|
||
Проверяются:
|
||
|
||
- aggregate_trade_id ≤ 0;
|
||
- timestamp ≤ 0;
|
||
- price ≤ 0;
|
||
- quantity ≤ 0;
|
||
- NaN;
|
||
- Infinity;
|
||
- -Infinity;
|
||
- некорректные числовые строки;
|
||
- корректное формирование пути ошибки.
|
||
|
||
---
|
||
|
||
# Результаты проверки
|
||
|
||
Target tests:
|
||
|
||
```text
|
||
68 passed
|
||
```
|
||
|
||
Полная регрессия проекта:
|
||
|
||
```text
|
||
1072 passed
|
||
```
|
||
|
||
Дополнительно выполнено:
|
||
|
||
```text
|
||
python -m compileall src
|
||
```
|
||
|
||
Результат:
|
||
|
||
```text
|
||
OK
|
||
```
|
||
|
||
Также выполнено:
|
||
|
||
```text
|
||
git diff --check
|
||
```
|
||
|
||
Ошибок форматирования не обнаружено.
|
||
|
||
---
|
||
|
||
# Архитектурный результат Build
|
||
|
||
После завершения Build 060.5 REST Trades получили полностью независимый трехуровневый pipeline проверки данных.
|
||
|
||
```text
|
||
REST JSON
|
||
│
|
||
▼
|
||
Schema Validation
|
||
│
|
||
▼
|
||
ValidatedRestAggTradesDocument
|
||
│
|
||
▼
|
||
REST Parser
|
||
│
|
||
▼
|
||
tuple[DzengiRestAggTrade]
|
||
│
|
||
▼
|
||
REST Trade Value Validation
|
||
│
|
||
▼
|
||
tuple[DzengiRestAggTrade]
|
||
```
|
||
|
||
Каждый этап отвечает исключительно за собственную область ответственности.
|
||
|
||
Следующий Build (060.6) впервые переведет transport-модели в внутреннюю каноническую модель `Trade`, независимую от конкретной биржи. |