feat: 07.4.1 base strategy + 07.4.2 strategy registry + docs sync

This commit is contained in:
2026-04-29 23:26:46 +03:00
parent 7c8895c3a5
commit 80f29443d4
22 changed files with 961 additions and 237 deletions

View File

@@ -0,0 +1 @@
"""Package marker."""

View File

@@ -0,0 +1 @@
"""Package marker."""

View File

@@ -0,0 +1 @@
"""Package marker."""

View File

@@ -3,11 +3,12 @@
from __future__ import annotations
import asyncio
import random
from datetime import datetime
from src.core.config import load_settings
from src.trading.auto.state import AutoTradeState
from src.trading.strategies.base import BaseStrategy, StrategyContext
from src.trading.strategies.registry import StrategyRegistry
class AutoTradeService:
@@ -106,7 +107,7 @@ class AutoTradeService:
# установить стратегию
def set_strategy(self, strategy: str) -> AutoTradeState:
state = self.get_state()
state.strategy = strategy
state.strategy = strategy.strip().upper()
return state
# установить риск
@@ -115,6 +116,21 @@ class AutoTradeService:
state.risk_percent = risk_percent
return state
# собрать контекст для стратегии
def _build_strategy_context(self) -> StrategyContext:
state = self.get_state()
return StrategyContext(
symbol=state.symbol,
status=state.status,
risk_percent=state.risk_percent,
)
# получить стратегию для текущего цикла
def _get_strategy(self) -> BaseStrategy:
state = self.get_state()
return StrategyRegistry.get(state.strategy)
# выполнить один цикл анализа рынка
def run_cycle(self) -> AutoTradeState:
state = self.get_state()
@@ -122,7 +138,11 @@ class AutoTradeService:
if state.status == "OFF":
return state
strategy = self._get_strategy()
context = self._build_strategy_context()
result = strategy.analyze(context)
state.last_check_at = datetime.now().strftime("%H:%M:%S")
state.last_signal = random.choice(["BUY", "SELL", "HOLD"])
state.last_signal = result.signal.value
return state

View File

@@ -0,0 +1 @@
"""Package marker."""

View File

@@ -0,0 +1 @@
"""Package marker."""

View File

@@ -0,0 +1,29 @@
# app/src/trading/strategies/base.py
from __future__ import annotations
from dataclasses import dataclass
from typing import Protocol
from src.trading.strategies.signals import SignalResult
@dataclass(slots=True)
class StrategyContext:
# выбранный торговый инструмент
symbol: str
# текущий режим автоторговли: OBSERVING / RUNNING
status: str
# риск на сделку в процентах
risk_percent: float | None = None
class BaseStrategy(Protocol):
# техническое имя стратегии
name: str
# выполнить анализ и вернуть торговый сигнал
def analyze(self, context: StrategyContext) -> SignalResult:
...

View File

@@ -0,0 +1,23 @@
# app/src/trading/strategies/hold.py
from __future__ import annotations
from src.trading.strategies.base import StrategyContext
from src.trading.strategies.signals import SignalResult, SignalType
class HoldStrategy:
name = "HOLD"
# безопасная стратегия по умолчанию: ничего не делает
def analyze(self, context: StrategyContext) -> SignalResult:
return SignalResult(
signal=SignalType.HOLD,
reason="Стратегия не выбрана. Используется безопасный HOLD.",
confidence=0.0,
payload={
"symbol": context.symbol,
"status": context.status,
"strategy": self.name,
},
)

View File

@@ -0,0 +1,30 @@
# app/src/trading/strategies/registry.py
from __future__ import annotations
from src.trading.strategies.base import BaseStrategy
from src.trading.strategies.hold import HoldStrategy
class StrategyRegistry:
# доступные стратегии
_strategies: dict[str, BaseStrategy] = {
"HOLD": HoldStrategy(),
"TREND": HoldStrategy(),
"GRID": HoldStrategy(),
"SCALP": HoldStrategy(),
}
# получить стратегию по имени
@classmethod
def get(cls, name: str | None) -> BaseStrategy:
if not name:
return cls._strategies["HOLD"]
normalized_name = name.strip().upper()
return cls._strategies.get(normalized_name, cls._strategies["HOLD"])
# получить список доступных стратегий
@classmethod
def names(cls) -> list[str]:
return sorted(cls._strategies.keys())

