# AGENTS.md — MOEX Market Analysis

> Central hub for AI agents. MUST be read FIRST on every session.

---

## About the Project

System for analyzing the Moscow Stock Exchange (MOEX). Includes:
- Technical analysis (indicators, oscillators, levels, volumes, VSA, waves)
- Fundamental analysis (multiples, reporting, macroeconomics, news)
- Supporting Python modules for calculations, forecasting, and visualization
- Integration with T-Bank Invest API (T-Bank, formerly Tinkoff Investments) for current prices and order books

> **⚠️ Важно: полный цикл анализа тикера включает ОБЯЗАТЕЛЬНЫЙ вызов как @tech-analyst (ТА), так и @fund-analyst (ФА).**  
> Вызов только одного субагента (например, только @tech-analyst без @fund-analyst) считается **неполным анализом**.  
> Итоговая рекомендация формируется на основе комбинации ТА + ФА.

## Data Sources

### MySQL Database
- **Host:** `nlbotinterface.ru:3306`
- **DB:** `bitcoin_tickers`
- **User:** `bitcoin` / `g49020007`

### Table Structure
Tables are named according to the pattern `{TICKER}_{TF}`, where TF ∈ `{H1, D1, W1}`.
- `H1` — hourly candles
- `D1` — daily candles
- `W1` — weekly candles

Examples: `SBER_H1`, `SBER_D1`, `SBER_W1`, `GAZP_H1`, `X5_H1`, `BITCOIN_H1`, `EURUSD_H1`.

### Important: the DB stores data not only for MOEX, but also FOREX and cryptocurrencies.
To identify whether a ticker belongs to MOEX, use the `instruments` table or the MOEX ticker list (see `.opencode/skills/moex-tickers/SKILL.md`).

### Candlestick Table Schema
| Field     | Type              | Description                  |
|-----------|-------------------|------------------------------|
| timestamp | BIGINT (PK)       | Unix time of candle open     |
| Date      | VARCHAR(10)       | Date in `YYYY.MM.DD` format  |
| Time      | VARCHAR(5)        | Time in `HH:MM` format       |
| Open      | DECIMAL(20,8)     | Opening price                |
| High      | DECIMAL(20,8)     | Maximum price                |
| Low       | DECIMAL(20,8)     | Minimum price                |
| Close     | DECIMAL(20,8)     | Closing price                |
| Volume    | BIGINT            | Volume                       |

### T-Bank Invest API
- **API key:** `t.wqnyx3rg3L8_P3GUrXXP29SPdebJRvYYD5b_Z5-5PjA1ky5_jJRaQlZRVV6eYe60WxuQBHzUI7RgxJpJskj_8g`
- Used for obtaining current market data, order books, and **текущих свечей W1/D1/H1**
- **REST API v2:** `https://invest-public-api.tinkoff.ru/rest/`
- **FIGI mapping:** `ticker_figi.json`
- **Новые функции (текущие свечи):**
  - `fetch_candles(ticker, tf, count)` — получение последних N свечей из T-Bank API
  - `get_current_candle(ticker, tf)` — получение текущей (незавершённой) свечи
  - `fetch_ohlcv_combined(ticker, tf, limit)` — **рекомендуемая функция**: MySQL (история) + T-Bank (текущая свеча) в одном DataFrame
- Documentation: see `.opencode/skills/tbank-api-reference/SKILL.md`

---

## Memory Protocol (REQUIRED)

**Before performing ANY task, the agent MUST read the current state:**

1. `reports/00-STATE.md` — master file: summary of all tickers, project phase
2. `reports/tickers/{TICKER}.md` — previous analysis for the ticker (if any)
3. `reports/tickers/{TICKER}_orderbook.md` — order book history (if exists and mtime ≤ 120 sec)

**After completing the analysis, the agent MUST update the relevant files:**

