diff --git a/app/src/trading/market_analysis/indicators_legacy.py b/app/src/trading/market_analysis/indicators_legacy.py deleted file mode 100644 index feb3cef..0000000 --- a/app/src/trading/market_analysis/indicators_legacy.py +++ /dev/null @@ -1,67 +0,0 @@ -# app/src/trading/market_analysis/indicators.py - -from __future__ import annotations - -from src.integrations.exchange.models import Kline - - -def ema(values: list[float], period: int) -> float | None: - if period <= 0 or len(values) < period: - return None - - multiplier = 2 / (period + 1) - current = sum(values[:period]) / period - - for value in values[period:]: - current = (value - current) * multiplier + current - - return current - - -def atr(candles: list[Kline], period: int = 14) -> float | None: - if period <= 0 or len(candles) < period + 1: - return None - - true_ranges: list[float] = [] - - for previous, current in zip(candles, candles[1:]): - high_low = current.high_price - current.low_price - high_close = abs(current.high_price - previous.close_price) - low_close = abs(current.low_price - previous.close_price) - - true_ranges.append(max(high_low, high_close, low_close)) - - if len(true_ranges) < period: - return None - - recent = true_ranges[-period:] - return sum(recent) / period - - -def rsi(values: list[float], period: int = 14) -> float | None: - if period <= 0 or len(values) < period + 1: - return None - - gains: list[float] = [] - losses: list[float] = [] - - recent = values[-(period + 1):] - - for previous, current in zip(recent, recent[1:]): - change = current - previous - - if change > 0: - gains.append(change) - losses.append(0.0) - else: - gains.append(0.0) - losses.append(abs(change)) - - average_gain = sum(gains) / period - average_loss = sum(losses) / period - - if average_loss == 0: - return 100.0 - - rs = average_gain / average_loss - return 100 - (100 / (1 + rs)) \ No newline at end of file diff --git a/docs/migrations/build_053.md b/docs/migrations/build_053.md new file mode 100644 index 0000000..b1762e7 --- /dev/null +++ b/docs/migrations/build_053.md @@ -0,0 +1,271 @@ +# Build 053 — Удаление неиспользуемого indicators_legacy.py + +## Статус + +**Завершён** + +--- + +## Цель Build + +Удалить подтверждённый мёртвый legacy-файл: + +```text +src/trading/market_analysis/indicators_legacy.py +``` + +Файл больше не импортировался и не использовался ни production-кодом, ни тестами. + +Build 053 выполняет только удаление этого файла и не затрагивает compatibility API `ExchangeService.get_klines()` или модели `Kline` и `KlineBatch`. + +--- + +## Исходное состояние + +По результатам Build 052 было подтверждено: + +```text +grep indicators_legacy → пусто +``` + +Файл: + +```text +src/trading/market_analysis/indicators_legacy.py +``` + +содержал legacy-реализацию ATR и зависел от: + +```text +src.integrations.exchange.models.Kline +``` + +При этом активный вычислительный код уже использовал: + +```text +src/trading/market_analysis/indicators/volatility.py +``` + +и каноническую модель: + +```text +src.market_data.acquisition.models.candle.Candle +``` + +--- + +## Объём изменений + +В Build 053 удалён только: + +```text +src/trading/market_analysis/indicators_legacy.py +``` + +Добавлена документация: + +```text +docs/migrations/build_053.md +``` + +Build 053 не изменяет: + +```text +src/integrations/exchange/service.py +src/integrations/exchange/models.py +tests/unit/integrations/exchange/test_service_klines.py +``` + +Build также не удаляет: + +```text +ExchangeService.get_klines() +ExchangeService._kline_from_candle() +Kline +KlineBatch +``` + +--- + +## Предварительная проверка потребителей + +Перед удалением выполнена команда: + +```bash +grep -RIn \ + --exclude-dir="__pycache__" \ + --exclude="*.pyc" \ + "indicators_legacy\|from src\.trading\.market_analysis\.indicators_legacy" \ + src tests +``` + +Результат: + +```text +пусто +``` + +Это подтвердило отсутствие любых потребителей файла. + +--- + +## Выполненное изменение + +Удалён файл: + +```text +src/trading/market_analysis/indicators_legacy.py +``` + +Объём удаления: + +```text +67 строк +``` + +--- + +## Полный regression suite + +После удаления выполнена команда: + +```bash +python -m pytest -q +``` + +Результат: + +```text +805 passed in 2.70s +``` + +Регрессий не обнаружено. + +--- + +## Контроль отсутствия indicators_legacy + +Выполнена команда: + +```bash +grep -RIn \ + --exclude-dir="__pycache__" \ + --exclude="*.pyc" \ + "indicators_legacy" \ + src tests +``` + +Результат: + +```text +пусто +``` + +--- + +## Контроль оставшихся Kline и KlineBatch + +Выполнена команда: + +```bash +grep -RIn \ + --exclude-dir="__pycache__" \ + --exclude="*.pyc" \ + -E "\bKlineBatch\b|\bKline\b" \ + src tests +``` + +Результат показывает, что `Kline` и `KlineBatch` остались только в: + +```text +src/integrations/exchange/service.py +src/integrations/exchange/models.py +``` + +Они используются исключительно для compatibility API: + +```text +ExchangeService.get_klines() +ExchangeService._kline_from_candle() +``` + +--- + +## Проверка форматирования + +Выполнена команда: + +```bash +git diff --check +``` + +Вывод отсутствует. + +Whitespace-ошибок не обнаружено. + +--- + +## Архитектурный результат + +После Build 053 в `Market Analysis` больше не существует legacy-файлов, зависящих от `Kline`. + +Активный вычислительный слой использует только: + +```text +Candle +``` + +Оставшийся legacy OHLCV полностью локализован в compatibility-слое `ExchangeService`. + +--- + +## Что намеренно не выполнено + +Build 053 намеренно не включает: + +- удаление `ExchangeService.get_klines()`; +- удаление `ExchangeService._kline_from_candle()`; +- удаление `tests/unit/integrations/exchange/test_service_klines.py`; +- удаление `Kline`; +- удаление `KlineBatch`; +- изменение Market Analysis; +- изменение Market Data Acquisition; +- изменение торговой логики; +- изменение архитектуры каталогов. + +--- + +## Критерии завершения + +Build 053 считается завершённым, поскольку: + +- потребители `indicators_legacy.py` отсутствуют; +- файл удалён; +- полный test suite проходит; +- grep по `indicators_legacy` пустой; +- `Kline` и `KlineBatch` остались только в compatibility-слое; +- `git diff --check` чистый. + +--- + +## Итог + +**Build 053 завершён успешно.** + +Текущее состояние: + +```text +indicators_legacy.py — удалён +Full test suite — 805 passed +Legacy Kline/KlineBatch — только compatibility-слой +``` + +Следующий этап — удаление compatibility API: + +```text +ExchangeService.get_klines() +ExchangeService._kline_from_candle() +tests/unit/integrations/exchange/test_service_klines.py +``` + +без одновременного удаления самих моделей `Kline` и `KlineBatch`. \ No newline at end of file