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