View File

@@ -0,0 +1,32 @@
# app/src/trading/strategies/signals.py
from __future__ import annotations
from dataclasses import dataclass
from enum import StrEnum
class SignalType(StrEnum):
# купить
BUY = "BUY"
# продать
SELL = "SELL"
# ничего не делать
HOLD = "HOLD"
@dataclass(slots=True)
class SignalResult:
# итоговый сигнал стратегии
signal: SignalType
# человекочитаемая причина сигнала
reason: str
# уверенность стратегии от 0.0 до 1.0
confidence: float = 0.0
# дополнительные данные стратегии для логов / отладки
payload: dict | None = None

View File

@@ -1,122 +1,170 @@
# Dzentra Bot — Master Roadmap
# Master Roadmap — Dzentra Bot
## Stage 01 — Bootstrap
✔ структура проекта
✔ virtualenv
✔ запуск приложения
✔ базовый bootstrap
## Цель проекта
Создать Telegram-бота для:
- ручной торговли;
- мониторинга рынка;
- автоторговли;
- аналитики;
- управления стратегиями.
---
## Stage 02System layer
экран ⚙️ Система
базовая диагностика
структура компонентов
# Stage 01Bootstrap / Foundation
app bootstrap
config layer
logging
✔ router bootstrap
✔ DB bootstrap
✅ Статус: завершён
---
## Stage 03Exchange Integration
# Stage 02System / Diagnostics
✔ system screen
✔ exchange health
✔ DB health
✔ runtime info
✔ error rendering
### 03.1
✅ Статус: завершён
---
# Stage 03 — Exchange Integration
✔ mock exchange
### 03.2
✔ время / timestamp
### 03.3
✔ time handling
✔ exchangeInfo
валидация символа
private auth
✔ account + portfolio
✔ market live polling
⚠ websocket research / fallback polling
### 03.4
✔ private auth (HMAC, headers, timestamp)
### 03.5
✔ первый private endpoint (account)
✔ баланс
✔ экран 💼 Портфель
✔ UX улучшения
✅ Статус: завершён (fallback mode)
---
## Stage 04 — Storage / Journal (NEXT)
### 04.1
⏳ storage foundation
### 04.2
⏳ journal / event log
### 04.3
⏳ repositories
### 04.4
⏳ UI integration
---
## Stage 03.6 — Orders (после storage)
⏳ orders skeleton
⏳ dry-run режим
⏳ валидация ордеров
---
## Stage 05 — Trading logic
⏳ стратегии
⏳ риск-менеджмент
⏳ сигналы
---
## Stage 06 — UI / Journal / Navigation
### 06.1
✔ journal management UI
✔ export CSV/XLSX
✔ system navigation redesign
### 06.2
✔ system settings navigation
✔ product information screen
✔ settings stubs
### 06.3
⏳ retention / limits
---
## Stage 07 — Auto Trading
### 07.1
✔ auto trading skeleton UI
✔ state machine
✔ mock controls
### 07.2
✔ real settings
✔ strategy presets
✔ risk presets
### 07.3
✔ analysis cycle skeleton
✔ mock signals
# Stage 04 — Storage / Journal
✔ storage foundation
✔ event log
✔ repositories
✔ UI integration
✔ journal management
07.3.1 auto live
07.3.2 live market/portfolio
07.3.3 multi live + ui optimization
07.3.4 menu redesign
07.3.5 websocket
07.3.6 signal engine
07.3.7 execution
07.3.8 analytics
### 07.4
⏳ strategy plugin architecture
✅ Статус: завершён
---
## Текущий статус
# Stage 05 — Trading UI / Draft / Validation
✔ order draft flow
✔ interactive builder
✔ validation
✔ runtime mode helpers
✔ UI unification
✔ quantity normalization
👉 Stage 03.5 — завершён
👉 Следующий шаг: Stage 04.1
✅ Статус: завершён
---
# Stage 06 — Journal / Navigation / Settings
✔ journal UI
✔ navigation improvements
✔ settings screen
✔ system info
✅ Статус: завершён
---
# Stage 07 — Auto Trading
## 07.1 — Skeleton UI
✔ экран автоторговли
✔ state machine
## 07.2 — Real settings
✔ стратегия
✔ риск
✔ символ
## 07.3 — Analysis Cycle
✔ run_cycle()
✔ mock signals
✔ live updates
### 07.3.1 — Background Runner
✔ asyncio loop
### 07.3.2 — Live Screens
✔ market
✔ portfolio
✔ journal
### 07.3.3 — Multi Live
✔ multi-screen
✔ duplicate protection
### 07.3.4 — Monitoring redesign
✔ новый экран мониторинга
### 07.3.5 — WebSocket probe
✔ ws skeleton
⚠ fallback REST polling
## 07.4 — Strategy Plugin Architecture
### 07.4.1
✔ BaseStrategy
✔ SignalResult
### 07.4.2
✔ Strategy Registry
### 07.4.3
⏳ Trend Strategy
### 07.4.4
⏳ Grid Strategy
### 07.4.5
⏳ Scalping Strategy
### 07.3.6 — Signal Engine
⏳ реальные сигналы
### 07.3.7 — Execution Engine
⏳ исполнение ордеров
### 07.3.8 — Analytics
⏳ статистика торговли
🟡 Статус: в работе
---
# Stage 08 — Analytics / Reports
⏳ отчёты
⏳ pnl
⏳ winrate
⏳ drawdown
⚪ Статус: не начат
---
# Stage 09 — Production Readiness
⏳ deployment
⏳ monitoring
⏳ alerts
⏳ backups
⚪ Статус: не начат
---
## Текущий статус проекта
👉 Завершён: 07.4.1
👉 Следующий шаг: 07.4.2 Strategy Registry

