WAMCOS — математика и логика торговли

Документ для оператора и аналитика: как система принимает решения и считает уровни. Без инфраструктуры, API и листингов кода. Полная архитектура — в canvas.md.


1. Роль системы

Автоматическая торговля бессрочными SWAP на OKX (в т.ч. demo). Источники сигналов — RSS (вкладка «Новости»), Telegram MTProto (live-каналы) и RSSHub (локальный контейнер, username каналов в TG Sentinel, без MTProto). Языковая модель даёт только тональность; цены входа, стопа и объёма считаются детерминированно.

Выход LLM Диапазон Смысл
Score −1 … +1 Медвежий … бычий
Confidence 0 … 1 Уверенность модели

Направление сделки (после всех фильтров): Score ≥ 0 → лонг (Buy); Score < 0 → шорт (Sell).

1.1. Режимы инициации сделок

Переключатель в админке: execution.trading_strategy_mode (default event_driven).

Режим UI Кто инициирует сделку
Event-Driven Core ⚡ Импульсный скальпинг Новость (RSS/TG/RSSHub) после LLM → полный конвейер
Trend-Validation Smart 📊 Контекстный контр-тренд Рынок (RSI + канал на снапшоте); новости только для AI-veto

В режиме trend_validation новости по-прежнему собираются и анализируются LLM в news_cache, но после AI не вызываются Risk Gate / MarketAnalyzer / ордер по новости. Торговля — только цикл MARKET_TRIGGER (см. § 2.2).

1.2. Ручная торговля (оператор)

Два независимых слоя на вкладке Admin «Ручная торговля»:

Слой Что делает Конвейер
Ask AI Vision («Спросить у ИИ») Советник: Vision 5.6 — PNG + OHLC 15m/1H, индикаторы (ATR%), compression, деривативы, стакан, макро 4H (EMA distance) → рекомендации в форму Без Risk Gate 1–8, без авто-ордера; см. § 7.5
Manual Open (LONG/SHORT) Реальная сделка на бирже Без LLM и Risk Gate 1–8; kill-switch + preflight маржи; см. § 7.4

Оператор задаёт пару, side, тип ордера (Market / Limit / PostOnly), объём USD, плечо, режим маржи (cross/isolated), стоп (% или дефолт пары). Расчёт контрактов и стопа — те же формулы, что в § 5 и § 6; для Market базовая цена — last (тикер), для Limit/PostOnly — введённая limit_price.


2. Конвейер решения

2.1. Event-Driven Core (по умолчанию)

flowchart TD
    N[Новость RSS или TG] --> K{Ключевые слова?}
    K -->|нет| Skip[Пропуск]
    K -->|да| H[Дедуп по hash]
    H --> AI[LLM: score, confidence]
    AI --> G[Risk Gate 1–8]
    G -->|отказ| Skip
    G --> M[MarketAnalyzer 9–11]
    M -->|вето| Skip
    M --> E[Расчёт входа и объёма]
    E --> O[Лимит на бирже + SL]
    O --> Gd[Guardian: fill / TTL / kill-switch]

Одна новость может дать сигнал на несколько пар из списка execution.pairs[] (у каждой свои keywords и параметры). Вход по паре (hash новости, symbol)не более одного раза (news_trade_dispatches + pending в одной транзакции до PlaceOrder).

2.2. Trend-Validation Smart

flowchart TD
    T[Каждые N мин] --> S[Снапшот пары]
    S --> TR{RSI и channel_pos?}
    TR -->|нет| Log[Лог опроса + rsi/ch]
    TR -->|long/short| NW[Новости за окно H ч]
    NW --> V{AI veto JSON}
    V -->|veto| Skip[Пропуск]
    V -->|ok| I[Infra Risk 1–2,5–7]
    I -->|ok| E[ExecuteSignal mkt:]
    E --> Gd[Guardian как обычно]