| Agent action        | Update file                                  |
|---------------------|----------------------------------------------|
| Tech analysis       | `reports/tickers/{TICKER}.md` (Technical Analysis section) + `reports/00-STATE.md` (table row) |
| Fund analysis       | `reports/tickers/{TICKER}.md` (Fundamental Analysis section) + `reports/00-STATE.md` (table row) |
| Code creation/mod   | `reports/00-STATE.md` (Modules Development section) |
| First ticker analysis | Copy `reports/tickers/_TEMPLATE.md` → `reports/tickers/{TICKER}.md` |

**Detailed protocol:** see `.opencode/skills/state-management/SKILL.md`

---

## Agents

### Speculative Circuit (swing trading, 1–5 days)

#### @tech-analyst
**Purpose:** Speculative technical analysis MOEX (swing trading, 1–5 days).
- Timeframes: H1 (entry point), D1 (trend), W1 (context)
- Target: 2–5% per trade, RR ≥ 2:1, risk 1% per trade
- **Theoretical foundation:** three postulates of TA (Dow Theory), behavioral finance, Rational Analysis (integration with @fund-analyst)
- **Trend classification:** secular / primary / secondary; market top (distribution days) and bottom signals; accumulation/distribution phases
- **Multi-Timeframe:** W1 (50%) → D1 (30%) → H1 (20%), entry only in direction of higher timeframe trend
- **S/R levels:** proactive (Fibonacci, Pivot, VWAP, Market Profile VAH/VAL/POC) + reactive (Volume Profile, swing, gaps); polarity (role reversal), psychological levels
- **Indicators:** trend (EMA/SMA, MACD, ADX, Ichimoku, Parabolic SAR, Vortex, TRIX), oscillators (RSI, Stochastic, CCI, Williams %R, MFI, Ultimate), volume (OBV, A/D, VPT, Force Index), volatility (ATR, Bollinger, Keltner, Donchian), breadth (A/D line, TRIN); divergences
- **Candlestick patterns:** reversal (engulfing, hammer/shooting star, morning/evening star, Harami, Three Soldiers/Crows, Dark Cloud, Piercing, Tweezers), continuation (3-Method, Marubozu, Windows), Heikin-Ashi
- **Chart patterns:** Head & Shoulders, Double/Triple Top-Bottom, Triangles, Flags/Pennants, Wedges, Cup & Handle, Island Reversal, gaps (breakaway/runaway/exhaustion)
- **Volume analysis (VSA):** spread + volume + close; Stopping Volume, Selling/Buying Climax, No Demand, Upthrust, Shakeout, Test
- **Wyckoff Method:** three laws (Supply/Demand, Cause/Effect, Effort/Result); Accumulation/Distribution phases; Spring, UT, SOS, SOW, LPS, LPSY; 7-element schematics; Phase A-E scoring; 9 Buying/Selling Tests; P&F count; Trading Range detection; Market Structure (HH/HL, BOS, CHoCH)
- **Markdown phase (RR improvement tactics):** ⛔ DO NOT short when RSI D1<30 (oversold); 5 entry points (LPSY, Breakdown, Throwback ⭐, Re-distribution, 50% retracement ⭐); 50–61.8% retracement tactic; 9 selling tests (RR≥3:1); UTAD; pyramiding; P&F count for target
- **Order book analysis (T-Bank API):** bid/ask imbalance, walls, spread, bias history
- **Sentiment analysis:** contrarian indicators (PCR, A/D, VIX-proxy) as filter
- **Swing trading strategies:** Triple MA (Elder), Triple Screen, momentum-breakout (Donchian, 52-W high)
- **Risk management:** RR ≥ 2:1, SL behind swing/ATR×1.5, partial TP, trailing, red-flag filters
- Trading signal generation with confidence scoring (baseline threshold 60%)
- **Skill:** `.opencode/skills/spec-tech-analysis/SKILL.md`

