build 053: remove unused legacy market indicators
This commit is contained in:
@@ -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))
|
||||
271
docs/migrations/build_053.md
Normal file
271
docs/migrations/build_053.md
Normal file
@@ -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`.
|
||||
Reference in New Issue
Block a user