Шаг Условие / действие
Триггер long RSI14_15M < market_trigger_rsi_oversold (25) и channel_pos < market_trigger_channel_low (0.15)
Триггер short RSI > overbought (75) и channel_pos > channel_high (0.85)
Снапшот Не старше 10 мин; иначе пара в логе как stale
AI-veto Массив новостей из news_cache за validation_news_window_hours (3); пустое окно → без LLM, veto=false
Risk Только инфраструктура: kill-switch, trading, слоты, daily loss, cooldown — без порогов score/confidence
Объём База 1.0; нет матрицы RSI×канал; есть BTC-поводырь: long при BTC BEARISH → ×0.5
Идемпотентность content_hash вида mkt:{symbol}:{side}:{time_bucket}; event-driven и market пути взаимно блокируются в execution

Параметры: market_trigger_poll_interval_min (5), пороги RSI/канала — в execution.*. Формулы RSI/канала — общий пакет internal/pkg/math (тот же расчёт, что у MarketAnalyzer).

Источник Что хэшируется
RSS (News) Нормализованный заголовок
Telegram MTProto Полный очищенный текст сообщения
RSSHub (TG Sentinel) Полный очищенный текст поста (как MTProto)

3. Risk Gate — проверки 1–8

Все условия обязательны по порядку. При нарушении любого — ордер не выставляется.

Условие Параметр (типично) При отказе
1 Kill-switch выключен system.kill_switch Блок
2 Торговля включена system.trading_enabled Блок
3 Уверенность LLM ai_brain.min_confidence0.6 Блок
4 Сила сигнала (серая зона) |score| ≥ risk.sentiment_threshold (0.55) Блок; side не назначается
5 Глобальный лимит слотов open + pending < max_open_positions Блок
5b Лимит на пару open + pending по symbol < max_positions_per_symbol (1) Блок
6 Дневной убыток (UTC) Σ realized_pnl_usd − fee buffer (0.06% taker × entry+exit notional на сделку) > −max_daily_loss_usd Блок + trading_enabled=false до /resume
7 Cooldown по паре cooldown_minutes после closed_at; при убытке × loss_cooldown_multiplier (3) Блок
8 Направление score ≥ 0 → Buy, иначе Sell

Дополнительно перед ордером: preflight доступной USDT-маржи. Для SWAP код оценивает initial margin как notional / risk.swap_leverage × (1 + margin_buffer_pct%) (default leverage 10, buffer 5%), а не требует весь notional. Перед PlaceOrder для SWAP вызывается OKX POST /account/set-leverage (risk.swap_leverage, cross); при ошибке API — fail-closed (ордер не выставляется).


4. MarketAnalyzer — проверки 9–11

Выполняется после Risk Gate. Может запретить сделку или уменьшить/увеличить объём (VolumeMultiplier ∈ [0.5 … 1.25]).

4.1. Свежесть данных (шаг 9)

Снапшот рынка не старше 10 минут. Иначе — отказ stale_market_data.

Данные обновляются фоном каждые 5 мин (свечи 4H и 15M с биржи).

4.2. Индикаторы в снапшоте

Индикатор Таймфрейм Период Назначение
EMA200 4H 200 свечей Глобальный тренд пары
Регрессионный канал 4H 100 close Положение цены в канале (0 = низ, 1 = верх)
Фибоначчи 4H 100 H/L Уровни 38.2%, 50%, 61.8% (Golden Pocket)
RSI 15M 14, Уайлдер Локальная перекупленность/перепроданность
BTC / ETH trend 4H EMA200 Поводыри для альтов

EMA 200

Регрессионный канал (100 свечей)

Линейная регрессия \(y = a x + b\), где \(x = 1..100\), \(y_i\) — close.

\[ a = \frac{N\sum xy - \sum x \sum y}{N\sum x^2 - (\sum x)^2}, \quad b = \frac{\sum y - a\sum x}{N} \]

Стандартное отклонение остатков \(\sigma\). На текущей свече (\(x = N\)):