View File

@@ -0,0 +1,66 @@
# Stage 01 — Bootstrap / Foundation Roadmap
## Цель
Создать базовый каркас приложения:
- запуск бота;
- конфигурация;
- логирование;
- bootstrap архитектура.
---
## 01.1 — App bootstrap
✔ структура проекта
✔ main.py
✔ app_factory.py
✔ create_app()
### Результат
✔ приложение запускается через единую точку входа
---
## 01.2 — Config layer
✔ .env подключение
✔ dataclass Settings
✔ load_settings()
✔ bool/int parsers
### Результат
✔ централизованная конфигурация
---
## 01.3 — Logging
✔ setup_logging()
✔ уровни логов
✔ startup logs
### Результат
✔ логирование запуска и ошибок
---
## 01.4 — Router bootstrap
✔ Dispatcher init
✔ setup_routers()
✔ подключение handlers
### Результат
✔ Telegram handlers подключаются централизованно
---
## 01.5 — DB bootstrap
✔ init_schema()
✔ проверка запуска БД
### Результат
✔ база подготавливается при старте
---
## Текущий статус
👉 Stage 01 завершён
👉 Следующий шаг: Stage 02

View File

@@ -0,0 +1,62 @@
# Stage 02 — System / Diagnostics Roadmap
## Цель
Добавить системный слой:
- статус приложения;
- health checks;
- diagnostics UI.
---
## 02.1 — System screen
✔ экран ⚙️ Система
✔ базовая навигация
### Результат
✔ доступ к системной информации
---
## 02.2 — Exchange health
✔ public API health
✔ private API health
✔ status rendering
### Результат
✔ диагностика подключения к бирже
---
## 02.3 — DB health
✔ проверка БД
✔ вывод статуса
### Результат
✔ диагностика базы данных
---
## 02.4 — Runtime info
✔ env
✔ mode
✔ symbol
✔ exchange name
### Результат
✔ отображение runtime параметров
---
## 02.5 — Error rendering
✔ единый UI ошибок
✔ retry actions
### Результат
✔ пользователь видит понятные ошибки
---
## Текущий статус
👉 Stage 02 завершён
👉 Следующий шаг: Stage 03