#### @fund-analyst
**Purpose:** Speculative fundamental context MOEX.
- Fast catalysts: earnings, dividend cutoff, news, macro events
- Multiples (P/E, P/B, EV/EBITDA, ROE, ROA, DY)
- Assessing news impact on price over days/weeks horizon
- Macro events: Central Bank meeting, statistics, oil, ruble exchange rate
- **Three-level news context (REQUIRED, skill `news-context`):** Level 1 — Company (40%), Level 2 — Sector (30%), Level 3 — Country/SMO (30%). For the "Country" level, always indicate the current phase of the military operation. Country red flags (SDN, delisting, devaluation, SMO escalation) take priority over company/sector positives

---

### Investment Circuit (portfolio, 3–24 months)

#### @invest-tech-analyst
**Purpose:** Investment technical analysis MOEX.
- Timeframes: D1 (primary), W1 (trend), MN (global context)
- Target: find a long-term entry point in the accumulation zone
- Wyckoff phases on W1: Accumulation, Re-accumulation, Distribution
- Strategic levels: multi-year support/resistance
- Annual volume profile, signs of large capital entry
- Dividend gaps as entry points
- Recommendation horizon: 3–24 months

#### @invest-fund-analyst
**Purpose:** Investment fundamental analysis MOEX.
- Fair value assessment: DCF, multiples, dividend model
- Business quality: ROIC vs WACC, competitive advantage (MOAT)
- Debt burden, corporate governance, dividend policy
- Sector analysis: stage, market share, regulatory risks
- Long-term macroeconomics: demographics, deglobalization, energy transition
- **Three-level news context (REQUIRED, skill `news-context`):** Level 1 — Company (25%), Level 2 — Sector (30%), Level 3 — Country/SMO (**45%** — structural discount of Russia is determined by geopolitics). For the "Country" level, always indicate the current phase of the military operation and sanctions trajectory. Country red flags (SDN, delisting, reserve freeze, SMO escalation) limit recommendation to no higher than HOLD regardless of business quality
- Recommendation horizon: 1–5 years

### @python-modules-dev
**Purpose:** Development of supporting Python modules.
- Implementation of indicators and oscillators (TA-Lib, pandas-ta, custom)
- Modules for database operations (loading, caching, aggregation)
- Preprocessing and feature engineering functions
- Visualization utilities (charts, heat maps, equity curves)
- Integration with T-Bank API
- Statistical and ML modules for improving forecasts

### @wyckoff-analyst
**Purpose:** Rule-based Wyckoff phase analysis for MOEX tickers (H1/D1/W1).
- Deterministic `WyckoffLabeler` from `src.ml.data.wyckoff_labeling` (go-wyckoff spec)
- Multi-timeframe phase detection: W1 (strategic), D1 (tactical), H1 (entry)
- Market Structure: HH/HL, LH/LL, BOS, CHoCH
- Event detection: SC, BC, AR, ST, Spring, UT, SOS, SOW, LPS, LPSY
- Phase A-E weighted scoring with confidence calibration
- 9 Buying Tests and 9 Selling Tests for trade readiness assessment
- Trading Range detection via pivot clustering
- P&F Count for target projection (Cause → Effect)
- Re-accumulation and Re-distinction detection
- **Does NOT generate SL/TP/entry signals** — feeds into @tech-analyst for final signal
- **Skill:** `.opencode/skills/wyckoff-analysis/SKILL.md`

### @db-review
**Purpose:** Review of SQL queries, DB schema verification.

### @trade-executor
**Purpose:** Execution of trades via T-Bank API.
- 🔴 **Before ANY operation with T-Bank API, asks the user for environment: sandbox (test) or real (live account)**
- Remembers the selected environment for the session, does not re-ask
- Switches `set_tbank_env('sandbox'|'real')` in `src.api.tbank`
- Retrieves ready signal from `reports/tickers/{TICKER}.md` or manual parameters
- Validation: confidence ≥ 60%, correct SL/TP, direction
- Position sizing: 1% risk for speculative, 3% for investment
- Limit order (entry) + stop-loss + take-profit
- Rounding to MOEX tick size, accounting for lot size
- User confirmation before sending order
- In sandbox — warning about test environment; in real — warning about real money

---