\[ \text{Base} = aN + b,\quad \text{ChannelHigh} = \text{Base} + 2\sigma,\quad \text{ChannelLow} = \text{Base} - 2\sigma \]

\[ \text{ChannelPos} = \mathrm{clamp}\left(\frac{\text{Price} - \text{ChannelLow}}{\text{ChannelHigh} - \text{ChannelLow}},\, 0,\, 1\right) \]

Направленный Фибоначчи

За 100 свечей: SwingHigh = max(high), SwingLow = min(low), Range = SwingHigh − SwingLow.

Тренд Уровень X (0.382 / 0.5 / 0.618)
BULLISH (коррекция вниз, зона покупки) \(Fibo_X = SwingHigh - Range \cdot X\)
BEARISH (отскок вверх, зона шорта) \(Fibo_X = SwingLow + Range \cdot X\)

RSI 14 (Уайлдер)

\(\Delta_t = Close_t - Close_{t-1}\). За первые 14 изменений — средние gain и loss. Далее:

\[ \overline{Gain}_t = \frac{13 \cdot \overline{Gain}_{t-1} + gain_t}{14}, \quad \overline{Loss}_t = \frac{13 \cdot \overline{Loss}_{t-1} + loss_t}{14} \]

\[ RS = \frac{\overline{Gain}}{\overline{Loss}}, \quad RSI = 100 - \frac{100}{1 + RS} \]

Если \(\overline{Loss} = 0\) → RSI = 100.

4.3. Тренд пары и поводыри (шаг 10)

Ситуация Результат
Шорт при тренде альта BULLISH (4H EMA200) Полный запрет (counter_trend_short) — негативная новость против локального ап-тренда
BTC BEARISH + тренд альта BEARISH + лонг Полный запрет (btc_bearish_block)
BTC BEARISH + лонг Нужны |score| ≥ 0.75 и confidence ≥ 0.75; иначе отказ. Иначе объём ×0.5
BTC BEARISH + шорт + тренд альта BEARISH Объём ×1.25 (не выше cap 1.25)
BTC BEARISH + шорт при BULLISH альте Уже отклонён counter_trend_short
ETH BEARISH + пара помечена eth_correlated Эффективный порог score = sentiment_threshold + 0.10 (напр. 0.55 → 0.65)

4.4. Матрица объёма RSI × канал (шаг 11)

Для лонга — таблица ниже. Для шорта перед таблицей: \(RSI' = 100 - RSI\), \(Pos' = 1 - ChannelPos\).

Зона RSI Доля объёма ChannelPos Доля объёма
A — идеал < 30 100% < 0.30 100%
B — норма 30 … 50 75% 0.30 … 0.60 75%
C — риск 50 … 70 50% 0.60 … 0.80 50%
D — вето ≥ 70 0% ≥ 0.80 0%

Итог: сначала применяются BTC/ETH-правила, затем BTC-множитель умножается на min(доли по RSI, доли по каналу) и результат clamp'ится в диапазон 0.5 … 1.25. Достаточно одного фактора зоны D для полного вето. Пример: bearish BTC + bearish альт + Sell даёт базово 1.25; если RSI/канал дают 0.75, итоговый множитель будет 0.9375, а не 0.75.


5. Расчёт цены входа и стопа

От текущей рыночной цены \(P_{mkt}\) (тикер в момент сигнала). Параметры — на пару: entry_offset_pct, stop_loss_pct, trailing_pct.

Обозначения: \(o = entry\_offset\_pct / 100\), \(s = stop\_loss\_pct / 100\).

Лонг (Buy)

\[ P_{entry} = P_{mkt} \cdot (1 - o) \] \[ P_{stop} = P_{entry} \cdot (1 - s) \]

Шорт (Sell)

\[ P_{entry} = P_{mkt} \cdot (1 + o) \] \[ P_{stop} = P_{entry} \cdot (1 + s) \]

Пример (лонг)