View File

@@ -4,7 +4,8 @@
Интеграция с биржей:
- public API
- private API
- базовый UI
- WebSocket / fallback polling
- UI мониторинга
---
@@ -12,12 +13,18 @@
✔ имитация данных
✔ структура клиента
### Результат
✔ бот может работать без реальной биржи
---
## 03.2 — Time handling
✔ обработка timestamp
✔ локализация времени
### Результат
✔ корректное локальное время
---
## 03.3 — exchangeInfo
@@ -25,6 +32,9 @@
✔ валидация символа
✔ защита от ошибок API
### Результат
✔ бот знает доступные инструменты
---
## 03.4 — Private auth
@@ -34,6 +44,9 @@
✔ headers
✔ timestamp
### Результат
✔ доступ к private API
---
## 03.5 — Account + Portfolio
@@ -48,28 +61,34 @@
✔ скрытие нулевых балансов
✔ группировка активов
---
## Результат Stage 03
✔ бот умеет:
- получать цену
- валидировать символ
- работать с private API
- получать баланс
- отображать портфель
### Результат
✔ баланс отображается
---
## Ограничения
- нет ордеров
- нет хранения
- нет журнала
- нет стратегии
## 03.6 — Orders
⏳ orders skeleton
⏳ dry-run режим
⏳ валидация ордеров
---
## Следующий шаг
## 03.7 — Market live
✔ live экран 📈 Рынок
✔ polling обновление
✔ multi-screen support
➡ Stage 04 — Storage / Journal
---
## 03.8 — WebSocket
⚠️ исследование API Dzengi
⚠️ найден websocket swagger
⚠️ endpoint не подтверждён
✔ fallback на REST polling
---
## Текущий статус
👉 Завершён: 03.8 (fallback mode)
👉 Следующий шаг: 03.6 Orders

View File

@@ -1,72 +0,0 @@
# Stage 04 — Storage / Journal Roadmap
## Цель
Добавить слой хранения и журналирования.
---
## 04.1 — Storage foundation
Цель:
- подключить БД
- создать базовые модели
Что добавить:
- storage/session.py
- storage/schema.py
- SQLite
Сущности:
- BalanceSnapshot
- JournalEvent
- OrderDraft
---
## 04.2 — Journal / event log
Цель:
- логировать действия бота
Что логировать:
- ошибки API
- запросы
- события системы
---
## 04.3 — Repositories
Цель:
- хранить данные
Добавить:
- repository balance
- repository orders
- repository journal
---
## 04.4 — UI integration
Цель:
- показать storage в интерфейсе
Добавить:
- статус БД в ⚙️ Система
- последние события
- snapshot баланса
---
## Результат Stage 04
✔ данные сохраняются
✔ есть история
✔ есть журнал
---
## Следующий шаг
➡ Stage 03.6 — Orders skeleton

View File

@@ -0,0 +1,47 @@
# Stage 04 — Storage / Journal Roadmap
## Цель
Добавить слой хранения и журналирования.
---
## 04.1 — Storage foundation
✔ подключение БД
✔ schema init
✔ базовые модели
---
## 04.2 — Journal / event log
✔ логирование действий бота
✔ ошибки API
✔ системные события
---
## 04.3 — Repositories
✔ repository balance
✔ repository orders
✔ repository journal
---
## 04.4 — UI integration
✔ статус БД в ⚙️ Система
✔ последние события
✔ snapshot баланса
---
## 04.5 — Journal management
✔ экран 📒 Журнал
✔ пагинация
✔ очистка
✔ экспорт CSV/XLSX
---
## Текущий статус
👉 Stage 04 завершён
👉 Следующий шаг: Stage 05

View File