### Neural Network Circuit (ML-driven analysis)

#### @nn-tech-analyst
**Purpose:** Neural network technical analysis MOEX.
- Inference with trained NN models (LSTM, GRU, Transformer, CNN, TCN)
- Multi-timeframe NN inference (H1, D1, W1) with `MultiTimeframeFusion` architecture
- Ensemble prediction with multiple models (soft/hard voting, weighted)
- **Integration with traditional TA:** NN signal as primary, TA as validation filter
  - NN + TA agree → confidence +15%
  - NN + TA conflict → HOLD + investigation flag
- Confidence calibration (temperature scaling)
- Model drift monitoring (ModelMonitor)
- Signal generation with confidence scoring (baseline threshold 60%)
- **Skill:** `.opencode/skills/nn-architecture/SKILL.md`
- **Skill:** `.opencode/skills/nn-data-preparation/SKILL.md`
- **Skill:** `.opencode/skills/nn-training-methodology/SKILL.md`

#### @nn-data-engineer
**Purpose:** Data preparation for neural network training.
- Feature engineering pipeline: price features (returns, OHLC ratios, log returns), indicator features (TA-Lib), calendar features (day of week, month, session)
- PyTorch Dataset classes: `TimeSeriesDataset` (single TF), `MultiTimeframeDataset` (H1/D1/W1 fusion), `MultiHorizonDataset`, `WalkForwardDataset`
- Data quality monitoring: missing values, outliers, class balance, chronological order
- Normalization: Z-score with train-only fitting to prevent data leakage
- Temporal train/val/test split (chronological, no shuffle)
- Sequence creation: sliding window with configurable lookback (20–120 bars)
- Data augmentation: Gaussian noise, time warping, mixup for time series
- Feature store for caching computed features
- Class imbalance handling: weighted loss, adaptive sampling
- Feature selection: mutual information, correlation, variance-based ranking
- **Skill:** `.opencode/skills/nn-data-preparation/SKILL.md`

#### @nn-trainer
**Purpose:** Training and validation of neural network models.
- Model definition: LSTM (`LSTMPredictor`), GRU (`GRUPredictor`), CNN-1D (`CNN1DPredictor`), TCN (`TCNPredictor`), Transformer (`TimeSeriesTransformer`), Multi-Task (`MultiTaskPredictor`), Autoencoder (`MarketAutoencoder`), Multi-TF Fusion (`MultiTimeframeFusion`)
- Training pipeline: AdamW optimizer, cosine annealing scheduler, gradient clipping, AMP mixed precision
- Hyperparameter optimization with Optuna (Bayesian search, 50+ trials)
- Walk-forward validation (simulates real trading conditions)
- Custom loss functions: Sharpe ratio loss, profit maximization loss, focal loss, quantile loss
- Regularization: dropout (0.1–0.5), weight decay, label smoothing, mixup
- Model Zoo management via `ModelRegistry` (register, search, archive, compare)
- Model export for inference (weights + normalizer + config + features)
- Model monitoring: accuracy drift detection, confidence calibration tracking
- Backtest metrics: Sharpe ratio, win rate, max drawdown, total return, number of trades
- **Skill:** `.opencode/skills/nn-architecture/SKILL.md`
- **Skill:** `.opencode/skills/nn-training-methodology/SKILL.md`

---

## Database Connection (Python)