\(P_{mkt} = 5.40\), offset 0.1%, stop 1.5%:

Уровень Расчёт Значение
Вход \(5.40 \times (1 - 0.001)\) 5.394
Стоп \(5.394 \times (1 - 0.015)\) 5.313

Пересчёт стопа после fill (Guardian)

Лимитный вход может исполниться по цене, отличной от \(P_{entry}\) в момент сигнала. Чтобы сохранить заданный stop_loss_pct, Guardian пересчитывает стоп от фактического AvgPx:

\[ s\% = \frac{|P_{stop,plan} - P_{entry,plan}|}{P_{entry,plan}} \times 100,\quad P_{stop,fill} = P_{fill} \times (1 \mp s/100) \]

(минус для Buy, плюс для Sell). В БД (positions.stop_price) записывается \(P_{stop,fill}\). Если SL уже привязан к ордеру (algo_ord_id), Guardian вызывает OKX amend-algos с newSlTriggerPxnewSz при partial fill).


6. Расчёт размера позиции

  1. Базовый бюджет: max_position_usd по паре (или глобальный fallback) — целевой notional, не жёсткий потолок (§ 12).
  2. Event-driven: умножить на VolumeMultiplier из MarketAnalyzer (диапазон 0.5–1.25; усиление шорта ×1.25 только при BTC BEARISH и тренде альта BEARISH). Trend-Validation: база 1.0, только BTC-поводырь (×0.5 long при BTC BEARISH), без матрицы RSI×канал.
  3. Для SWAP: qtyUSD / price / ctVal, округление по lotSz.
  4. Если ниже minSz биржи — минимально допустимый размер (фактический notional может превысить бюджет; лог min_sz_upscale).
  5. Preflight баланса: оценка IM ≈ notional / swap_leverage × (1 + margin_buffer_pct%), не весь notional; затем синхронизация плеча на бирже (SetSwapLeverage) — fail-closed при ошибке.

\[ Budget_{final} = max\_position\_usd \times VolumeMultiplier \]


7. Исполнение и жизненный цикл ордера

7.1. Открытие

  1. Лимитный ордер на \(P_{entry}\).
  2. К ордеру привязывается стоп-лосс на бирже (algo) на весь объём входа.
  3. При trailing_pct > 0 трейлинг выставляется после исполнения лимитки (отдельный algo), не вторым attach при входе; trailing_algo_id сохраняется в positions.meta.
  4. В учёте: сначала pending order; строка позиции — только после fill (или после сценария partial TTL). stop_price в позиции — после пересчёта от fill; algo_ord_id / trailing_algo_id — в meta для точного PnL.
  5. Event-driven (content_hash новости): в одной транзакцииnews_trade_dispatches claim + pending (без okx_order_id); при дубликате claim ордер не отправляется. После PlaceOrderUpdatePendingOrderOKXID. Trend-Validation: hash mkt:…, отдельный guard в execution (не смешивается с news hash).

Новый вход по той же паре ограничен max_positions_per_symbol: при default 1 наличие pending или open блокирует повторный вход; если лимит поднять выше 1, код допускает несколько одновременных слотов по symbol.

7.2. TTL лимитки — 15 минут

Состояние на бирже Действие
live, 0 fill, TTL истёк Снять лимитку; отмена ttl_expired
partial fill, TTL не истёк Ждать (wait_ttl), позиция не открывается
partial fill, TTL истёк Снять остаток; SL подогнать под исполненный объём; позиция на фактический fill; ttl_partial_fill
filled Позиция open; при trailing — выставить trailing algo
Отмена биржей без fill okx_canceled

7.3. Выход

Механизм Поведение
Стоп-лосс На бирже; срабатывает без доступности бота
Трейлинг Native OKX; бот не опрашивает цену
Сверка Периодически: если на бирже позиции нет — закрыть в БД; PnL по fills (algo_ord_id, trailing_algo_id из meta)
Ручное закрытие / kill-switch Рыночный reduce-only; PnL с positions.meta и повторными запросами fills (задержка OKX ~400 ms)