@@ -0,0 +1,96 @@
# Stage 05 — Trading UI / Draft / Validation Roadmap
## Цель
Реализовать торговый UI:
- draft orders;
- validation;
- runtime modes;
- unified trading UX.
---
## 05.1 — Order Draft Flow
✔ создание draft order
✔ preview before execution
### Результат
✔ ордер проходит через черновик
---
## 05.2 — Interactive Draft Builder
✔ интерактивное редактирование
✔ изменение параметров
### Результат
✔ пользователь может собрать ордер пошагово
---
## 05.3 — Order Validation
✔ валидация symbol
✔ валидация qty
✔ валидация price
### Результат
✔ защита от некорректных ордеров
---
## 05.4 — Runtime Mode Helpers
✔ demo helpers
✔ prod helpers
✔ mode labels
### Результат
✔ разделение DEMO / PROD
---
## 05.5 — Trade UI Unification
✔ унификация экранов торговли
✔ единый стиль
### Результат
✔ консистентный UX
---
## 05.6 — Draft Logic Improvements
✔ улучшение бизнес-логики draft
### Результат
✔ меньше ошибок при подготовке ордера
---
## 05.7 — Draft UI Restructuring
✔ переработка UI черновика
### Результат
✔ более удобный экран
---
## 05.8 — Quantity Normalization
✔ округление qty
✔ step_size support
### Результат
✔ корректный объём ордера
---
## 05.9 — Trading UI Milestone
✔ milestone фиксация
✔ стабилизация интерфейса
### Результат
✔ Stage 05 завершён
---
## Текущий статус
👉 Stage 05 завершён
👉 Следующий шаг: Stage 06

View File

@@ -0,0 +1,49 @@
# Stage 06 — Journal / Navigation / Settings Roadmap
## Цель
Добавить журналирование и системную навигацию.
---
## 06.1 — Journal UI
✔ экран 📒 Журнал
✔ пагинация
✔ export CSV/XLSX
✔ очистка журнала
### Результат
✔ управление журналом через UI
---
## 06.2 — Navigation improvements
✔ переходы между экранами
✔ system navigation
### Результат
✔ улучшенная навигация
---
## 06.3 — System Settings
✔ экран настроек
✔ runtime параметры
### Результат
✔ просмотр текущих настроек
---
## 06.4 — System Info
✔ информация о системе
✔ environment info
### Результат
✔ диагностика приложения
---
## Текущий статус
👉 Stage 06 завершён
👉 Следующий шаг: Stage 07

View File

@@ -0,0 +1,103 @@
# Stage 07 — Auto Trading Roadmap
## Цель
Добавить автоторговлю.
---
## 07.1 — Skeleton UI
✔ экран автоторговли
✔ state machine
✔ mock controls
---
## 07.2 — Real settings
✔ стратегия
✔ риск
✔ символ
✔ presets UI
---
## 07.3 — Analysis Cycle Skeleton
✔ run_cycle()
✔ last_check_at
✔ last_signal
✔ mock signals
✔ UI integration
---
## 07.3.1 — Background Runner
✔ asyncio runner
✔ auto-refresh screen
✔ active screen guard
---
## 07.3.2 — Live Screens
✔ live market
✔ live portfolio
✔ live journal
---
## 07.3.3 — Multi Live
✔ multi-screen update
✔ duplicate protection
---
## 07.3.4 — Menu redesign
✔ новый экран Мониторинг
✔ переработанная навигация
---
## 07.3.5 — WebSocket probe
✔ websocket client skeleton
✔ reconnect logs
✔ fallback REST polling
---
## 07.3.6 — Signal Engine
⏳ реальные сигналы
---
## 07.3.7 — Execution Engine
⏳ исполнение ордеров
---
## 07.3.8 — Analytics
⏳ статистика торговли
---
## 07.4 — Архитектура стратегий
### 07.4.1
✔ BaseStrategy
✔ SignalResult
### 07.4.2
✔ registry стратегий
### 07.4.3
⏳ Trend strategy
### 07.4.4
⏳ Grid strategy
### 07.4.5
⏳ Scalping strategy
---
## Текущий статус
👉 Завершён: 07.4.1
👉 Следующий шаг: 07.4.2

View File