```python
import mysql.connector
from src.db.connection import fetch_ohlcv, fetch_ohlcv_combined

DB_CONFIG = {
    "host": "nlbotinterface.ru",
    "port": 3306,
    "database": "bitcoin_tickers",
    "user": "bitcoin",
    "password": "g49020007",
    "autocommit": True,
    "charset": "utf8mb4",
}

conn = mysql.connector.connect(**DB_CONFIG)

# Loading OHLCV (только MySQL)
def fetch_ohlcv(ticker: str, tf: str, limit: int = 100):
    table = f"{ticker}_{tf}"
    cursor = conn.cursor()
    cursor.execute(
        f"SELECT timestamp, Date, Time, Open, High, Low, Close, Volume "
        f"FROM `{table}` ORDER BY timestamp DESC LIMIT %s",
        (limit,),
    )
    return cursor.fetchall()

# ⭐ РЕКОМЕНДУЕМЫЙ СПОСОБ: MySQL (история) + T-Bank API (текущая свеча)
def fetch_ohlcv_combined(ticker: str, tf: str, limit: int = 200):
    """
    Комбинированная загрузка: история из MySQL + текущая свеча из T-Bank API.
    Автоматически заменяет последнюю свечу БД на актуальную из T-Bank,
    включая незавершённую свечу текущего периода.
    """
    return fetch_ohlcv_combined(ticker, tf, limit=limit)
```

## Ticker Lists (Script-Generated, NOT Hardcoded)

**⚠️ ВАЖНО: Списки тикеров НЕ хранятся хардкодом в AGENTS.md или других файлах агентов.**

Все списки формируются **динамически через скрипты**:

| Список | Откуда берётся |
|--------|---------------|
| Все тикеры в БД | `get_available_tickers()` из `src.db.connection` — запрос `SHOW TABLES` к MySQL |
| MOEX-тикеры | Функция `classify_ticker()` в `_analyze_all_db.py` — определяет по множеству MOEX_TICKERS_SET (единственное место, где он задан) |
| Топ-N рекомендаций | Формируется **только после прогона @tech-analyst** по всем тикерам, на основе вердиктов и confidence |
| Сводные таблицы | Генерируются в `reports/00-STATE.md` автоматически субагентами |

**Правило:** Если нужно получить список тикеров — используй `get_available_tickers()` из БД. Если нужно отфильтровать MOEX — используй `classify_ticker()` из скрипта. Никогда не хардкодь списки в файлах агентов.

---

## Project Structure

```
Market Analisys/
  opencode.json             ← OpenCode configuration
  AGENTS.md                 ← This file — instructions for all agents
  ticker_figi.json          ← MOEX Ticker → FIGI mapping
  .env                      ← Credentials, tokens, commissions (DO NOT commit)
  reports/                  ← Analysis memory (auto-updated by agents)
    00-STATE.md             ← State master file
    trades.json             ← Trade journal
    tickers/
      _TEMPLATE.md          ← Per-ticker file template
      {TICKER}.md           ← Current ticker analysis
      {TICKER}_orderbook.md ← Order book monitor (OrderBookMonitor)
  .opencode/
    agents/                 ← Subagent definitions (prompt files)
      tech-analyst.md
      fund-analyst.md
      invest-tech-analyst.md
      invest-fund-analyst.md
      trade-executor.md
      python-modules-dev.md
      db-review.md
      nn-tech-analyst.md
      nn-data-engineer.md
      nn-trainer.md
    skills/                 ← Skills — reference information for agents
      db-schema-reference/
      tbank-api-reference/
      moex-tickers/
      indicators-library/
      spec-tech-analysis/
      spec-fund-analysis/
      invest-tech-analysis/
      invest-fund-analysis/
      wyckoff-analysis/     ← Comprehensive Wyckoff method (phases, events, P&F, scoring)
      news-context/         ← Three-level news context (Company/Sector/Country-SMO)
      nn-architecture/      ← Neural network architectures skill
      nn-data-preparation/  ← Data preparation for NN skill
      nn-training-methodology/  ← NN training methodology skill
      nn-architecture/      ← Neural network architectures skill
      nn-data-preparation/  ← Data preparation for NN skill
      nn-training-methodology/  ← NN training methodology skill
      python-code-standards/
      state-management/
  src/                      ← Source code
    db/                     ← Database modules
    indicators/             ← Indicators and oscillators
    analysis/               ← Technical and fundamental analysis
    api/                    ← T-Bank API integration
      tbank.py              ← T-Bank API client, orders, commissions
      orderbook_monitor.py  ← Order book monitoring
      trade_journal.py      ← Trade journal
    ml/                     ← Machine learning / neural networks
      __init__.py
      models/               ← NN model definitions (LSTM, GRU, Transformer, CNN)
        registry.py         ← ModelRegistry class
        saved/              ← Exported model files
      features/             ← Feature engineering pipeline
      data/                 ← Dataset classes, quality checks
      train/                ← Training pipeline, hyperopt, backtest
      inference/            ← Inference, monitoring, explainability
    utils/                  ← Utility modules
      config.py             ← .env reading
      market_time.py        ← MOEX time, sessions, days of week
```