7.4. Ручное открытие (Manual Open)

flowchart TD
    OP[Оператор: LONG/SHORT] --> KS{Kill-switch?}
    KS -->|да| Block[Отказ]
    KS -->|нет| Bal{Достаточно USDT IM?}
    Bal -->|нет| Block
    Bal -->|да| Lev[SetSwapLeverage + tdMode]
    Lev --> Calc[Контракты + SL от entry]
    Calc --> PO[PlaceOrder + attach SL]
    PO --> DB[InsertPendingOrder meta.source=manual]
    DB --> Gd[Guardian: как автоматический вход]
Проверка Ручной ордер
Risk Gate 1–8 (score, confidence, sentiment, cooldown, daily loss) Не применяется
Слоты open/pending по паре Не применяется
system.trading_enabled Не применяется
Kill-switch Блокирует
Preflight USDT / initial margin Да (fail-closed)
OKX enabled Да
Тип ордера Базовая цена \(P_{mkt}\) для preview и расчёта
Market Last с /api/v1/market/ticker (UI poll ~2 с)
Limit / PostOnly limit_price из формы

Стоп: custom_stop_pct; если 0stop_loss_pct пары. Формулы § 5 от выбранной entry-цены. SL на бирже — sl_trigger_px_type (mark / last / index).

После успеха ордер виден на вкладке Ордеры с бейджем «Ручная» (orders.meta.source = manual). Guardian: TTL 15 мин, partial fill, пересчёт SL от fill — как в § 7.2 и § 5.

UI (Quick Trade PRO): график Lightweight Charts 4.2.2, TF 15m/1H/4H/1D, линии Entry/SL на графике при изменении параметров; live estimate контрактов/маржи через manual-estimate; кнопка «Спросить у ИИ» и drawer с анализом — § 7.5. Post-Only отключён при Market; Reduce-Only — предупреждение и readonly объёма.

Ограничение: принудительная смена set-position-mode на бирже не выполняется — только проверка текущего режима аккаунта (RequireSwapAccountMode).

7.5. Ask AI Vision (советник)

Итерация 5.6 (Vision hybrid datapack): при клике Core собирает Market Snapshot Bundle и отправляет его в LLM вместе с опциональным скриншотом. Подробности API, OKX endpoints и промпты — canvas.md §4.2.2.

