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_confidence ≥ 0.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
- Первое значение: SMA первых 200 цен закрытия.
- Коэффициент сглаживания: \(k = \dfrac{2}{200+1}\).
- Рекуррентно: \(\text{EMA}_t = \text{Close}_t \cdot k + \text{EMA}_{t-1} \cdot (1-k)\).
- BULLISH, если последний close > EMA200; иначе BEARISH.
Регрессионный канал (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 с newSlTriggerPx (и newSz при partial fill).
6. Расчёт размера позиции
- Базовый бюджет:
max_position_usdпо паре (или глобальный fallback) — целевой notional, не жёсткий потолок (§ 12). - Event-driven: умножить на
VolumeMultiplierиз MarketAnalyzer (диапазон 0.5–1.25; усиление шорта ×1.25 только при BTC BEARISH и тренде альта BEARISH). Trend-Validation: база 1.0, только BTC-поводырь (×0.5 long при BTC BEARISH), без матрицы RSI×канал. - Для SWAP:
qtyUSD / price / ctVal, округление поlotSz. - Если ниже
minSzбиржи — минимально допустимый размер (фактический notional может превысить бюджет; логmin_sz_upscale). - Preflight баланса: оценка IM ≈
notional / swap_leverage × (1 + margin_buffer_pct%), не весь notional; затем синхронизация плеча на бирже (SetSwapLeverage) — fail-closed при ошибке.
\[ Budget_{final} = max\_position\_usd \times VolumeMultiplier \]
7. Исполнение и жизненный цикл ордера
7.1. Открытие
- Лимитный ордер на \(P_{entry}\).
- К ордеру привязывается стоп-лосс на бирже (algo) на весь объём входа.
- При
trailing_pct > 0трейлинг выставляется после исполнения лимитки (отдельный algo), не вторым attach при входе;trailing_algo_idсохраняется вpositions.meta. - В учёте: сначала pending order; строка позиции — только после fill (или после сценария partial TTL).
stop_priceв позиции — после пересчёта от fill;algo_ord_id/trailing_algo_id— в meta для точного PnL. - Event-driven (
content_hashновости): в одной транзакции —news_trade_dispatchesclaim + pending (безokx_order_id); при дубликате claim ордер не отправляется. ПослеPlaceOrder—UpdatePendingOrderOKXID. Trend-Validation: hashmkt:…, отдельный 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; если 0 — stop_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:
- Снять лимитки по всем instId из
execution.pairs[]+ символы open/pending в БД. - Закрыть каждую open позицию рыночным reduce-only.
trading_enabled = false,kill_switch = true.
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 — отдельные кейсы в симуляторе.