Починка fitness-функции v3
DONE
Fitness теперь учитывает количество сделок: штраф за <10 сделок, потолок PF≤5, бонус log10(N). Убрал перекос в сторону «однократных победителей» (PF=999, DD=0).
- Генетический поиск: 18 триггеров × 15 инструментов
- 1656с прогон, зафиксированный каталог
тесты: 432 / конфиг: data/instrument_catalog.json
Архетипы стратегий v5
DONE
Гипотеза подтвердилась: range-grid + ADX-фильтр выигрывает trend-rotation на большинстве инструментов. Триггер RZ — главный range-сигнал.
- 13/14 → RZ + ADX (режимы range_only / trend_only)
- Суммарный OOS PnL: 28K → 115K (+311%)
- SILV — единственный trend-rotation (UTBOT)
прогон: 887с
Авторские индикаторы v6+v7
DONE
Прогнали 25 авторских/составных индикаторов с TradingView (LazyBear, Ehlers, EmreKb, …). Ноль побед против RZ. Правило strict-improvement дважды спасло SILV.
- v6: 15 авторских триггеров (CHOP, WVF, STC, FRAMA…)
- v7: 10 Editor's Picks (MSB, PPST, OTT, NRTR…)
- Финальный реестр: 58 триггеров
тесты: 472 + 25 / вывод: сложность ≠ обобщаемость
Полный перебор v8 v8
DONE
58 триггеров × 4 режима сетки × 3 ADX-фильтра. Главное открытие: режим сетки влияет так же сильно, как триггер.
- Eu: fix → distribution = +336% OOS
- GAZR/BR: RZ → VWAP revert
- GOLD: fix → asymmetric = +27%
- Суммарный OOS: 116K → 133K (+14.8%)
4-окна WF: 14/14 GREEN, DD=0% на 13/14
Матрица стратегий v2 v8.5
DONE
Финальный каталог с 14 стратегиями. Архитектурно полные: 6 режимов сетки × 58 триггеров.
- 10 Tier 1 (MIX/RTS/Eu/GAZR/SBRF/LKOH/Si/NLMK/GOLD/SILV)
- 4 Tier 2 (BR/NG/CNY/YDEX)
- EquityGuard — страховочный 5% потолок просадки
файлы: catalog.json + strategy_matrix.json
Упаковка + секреты P0.1-2
DONE
«pip install -e .» работает на чистой машине. Все секреты fail-fast — никаких dev-фолбэков.
- tenacity, python-dotenv добавлены в pyproject
- pytest запускается без PYTHONPATH
- Валидаторы Settings: ui_session_secret обязателен
тесты: 566 → 588
Авторизация на все роуты P0.3-4
DONE
require_auth теперь на 5 роутерах (grid/lines/backtest/replay/metrics). Webhook остался на URL-секрете. Интеграционные тесты проверяют 401.
- 19 интеграционных тестов (12 роутов проверено на 401)
- Подделка cookie отклоняется
- /login и /webhook/{secret} остаются открытыми
Целостность БД P1
DONE
UNIQUE на robot_id, baseline-миграция Alembic, умный bootstrap (alembic в prod, create_all в тестах).
- 3 миграции: baseline + ai_calls + market + outcomes
- API возвращает 409 при коллизии robot_id
FinamClient: реальные ордера P0.5
DONE
place_order / cancel_order / get_order через настоящий Trade API. Read-only-предохранитель срабатывает, если ключ только на чтение.
- 14 unit-тестов на форму запроса + валидации
- Decimal-обёртки {value: "..."}
- Маппинг enum'ов Side/Type/TIF
POST /v1/accounts/{id}/orders
DELETE .../orders/{id}
Центр стратегий + арсенал #0
DONE
Просмотр зафиксированного каталога v8.5 (manage.html) + 387 конфигов в арсенале (arsenal.json).
- PaperTradeLoader (каталог → конфиг движка)
- EquityGuard — жёсткий потолок просадки 5%
- AI-роутер (4 провайдера) + учёт расходов
GET /strategies
GET /cus/arsenal
GET /ai/cost
тесты: +38 (арсенал + роутер + потолок стоимости)
Символы + перекладка контрактов #1
DONE
SymbolResolver: голый тикер (MIX) → актуальный символ Finam (MXM6@RTSX). 30/30 подтверждены через реальный API.
- data/symbol_map.json — 30 инструментов
- scripts/verify_symbols.py
- scripts/rollover_symbols.py (авто-перекладка на следующий квартал + верификация)
тесты: 13 (резолвер) + 14 (логика перекладки)
Движок режимов #2
DONE
3-уровневый шедулер: каждые 60с → индикаторы; на смене режима → AI-триаж; раз в час → глубокое ранжирование.
- RegimeClassifier (7 состояний: ADX + CHOP + BBW + DI±)
- Recommender (режим → фильтр арсенала)
- BarSource (Finam + mock)
- 2 новые таблицы (regime_snapshots, recommendations)
GET /cus/dashboard
GET /cus/regime/{ticker}
POST /cus/refresh/{ticker}?tier=N
тесты: 24 (режимы + шедулер) / файл: core/market/scheduler.py
UI ЦУС + календарь + память #3
DONE
Визуальный пульт управления: таблица режимов, лента AI, счётчик расходов. Календарь (ForexFactory + ЦБ РФ). Пользовательская обратная связь + обучение по auto_pnl.
- HTML-страница /cus с авто-обновлением
- tier_2_on_change_only (расходы в 5–10× меньше)
- Таблица RecommendationOutcome (петля обратной связи)
GET /cus/calendar
POST .../feedback
GET /cus/feedback/summary
тесты: +35 (страница + календарь + расходы + память)
Интеграция AI-мозга #4
DONE
Tier-1 от событий (календарь → упреждающий AI), контекст обратной связи в tier-2 промпте, пайплайн Apply, live-push через WebSocket.
- Событие календаря за 30 мин → принудительный tier-1
- AI видит свою историю по каждому тикеру
- Apply: рекомендация → TradingLine (+_applied_recommendation)
- /ws/cus push: regime_change / recommendation / event_flag
WS /ws/cus
POST .../apply
POST .../outcome
тесты: +32 (события + feedback + apply + ws)
Авто-PnL хук в движке #5.1
DONE
Когда закрывается сетка с _applied_recommendation в настройках — автоматически пишется RecommendationOutcome(source='auto_pnl'). Петля обратной связи замкнута.
- Хук _emit_auto_pnl_outcome в GridEngine
- Подключён к close_grid + _maybe_close_grid (оба пути закрытия)
- Идемпотентен: повторный вызов не создаёт дубликат
- Best-effort: ошибки логируются, не блокируют закрытие
тесты: +7 (хук, идемпотентность, no-op-сценарии, интеграция)
Кнопка «Применить» в UI #5.2
DONE
Кнопка «Применить» добавлена к каждой топ-стратегии в панели рекомендаций. Модалка с выбором счёта и переопределением объёма.
- JS: openApplyModal / confirmApply → POST .../apply
- Список счетов подтягивается из /accounts
- Тост в ленте AI: создано / уже применено + line_id + robot_id
тесты: +1 (страница проверяет наличие модалки и JS-хуков)
Кросс-тикер бюллетень #5.3
DONE
BriefingService: один AI-вызов по всему юниверсу → тема + actionable + avoid + рекомендация. Хранится как MarketRecommendation(ticker='_GLOBAL_', tier=3).
- core/market/briefing.py — BriefingService.run_once()
- GET /cus/briefing · POST /cus/briefing/run
- Global score = средняя уверенность; regime_dist = Counter
- Событие WS «briefing»
- Реальный замер: 28/30 инструментов, $0.000427 за бюллетень на DeepSeek
тесты: +9 (агрегация, ошибка AI, broadcast, None-coercion, API)
Telegram-уведомления #5.4
DONE
MarketTelegramAlerter — мост из событий шедулера в Telegram через MultiBroadcaster. WS + Telegram обновляются одновременно. No-op при пустом токене; equity_guard всегда долетает.
- core/alerts/hub.py — MultiBroadcaster (изоляция ошибок per-sink)
- core/alerts/telegram_alerter.py — форматтеры для regime_change / event_flag / briefing / equity_guard_fired
- Белый список по умолчанию (recommendation выключен — слишком шумный)
- Подключено в main.py: шедулер + брифинг → _alert_hub
тесты: +15 (хаб, изоляция ошибок, форматтеры по событиям, no-op-режимы)
LiveFinamBroker — реальный исполнитель #5.6 ★
DONE
LiveFinamBroker реализует ABC брокера через FinamClient. Идемпотентность через client_order_id = id строки в БД. Опрос ордеров каждые 2с, ошибки изолированы per-order.
- broker/live.py — все 8 методов ABC (place / cancel / list_* / on_fill / on_order_update)
- place_order: PENDING → ACTIVE/CANCELLED после ответа Finam, finam_id в комментарии
- _poll_orders_loop: PENDING / ACTIVE / PARTIAL → fills через события Trade
- BROKER_TYPE=live переключает в main.py
тесты: +15 (идемпотентность place/cancel, частичные fills, изоляция ошибок, маппинг статусов Finam)
Live paper-trade — этап A #5.5 ★
DONE
EquityGuardLoop подключён в main.py. Скрипт-пресет этапа A гарантирует консервативную конфигурацию: MIX/RTS/Eu, 5% DD-cap, опрос equity 30с, реальные ордера Finam. Готово к 4 неделям наблюдения.
- core/risk/equity_guard_loop.py — асинхронный poll-цикл с alert_cb + action_cb
- При срабатывании: telegram + WS broadcast + close_grid(close_position=True) для каждой активной сетки
- Гейты EQUITY_GUARD_ENABLED=1 + cap_pct + poll_sec через env
- scripts/start_phase_a.py — лаунчер пресета с pre-flight-проверками
тесты: +12 (poll/arm/fire, изоляция, мульти-счёт, жизненный цикл, observation-only)