20 KiB
Dzentra Target Architecture
Контроль документа
| Свойство | Значение |
|---|---|
| Тип | Target Architecture |
| Статус | Active Baseline |
| Версия | 1.0 |
| Дата | 2026-07-31 |
| Проект | Dzentra |
1. Назначение
Документ фиксирует целевую архитектурную карту Dzentra и связывает:
- фактическую структуру существующего проекта;
- выполняемую Build-by-Build миграцию;
- будущие подсистемы профессиональной автоматической торговой системы;
- обязательное направление зависимостей между доменами.
Документ не требует немедленного создания всех перечисленных каталогов и не заменяет архитектурные спецификации отдельных Build.
Целевая архитектура отвечает на вопрос:
Какие ответственности должны существовать в системе и как они могут взаимодействовать?
Последовательность реализации и текущий статус определяет
docs/roadmap/master-roadmap.md.
2. Текущий контекст
Dzentra является работающим modular monolith, который постепенно мигрирует из Telegram trading bot в модульную алгоритмическую торговую платформу.
Проект не является greenfield-системой. В нём одновременно существуют:
- принятые новые архитектурные слои;
- рабочие legacy-компоненты;
- временные compatibility boundaries;
- будущие целевые подсистемы.
Поэтому целевой каталог нельзя создавать механическим переносом файлов. Любое изменение ownership или направления зависимостей выполняется отдельным Build после анализа фактических consumers.
3. Верхнеуровневая карта
External Exchanges and Data Sources
│
▼
┌───────────────────────────────────────────────┐
│ Market Data │
│ Acquisition → Canonicalization → Quality │
│ │ │
│ ├── Live / Operational │
│ └── Storage → Replay │
└───────────────────────────────────────────────┘
│ Canonical Live or Replay Data
▼
┌───────────────────────────────────────────────┐
│ Market Intelligence │
│ Processing → Features → Market State │
│ → Scenario Evaluation │
└───────────────────────────────────────────────┘
│ Analysis Results
▼
┌───────────────────────────────────────────────┐
│ Trading │
│ Strategy / Decision → Portfolio / Risk │
│ → Order Management → Execution │
│ → Position and Account Reconciliation │
└───────────────────────────────────────────────┘
│ Commands and Reports
▼
Exchange
Все уровни обслуживаются общей Platform-плоскостью:
Runtime and Scheduling
Event Contracts
Configuration and Secrets
Logging, Audit and Observability
Resilience and Recovery
Security
Deployment and Operations
Logging, Audit, Monitoring и Runtime не являются последними этапами торгового конвейера. Они действуют на всех уровнях системы.
4. Market Data
4.1. Market Data Acquisition
Назначение: получение внешних рыночных и справочных данных.
Целевые семейства Feed:
- Instrument Reference Data;
- Quotes;
- OHLCV / Candles;
- Trades / Time & Sales;
- Order Book;
- Derivatives Market Data;
- Market Index;
- Exchange Time;
- Exchange and Instrument Status.
Каждый Feed развивается как самостоятельный vertical slice:
external document
↓
schema validation
↓
parser / transport model
↓
value validation
↓
mapper
↓
canonical model
↓
handler / feed / service
REST и WebSocket могут иметь независимые transport pipelines, но до передачи downstream обязаны сходиться в одну source-independent Canonical Model.
Текущее размещение:
app/src/market_data/acquisition/
Текущий активный результат: Production Runtime для Trades Feed завершён в Build 060.25.
4.2. Validation, Canonicalization and Data Quality
Назначение:
- проверять структуру внешних документов;
- проверять допустимость значений;
- нормализовать время, числовые значения и идентификаторы;
- преобразовывать transport data в Canonical Models;
- контролировать дубликаты, порядок и пропуски;
- формировать явные признаки качества и freshness.
Эта ответственность сейчас распределена между:
adapters/
validation/
models/
consistency/
recovery/
Build 061.00 должен сначала проверить фактические границы, а уже затем
решить, требуется ли отдельный каталог normalization.
Schema Validation, Value Validation, Mapping, Stream Consistency и Missing Data Recovery не должны смешиваться в один универсальный компонент.
4.3. Operational Market State
Оперативное состояние необходимо для работы активного потока:
- последний принятый Trade;
- deduplication window;
- состояние подписок;
- connection generation;
- liveness и reconnect state.
Оно не является долговременной историей рынка.
TradeStreamState принадлежит Consistency Layer, а не общему Market
Data Storage и не WebSocket Transport.
4.4. Persistent Market Data Storage
Назначение: долговременно хранить Canonical Market Data для:
- восстановления после перезапуска;
- исторических запросов;
- Replay;
- разработки и проверки аналитики;
- backtesting;
- аудита качества данных.
Хранилище должно определить:
- raw и canonical retention policy;
- ключи идемпотентности;
- порядок и уникальность событий;
- партиционирование по типу данных, символу и времени;
- правила исправления и повторной загрузки;
- provenance и версию Canonical schema.
Существующий app/src/storage/ нельзя автоматически считать готовым
Market Data Storage. Его фактические контракты проверяются в
Build 060.27.
4.5. Historical Access and Replay
Назначение:
- исторические запросы;
- последовательное воспроизведение Canonical Market Data;
- управляемые виртуальные часы;
- одинаковые контракты данных для production и replay consumers;
- основа backtesting и воспроизводимой диагностики.
Replay должен воспроизводить порядок событий и не обходить Canonical Models или validation guarantees.
5. Market Intelligence
5.1. Market Data Processing
Формирует устойчивое состояние и базовые рыночные представления:
- Candle aggregation;
- Order Book reconstruction;
- best bid / ask / mid / spread;
- trade-flow aggregation;
- временные окна;
- подтверждённые market events.
Processing не принимает торговых решений.
5.2. Feature Engineering
Формирует производные признаки:
- returns и momentum;
- volatility;
- relative и abnormal volume;
- trade-flow intensity и delta;
- Order Book imbalance и microprice;
- liquidity;
- time/session features;
- statistical и cross-market features;
- derivatives features.
Canonical Trade price, quantity и timestamp уже являются исходными данными и не требуют отдельного дублирующего Trade Facts model без подтверждённого consumer.
5.3. Market State Estimation
Интерпретирует признаки и определяет:
- market structure;
- trend и range;
- momentum и correction;
- volatility regime;
- liquidity regime;
- order-flow state;
- market phase;
- microstructure context.
Текущее основное размещение:
app/src/trading/market_intelligence/
Изменение этого ownership требует отдельного архитектурного Build.
5.4. Scenario Evaluation
Dzentra рассматривает прогнозирование как оценку нескольких возможных сценариев:
- scenario generation;
- probability estimation;
- ranking;
- confidence and uncertainty.
Scenario Evaluation является опциональной аналитической возможностью. Strategy, которой отдельный прогноз не требуется, не должна создавать фиктивную зависимость от Forecasting.
6. Trading
6.1. Strategy and Trading Decision
Преобразует рыночный анализ в торговое намерение:
- enter;
- hold;
- reduce;
- exit;
- do nothing.
Результат Decision не является биржевым ордером и не должен напрямую вызывать Transport.
6.2. Portfolio and Risk
Проверяет и ограничивает торговое намерение:
- допустимый размер позиции;
- leverage и margin;
- общий капитал под риском;
- концентрацию по символам;
- drawdown и loss limits;
- pre-trade, continuous и emergency risk controls.
Risk не является только одним последовательным шагом после Strategy. Он может запрещать вход, изменять размер позиции и останавливать уже активное исполнение.
6.3. Order Management System
Отвечает за внутренний жизненный цикл собственных заявок:
- создание client order identity;
- переходы состояния заявки;
- amend / cancel;
- partial fills;
- deduplication;
- reconciliation с биржей;
- восстановление после reconnect и restart.
OMS не следует смешивать с Market Trades Feed: рыночная сделка и исполнение собственной заявки являются разными предметными сущностями.
6.4. Execution Management
Отвечает за:
- преобразование одобренного намерения в execution command;
- выбор цены и способа исполнения;
- маршрутизацию на биржу;
- контроль slippage, liquidity и freshness;
- обработку transport и exchange errors.
Текущее основное размещение:
app/src/trading/execution/
6.5. Position and Account Reconciliation
Сопоставляет локальное состояние с биржей:
- позиции;
- balances;
- fills;
- open orders;
- fees;
- realized и unrealized PnL.
Биржевое состояние является внешним фактом и должно периодически сверяться, а не только вычисляться из локальных событий.
7. Platform and Governance
Runtime and Scheduling
- явные владельцы задач и ресурсов;
- конечные timeouts;
- детерминированные startup и shutdown;
- controlled retry/reconnect;
- отсутствие скрытого fire-and-forget.
Event Contracts
- типизированные и версионируемые события;
- явная граница между market, runtime, execution и audit events;
- контролируемое ordering;
- отсутствие чувствительных transport payload в логах.
Configuration and Secrets
- feature flags безопасны по умолчанию;
- URL, symbols и credentials задаются явно;
- production secrets не попадают в код, документацию и события.
Logging, Audit and Observability
- технические логи;
- domain audit trail;
- Trade Journal;
- metrics, latency и data freshness;
- health и liveness;
- alerting;
- объяснение причин торгового решения.
Resilience
- idempotency;
- reconnect;
- Recovery;
- persistent checkpoint;
- startup reconciliation;
- controlled degradation;
- failure isolation.
Backtesting and Simulation
Backtesting является отдельной capability, но переиспользует:
- Canonical Market Data;
- Replay;
- deterministic clock;
- production Feature, Decision и Risk contracts;
- exchange/OMS simulator.
Отдельная копия торговой логики только для backtest не допускается.
8. Правила зависимостей
Разрешённое основное направление:
Market Data
↓
Market Intelligence
↓
Trading Decision
↓
Portfolio / Risk
↓
OMS / Execution
↓
Exchange Integration
Обязательные ограничения:
- Market Data не импортирует Trading;
- Canonical Models не зависят от Dzengi transport schema;
- Market Intelligence не управляет WebSocket lifecycle;
- Strategy не отправляет биржевую заявку напрямую;
- Execution не изменяет правила Market Data Consistency;
- Telegram UI не является владельцем domain state;
- Storage не вызывает торговые решения;
- Backtesting использует те же domain contracts, что production;
- Platform-компоненты не получают лишнюю предметную ответственность.
Обратная информация от Exchange возвращается через явные execution, order, account и runtime events, а не через обратные импорты между слоями.
9. Политика каталогов
Логический домен и физический каталог не обязаны иметь одинаковое имя.
Текущее соответствие:
| Ответственность | Фактическое размещение |
|---|---|
| Market Data Acquisition | app/src/market_data/acquisition/ |
| Application Runtime Composition | app/src/bootstrap/ |
| Runtime Events | app/src/runtime_events/ и локальные runtime events |
| Storage foundation | app/src/storage/ |
| Market Intelligence | app/src/trading/market_intelligence/ |
| Trading Decision | app/src/trading/decision/ |
| Execution | app/src/trading/execution/ |
| Position | app/src/trading/position/ |
| Trade Journal | app/src/trading/journal/ |
| Exchange Integration | app/src/integrations/exchange/ |
Новый каталог создаётся только когда:
- ответственность подтверждена фактическими consumers;
- определён публичный контракт;
- существующее ownership признано неверным;
- подготовлен отдельный migration plan;
- проверено направление импортов.
Предложенные имена вроде analytics/features,
market_data/normalization или market_data/storage являются
логическими ориентирами, а не заранее утверждённой файловой структурой.
10. Current-to-target status
| Область | Состояние |
|---|---|
| Market Data Acquisition foundation | Реализуется Build-by-Build |
| Trades Feed production runtime | Completed — Build 060.25 |
| Runtime integration/stress verification | Next — Build 060.26 |
| Persistent Market Data Storage | Planned — Build 060.27 |
| Persistent Checkpoint / Startup Recovery | Planned — Build 060.28 |
| Historical Access / Replay | Planned — Build 060.29 |
| Validation ownership audit/refactoring | Planned — Build 061.00 |
| Market Intelligence | Существующая активная подсистема |
| Decision / Execution / Position | Существующие подсистемы, требуют будущих boundary audits |
| OMS / Reconciliation | Целевая ответственность, отдельный план не утверждён |
| Backtesting | Целевая capability после Storage и Replay |
| Operations / Deployment | Целевая cross-cutting программа |
Completed означает завершение утверждённого Build, а не окончательную
сертификацию всей подсистемы для любой production-нагрузки.
11. Управление изменениями
Этот документ изменяется только когда меняется:
- ownership домена;
- публичная архитектурная граница;
- разрешённое направление зависимостей;
- целевая карта подсистем.
Статус конкретного Build изменяется в master-roadmap.md и его
migration report.
Детали реализации, тестовые evidence и локальные решения фиксируются в:
docs/migrations/build_<number>_architecture.md
docs/migrations/build_<number>.md
docs/decisions/
При конфликте:
- фактический код и тесты определяют текущее поведение;
- принятый Build architecture document определяет локальное решение;
- настоящий документ определяет целевую границу;
- roadmap определяет порядок дальнейшей миграции.