# SKILLS.md | Python VSA Backtester (MOEX D1/H1)

## 🎯 Назначение
Архитектурная спецификация для разработки алгоритмической стратегии Volume Spread Analysis на Московской бирже. Реализуется строго на Python 3.10+ через пошаговые запросы в OpenCode.

## 🗄️ Конфигурация БД
- Движок: MySQL/MariaDB
- Подключение: через `python-dotenv` + `SQLAlchemy` или `PyMySQL`
- Имена таблиц: `{TICKER}_{TF}` (пример: `PLZL_H1`, `SBER_D1`)
- Структура столбцов:
  - `timestamp` (bigint, PK) — Unix epoch
  - `Date` (varchar) — формат `YYYY-MM-DD`
  - `Time` (varchar) — формат `HH:MM`
  - `Open, High, Low, Close` (decimal)
  - `Volume` (bigint)
- Динамический запрос: модуль загрузки должен конструировать имя таблицы из тикера и таймфрейма.

## 🧩 Модули и Ответственности
1. `config/` — парсинг `.env`, валидация параметров, хранение констант.
2. `db/` — pool соединений, контекстный менеджер, универсальный `fetch_ohlcv(ticker, tf, start, end)`.
3. `core/data_loader.py` — загрузка D1/H1, очистка NaN, сортировка по `timestamp`, расчет скользящих.
4. `core/vsa_engine.py` — детекция уровней поддержки/сопротивления, фильтрация VSA-сигналов (объем, спред, закрытие, подтверждение).
5. `core/risk_manager.py` — калькулятор позиции, расчет SL/TP по RR 1:2, учет комиссий/проскальзывания.
6. `backtest/engine.py` — векторный или событийный симулятор, журнал сделок, проверка фильтров сессии.
7. `backtest/metrics.py` — расчет WinRate, Profit Factor, Max Drawdown, Avg RR, Equity Curve.
8. `tests/` — юнит-тесты для VSA-условий, расчета позиции и граничных случаев.

## 📐 Правила VSA (количественные прокси)
- `Volume Spike`: `Vol > SMA(Vol, 20) * 1.5`
- `Spread Normal`: `(High - Low) >= SMA(High - Low, 20)`
- `Rejection Long`: `Low < Level` AND `Close > Low + 0.66*(High - Low)`
- `Rejection Short`: `High > Level` AND `Close < High - 0.66*(High - Low)`
- `Confirmation`: следующий бар закрывает выше/ниже середины сигнального бара.
- Тренд D1: `Close_D1 > SMA(50)` → только Long, иначе Short.

## 📊 Risk-Reward & Управление
- Риск: 1% от текущего капитала.
- SL: `min(сигнальный бар, локальный экстремум) ± 0.15%`
- TP: `Entry ± (SL_distance * 2.0)`
- Частичное закрытие: 50% на `1.5R`, перенос SL в BE, остаток на `2R`.
- Фильтр сессии: `10:00–18:25 МСК`. Закрытие позиций перед закрытием биржи.

## ✅ Критерии приемки (Acceptance Criteria)
- [ ] Загружаются корректные D1/H1 данные без дубликатов по `timestamp`
- [ ] VSA-сигналы генерируются только при совпадении всех 4 условий
- [ ] Размер позиции всегда ≤ 1% капитала, SL/TP корректно округляются до шага цены
- [ ] Бэктест выводи�� CSV/JSON журнал сделок и график эквити
- [ ] Все модули покрыты unit-тестами с покрытием >80%
- [ ] Код соответствует PEP8, типизирован, логирование через `loguru`