@@ -1,57 +0,0 @@
# Stage 07 — Auto Trading Roadmap
## Цель
Добавить автоторговлю.
---
## 07.1 — Skeleton UI
✔ экран автоторговли
✔ state machine
✔ mock controls
---
## 07.2 — Real settings
✔ стратегия
✔ риск
✔ символ
✔ presets UI
---
## 07.3 — Analysis Cycle Skeleton
✔ run_cycle()
✔ last_check_at
✔ last_signal
✔ mock signals
✔ UI integration
---
## 07.3.1 — Background Runner
✔ asyncio runner
✔ auto-refresh screen
✔ single live auto screen
✔ active screen guard
---
## 07.3.2 — Live Screens
⏳ live market screen
⏳ live portfolio screen
⏳ live journal screen
---
## 07.4 — Strategy plugins
⏳ plugin architecture
⏳ strategy registry
⏳ signal execution

View File

@@ -0,0 +1,122 @@
# 07.4.1 — BaseStrategy + SignalResult
## Цель
Создать базовую архитектуру стратегий:
- единый контракт для стратегий;
- стандартизированный результат сигнала;
- подготовка к расширяемой системе автоторговли.
---
## Проблема
До этого:
- логика сигналов была захардкожена;
- отсутствовала структура стратегий;
- невозможно масштабировать и добавлять новые алгоритмы.
---
## Решение
Введены базовые сущности:
StrategyContext → Strategy → SignalResult
---
## Архитектура
### StrategyContext
Контекст выполнения стратегии:
- symbol — инструмент
- status — режим (RUNNING / OBSERVING)
- risk_percent — риск
---
### BaseStrategy (Protocol)
Контракт стратегии:
analyze(context) → SignalResult
---
### SignalType
Типы сигналов:
- BUY
- SELL
- HOLD
---
### SignalResult
Результат анализа:
- signal — итоговый сигнал
- reason — причина
- confidence — уверенность
- payload — доп. данные
---
### HoldStrategy
Базовая безопасная стратегия:
- всегда возвращает HOLD;
- используется как default;
- предотвращает случайные сделки.
---
## Интеграция
Добавлено в AutoTradeService:
- _build_strategy_context()
- _get_strategy()
- использование strategy.analyze()
---
## Поведение
Теперь:
- каждый цикл вызывает стратегию;
- результат записывается в state:
- last_signal
- last_check_at
---
## Ограничения
- только HOLD стратегия
- нет логирования
- нет execution
---
## Следующий шаг
07.4.2 — Strategy Registry
---
## Итог
✔ введён BaseStrategy
✔ введён SignalResult
✔ реализован HoldStrategy
✔ интеграция с AutoTradeService

View File

@@ -0,0 +1,102 @@
# 07.4.2 — Strategy Registry
## Цель
Создать централизованный реестр стратегий:
- управление стратегиями;
- динамический выбор;
- подготовка plug-in архитектуры.
---
## Проблема
После 07.4.1:
- стратегия захардкожена;
- нет переключения;
- нет масштабируемости.
---
## Решение
Добавлен StrategyRegistry:
AutoTradeService → StrategyRegistry → Strategy
---
## Архитектура
### StrategyRegistry
Хранилище стратегий:
- HOLD
- TREND
- GRID
- SCALP
(пока все = HoldStrategy)
---
### Методы
get(name):
- нормализация имени
- возврат стратегии
- fallback → HOLD
names():
- список доступных стратегий
---
### Интеграция
AutoTradeService:
_get_strategy() → StrategyRegistry.get()
run_cycle:
→ strategy.analyze()
→ state.last_signal
---
## Поведение
Теперь:
- стратегия выбирается через state.strategy
- fallback при ошибках
- все стратегии пока безопасные
---
## Ограничения
- нет реальных стратегий
- нет логирования
- нет execution
---
## Следующий шаг
07.4.3 — Trend Strategy
---
## Итог
✔ добавлен StrategyRegistry
✔ реализован fallback
✔ интеграция с AutoTradeService
✔ подготовка plug-in архитектуры