## Conventions

- Code: Python 3.10+, PEP 8, type hints
- Comments and docstrings in Russian
- DB data not cached in repository (.gitignore: `*.csv`, `data/`)
- **Credentials and commissions in `.env`** (tokens, passwords, commission percentages). Reading via `from src.utils.config import config`. Do NOT commit `.env`.
- Commissions: TBANK_COMMISSION_PCT and MOEX_EXCHANGE_FEE_PCT variables in `.env`

---

## ⚠️ Global Rule: SEQUENTIAL Agent Execution

**ALL subagent/agent calls MUST be SEQUENTIAL (not parallel).**

This applies to:
- Any commands in `opencode.json` where `template` calls multiple `@agent`
- Any implicit agent calls within prompts
- Batch ticker processing (`batch-analyze`)
- Combined reports (`full-report`, `invest-report`)

**Rule:** If a task requires calling multiple agents — they run **strictly one at a time**:
1. FIRST agent → **WAIT for full completion**
2. THEN second agent → **WAIT for full completion**
3. And so on...

**FORBIDDEN:** running multiple agents simultaneously (in parallel), even if they are independent.

**Reason:** agents read and write shared memory files (`reports/00-STATE.md`, `reports/tickers/{TICKER}.md`). Parallel execution causes write conflicts and data loss.

---

## 🚨 X5 Post-Mortem (2026-07-01): Критические уроки для всех агентов 

> После 4 убыточных BUY-сделок по X5 (−2,594₽) внесены жёсткие правила.

### Корневые причины убытков
1. **W1↓ тренд проигнорирован** — все 4 сделки были BUY в W1↓. Ни одной SELL-сделки.
2. **MACD D1 crossover не состоялся** — вход на "почти crossover" (−2.5 hist), hist не пересёк ноль.
3. **Trading Range (TR) определён неверно** — скрипт: 2,522, реальность: 2,259.
4. **Backup volume завышен** — 29-38% от SOS (норма <30%).
5. **OrderBook bias переоценён** — snap бычий, но история 20 тиков медвежья.
6. **Pre-div rally не сработал** — в медвежьем рынке (IMOEX↓ 2,300) дивиденд не гарантирует роста.

**Детали:** см. `reports/x5_post_mortem.md` и `.opencode/skills/spec-tech-analysis/SKILL.md` (секция "X5 Post-Mortem").

---

## ⚠️ Global Rule: ALL Analysis MUST Use Subagents (Not Just Scripts)

**ЛЮБОЙ анализ тикера ОБЯЗАТЕЛЬНО должен выполняться через специализированного субагента. Запуск Python-скриптов (`_analyze_all_db.py` и аналогичных) НЕ заменяет вызова субагента.**

### Какие субагенты за что отвечают

| Тип анализа | Субагент | Навык |
|-------------|----------|-------|
| Спекулятивный технический (H1/D1/W1) | `@tech-analyst` | `spec-tech-analysis` |
| Инвестиционный технический (D1/W1/MN) | `@invest-tech-analyst` | `invest-tech-analysis` |
| Спекулятивный фундаментальный | `@fund-analyst` | `spec-fund-analysis` |
| Инвестиционный фундаментальный | `@invest-fund-analyst` | `invest-fund-analysis` |
| Вайкофф-фазы (правила) | `@wyckoff-analyst` | `wyckoff-analysis` |
| Нейросетевой анализ | `@nn-tech-analyst` | `nn-architecture` + `nn-training` |
| Разработка модулей | `@python-modules-dev` | `python-code-standards` |
| Исполнение сделок | `@trade-executor` | — |