flowchart TD
    Q[Спросить у ИИ] --> M{include_image?}
    M -->|да| PNG[Скрин #manual_chart_wrap или chart.takeScreenshot]
    M -->|нет| TXT[Только текстовый дата-пакет]
    PNG --> API[POST manual-analyze-vision]
    TXT --> API
    API --> BUNDLE[Core: параллельно OKX свечи 15m/1H + funding/OI/books/LSR]
    BUNDLE --> IND[ATR/ATR% MACD RSI compression + macro 4H EMA distance]
    IND --> LLM[Vision LLM: primary → fallback]
    LLM --> AUDIT[ai_audit_logs + async PNG audit_id.png]
    AUDIT --> DR[Drawer: analysis RU + recommendation]
    DR --> AP{trade_recommended?}
    AP -->|да| FILL[Применить → поля mt_* + линии + estimate]
    AP -->|нет| READ[Только чтение анализа]
    FILL --> OP[Оператор сам жмёт LONG/SHORT → § 7.4]

Роль: пассивный советник. ИИ не выставляет ордер; после «Применить рекомендации» оператор вручную подтверждает сделку.

Аспект Поведение
Risk Gate 1–8 Не применяется
MarketAnalyzer как вето Не применяется (4H-снапшот только в промпт, не блокирует запрос)
Kill-switch Не блокирует запрос анализа (блокирует только Manual Open)
Авто-ордер Нет
OKX API keys Публичные метрики и свечи — без торговых ключей; Manual Open по-прежнему требует OKX

Что уходит в LLM (текст + опционально PNG):

Слой Источник
Визуальный PNG рабочего ТФ (если include_image=true)
OHLC OKX: 80×15m, 40×1H — compact JSON в промпте
Моментум RSI(14) 15m, MACD histogram, ATR(14) 15m и ATR% (atr/last×100, расчёт Core)
Range compression Средний bar range 10 vs 50 баров 15m, compression_ratio (< 0.6 — подсказка breakout)
Макро 4H MarketAnalyzer: EMA200, distance to EMA200 %, ChannelPos, Fib 38.2/50/61.8, swing H/L
Деривативы Funding rate; OI change % (Rubik 1H); long/short account ratio (Rubik)
Стакан Top-5 market/books: bid/ask volume, imbalance (bid-ask)/(bid+ask)
Черновик symbol, TF, volume, side, order type, limit, leverage, stop %, last price

При недоступности деривативов/стакана в промпт подставляется N/A — запрос не падает. Если 4H-снапшот устарел — префикс [STALE 4H MACRO DATA] в user prompt.

Не отправляется: открытые позиции; base64 скрина в БД (только файл на диске).

Справочник параметров дата-пакета (для трейдера)

Всё ниже попадает в user prompt (текст к модели), кроме system prompt (отдельный блок инструкций на EN) и скриншота (опционально, визуальный слой). Технические детали кода — canvas.md §4.2.2, таблица «Полный каталог входа LLM».

Визуальный слой
Параметр Описание
Скриншот графика PNG рабочего таймфрейма с формы (если не включён режим «Без скриншота»). Модель сверяет картинку с числами.
Черновик сделки (из формы Quick Trade)
Параметр (промпт) Смысл
symbol Инструмент SWAP (например BTC-USDT-SWAP).
timeframe Таймфрейм графика в UI (15m, 1H, …).
volume_usd Планируемый объём сделки в USD.
side Черновик направления (LONG/SHORT).
order_type Тип ордера (Market / Limit / PostOnly).
limit_price Цена лимита (0 для Market).
leverage Плечо из формы.
stop_pct Стоп в % от входа (черновик).
last_price Последняя цена с биржи (ticker) или close последней 15m-свечи.
OHLC (текстовые массивы свечей)
Параметр Формула / объём Зачем модели
80 свечей 15m JSON: время t, open/high/low/close/volume Микроструктура, паттерны, локальные уровни.
40 свечей 1H то же Контекст старшего ТФ внутри дня.
Моментум и волатильность (15m)
Параметр Формула Интерпретация
RSI (14), 15m Wilder RSI по 14 периодам на close 15m Перекупленность/перепроданность; дивергенции.
MACD Histogram (EMA12−EMA26) − Signal(EMA9) на последнем баре Импульс: знак и наклон гистограммы.
ATR (14), 15m Wilder ATR(14) по OHLC 15m Абсолютная волатильность в цене инструмента; база для стопа в пунктах.
ATR (14) % ATR / last_price × 100 Сравнимая волатильность между BTC, DOGE и др. (например 0.4% vs 1.2%). Валидация стоп-% относительно рынка.
Range compression (15m)
Параметр Формула Интерпретация
Avg bar range (10) Среднее (High − Low) за последние 10 баров 15m Текущее «сжатие» диапазона.
Avg bar range (50) Среднее (High − Low) за последние 50 баров 15m «Нормальный» диапазон фона.
Compression ratio range_10 / range_50 < 0.6 — сильное сжатие, чаще предшествует пробою; > 1 — расширение волатильности.
Макро-структура (4H, снапшот MarketAnalyzer)
Параметр Формула / источник Интерпретация
EMA200 (4H) EMA(200) по close 4H Главная средняя тренда.
EMA200 Trend BULLISH если цена выше EMA200, иначе BEARISH Направление макро-тренда.
Price vs EMA above / below Быстрая метка положения цены относительно EMA200.
Distance to EMA200 % (last_price − EMA200) / EMA200 × 100 Отрицательное — цена ниже EMA (медвежий stretch, mean-reversion вниз к EMA); положительное — выше. Величина = «перетянутость» от средней.
Channel position % Позиция цены в регрессионном канале 2σ (100 баров 4H), 0% = низ, 100% = верх Где цена в «коробке» тренда.
Swing High / Low Max high / min low за 100 баров 4H Структурные экстремумы; зоны ликвидности / стопов.
Fib 38.2% / 50% / 61.8% Уровни отката по swing 4H (зависят от тренда) Golden pocket (61.8%), зоны ретеста.

Если снапшот 4H недоступен — в начале промпта [STALE 4H MACRO DATA], макро-поля N/A.

Деривативы (OKX, публичные)
Параметр Формула / источник Интерпретация
Funding Rate Текущая ставка финансирования SWAP Сильный + — перегруз лонгов; сильный — шортов.
Open Interest Change % (OI_now − OI_prev) / OI_prev × 100 за 1H (Rubik) Приток/отток позиций; рост OI + движение цены — подтверждение тренда.
Long/Short Ratio Доля лонгов в аккаунтах (Rubik) > 1 — больше лонгов; крайности — contrarian risk.
Стакан (top-5 уровней)
Параметр Формула Интерпретация
Bid Volume Сумма size bid top-5 Ликвидность покупателя у цены.
Ask Volume Сумма size ask top-5 Ликвидность продавца.
Imbalance Delta (bids − asks) / (bids + asks) + — давление покупок; — стена продаж (supply).
Что модель возвращает (не вход, а выход)
Поле Описание
analysis Markdown RU: описание графика, рекомендации, итог.
recommendation.trade_recommended Открывать ли сделку сейчас.
recommendation.side, type, volume_usd, custom_leverage, margin_mode, custom_stop_pct, sl_trigger_px_type, limit_price, reduce_only Черновик рекомендации для кнопки «Применить».
audit_id ID записи в журнале LLM.

Ответ Core (JSON):

Поле Смысл
analysis Markdown на русском (§ Описание графика, Рекомендации, Итог)
recommendation.trade_recommended true — кнопка «Применить»; иначе только текст
recommendation.side Buy | Sell
recommendation.type Market | Limit | PostOnly
recommendation.* volume_usd, custom_leverage, margin_mode, custom_stop_pct, sl_trigger_px_type, limit_price (0 для Market), reduce_only
audit_id UUID записи ai_audit_logs (для поиска в журнале)

Применение в UI: перенос в поля mt_*, линии Entry/SL, manual-estimate. Кулдаун кнопки — 30 с.

Настройки: ИИ → Подключение (ai_connection: серверы, primary/fallback), ИИ → AI Vision (ai_vision: enabled, vision_model_id, system/user prompt). Полный список плейсхолдеров user prompt — справочник выше и canvas.md §4.2.2 (таблица по коду).

Просмотр последнего запроса: Admin → Журналы → Логи анализа новостей → Purpose vision → клик по строке → User prompt (весь дата-пакет) / Raw response (ответ модели). Скриншот: storage/ai_vision_screenshots/{audit_id}.png.


8. Kill-switch и возобновление

При kill-switch:

Guardian при активном kill-switch: не открывает позицию из pending; live — cancel; при fill/partial — немедленный market close, позиция в БД не создаётся.

/resume: снимает kill-switch, снова разрешает торговлю; не переоткрывает позиции.


9. Симулятор (Dry-Run)

Тот же конвейер AI → Gate → Analyzer → расчёт уровней, без ордера на бирже.

Режим Смысл
Lab Изолированный риск: нет учёта слотов/cooldown/PnL в БД
Deterministic Заданные score/confidence без LLM
Override market Ручные RSI, channel_pos, тренды BTC/ETH

Golden cases — эталонные сценарии для регрессии (вето RSI, вход TRX/BTC, отказы gate/analyzer).


10. Настраиваемые параметры (сводка)

Группа Параметры
Режим trading_strategy_mode: event_driven | trend_validation
Trend-Validation validation_news_window_hours, market_trigger_rsi_oversold/overbought, market_trigger_channel_low/high, market_trigger_poll_interval_min
Сигнал (event-driven) sentiment_threshold, ai_brain.min_confidence
Ask AI Vision ai_vision.enabled, vision_model_id, text_only_default, system/user prompt (EN, плейсхолдеры OHLC/деривативы/стакан); ai_connection primary/fallback; ответ: trade_recommended + поля сделки + audit_id
Уровни (на пару) entry_offset_pct, stop_loss_pct, trailing_pct
Риск max_open_positions, max_positions_per_symbol, max_position_usd, max_daily_loss_usd, cooldown_minutes, loss_cooldown_multiplier, swap_leverage, margin_buffer_pct, strict_balance_check
Рынок eth_correlated на пару
Новости poll_interval_sec, RSS URLs; keywords — на пару (+ legacy глобальные)
OKX demo / live; execution.sl_trigger_px_type для SL (mark default, также last/index)
Ручная торговля Объём USD, custom_leverage 1–100, margin_mode, custom_stop_pct, тип Market/Limit/PostOnly, reduce_only, limit_price (Limit/PostOnly)

11. Функциональные возможности (статус)

Возможность Статус
Event-Driven: RSS + TG + LLM + Gate 1–8 + Analyzer 9–11
Trend-Validation Smart (market worker + AI-veto)
Несколько пар с разными keywords и лимитами
Лимитный вход + SL + native trailing
TTL 15 мин, wait_ttl для partial
Дневной лимит убытка (UTC), cooldown
Поводыри BTC/ETH, матрица RSI×канал (event-driven)
Kill-switch + Guardian под kill-switch
Preflight IM + SetSwapLeverage fail-closed
Ручное закрытие, live PnL в UI/TG
Dry-Run симулятор + golden cases (event-driven)
Ручное открытие (Manual Open, Quick Trade PRO, бейдж «Ручная»)
Ask AI Vision (Vision 5.6: PNG + OHLC/ATR%/compression/деривативы/стакан + macro 4H EMA distance, аудит, drawer, apply без авто-ордера)
Golden / симулятор для Trend-Validation ❌ (план)
max_total_exposure_%
OCR для картинок в TG ❌ (план)

12. Известные ограничения и риски

Сводка аудита логики (2026-05); детали инфраструктуры — в canvas.md §4.7.

# Тема Суть
1 max_position_usd Целевой бюджет; при qty < minSz размер поднимается до биржевого минимума — фактический notional может заметно превысить лимит (лог min_sz_upscale)
2 Дневной PnL Учитывается realized PnL − fee buffer (0.06% taker на entry+exit); без funding и проскальзывания — лимит может быть оптимистичен
3 Entry от last Нет модели spread/стакана; на импульсе last может отставать от исполнимой цены лимитки
4 R/R и TP Нет минимального risk/reward и целевого take-profit — только SL и trailing
5 Асимметрия тренда counter_trend_short блокирует шорт в BULLISH-альте; симметричного запрета лонга в bearish-альте без BTC bearish нет (осознанный разворотный вход)
6 Trailing activePx от entry; если цена не возвращается к entry, trailing может не активироваться
7 Stale 10 мин Снапшот старше 10 мин → отказ / пропуск в market worker; на быстром рынке возможна задержка
8 Идемпотентность Claim+pending в одной tx до биржи; при max_positions_per_symbol > 1 теоретический риск дубля при сбое между insert и claim (при default 1 — гасится slot-check)

Рекомендации для live: golden-сценарии minSz выше бюджета, BTC bearish short ×1.25 с урезанием матрицей, partial fill + amend SL, stale на границе 10 мин; для Trend-Validation — отдельные кейсы в симуляторе.