### Почему это важно
- Python-скрипт даёт **грубую автоматическую оценку** (линейные формулы, фиксированные пороги). Он **не учитывает**:
  - Контекст рынка (фаза Вайкоффа, 9 тестов на продажу, Spring/Shakeout)
  - Анализ стакана (T-Bank API) с историей изменений
  - Паттерны свечного анализа (утренняя/вечерняя звезда, харами и т.д.)
  - Дивергенции RSI/Stoch/CCI на нескольких ТФ
  - Графические паттерны (H&S, двойное дно, флаги)
  - Противоречия ТФ (W1↓ не даёт шортить при D1↓)
  - Конфликт ТА vs ФА (ФА ≥ 60% снижает противоположный ТА на 20%)
- **Живой субагент** загружает специализированный навык, анализирует все аспекты и выносит взвешенный вердикт

### Правила

1. **Скрипт (Python-код) — только вспомогательный инструмент.** Он может:
   - Собрать данные из БД и T-Bank API
   - Быстро рассчитать индикаторы для всех тикеров (первичный скрининг)
   - Предоставить сырые данные для субагента (RSI, ADX, MACD и т.д.)

2. **Финальный вердикт по каждому тикеру выносит ТОЛЬКО профильный субагент.** Даже если скрипт дал SELL 60% — @tech-analyst может пересмотреть его в HOLD.

3. **Скриптовый анализ НЕ сохраняется в `reports/tickers/{TICKER}.md`.** Этот файл обновляется ТОЛЬКО субагентом после полного цикла анализа.

4. **Для batch-анализа (полный цикл):** сначала запустить скрипт (data collection), затем для каждого тикера **последовательно**:
   - Вызвать `@tech-analyst` (технический анализ) — **ОБЯЗАТЕЛЬНО**
   - Вызвать `@fund-analyst` (фундаментальный анализ) — **ОБЯЗАТЕЛЬНО**
   - Каждый вызов дожидается полного завершения предыдущего
   - Финальный вердикт формируется на основе ТА + ФА

5. **Вспомогательные модули** (`src/indicators/`, `src/analysis/`) — расширяют возможности субагента, но не заменяют его.

### Как это выглядит на практике

```
ПОЛНЫЙ ЦИКЛ (ПРАВИЛЬНО):                НЕПОЛНЫЙ ЦИКЛ (НЕПРАВИЛЬНО):
1. Запустить скрипт                      1. Запустить скрипт
   (сбор данных/расчёт)                      (анализ)
2. Для КАЖДОГО тикера:                   2. Вызвать ТОЛЬКО @tech-analyst
   a. @tech-analyst (ТА) ⏳                 (без фундаментального)
   b. @fund-analyst (ФА) ⏳              3. Сохранить результат скрипта
   c. Обновить {TICKER}.md                  как финальный вердикт
3. Обновить 00-STATE.md                  4. Пропустить вызов субагентов
   (сводка ТА + ФА)
```

**Пример правильной последовательности для batch-анализа тикера TICKER:**
```
Шаг 1: Запустить _analyze_all_db.py (сбор данных)
Шаг 2: @tech-analyst для TICKER → ждём завершения, получаем вердикт ТА
Шаг 3: @fund-analyst для TICKER → ждём завершения, получаем вердикт ФА
Шаг 4: Обновить reports/tickers/{TICKER}.md (ТА + ФА) и 00-STATE.md
```

### Исключения
- Если субагент недоступен — можно временно использовать скрипт, но в отчёте пометить `⚠️ Анализ без {субагент} (аварийный режим)` и confidence снижается на 50%
- Для инвестиционного анализа: `@invest-tech-analyst` + `@invest-fund-analyst`
- Для Rule-based Вайкоффа используется `@wyckoff-analyst`, который передаёт результаты `@tech-analyst` для финального сигнала
