← Назад к главному
# Trading AI - Trading Bot для Gate.io Futures **Система автоматической торговли памп-парами на Gate.io USDT Futures с DUAL+CROSS режимом.** ## 📋 Обзор проекта ### Архитектура системы ``` ┌─────────────────────────────────────────────────────────────┐ │ main.rs │ │ ┌─────────────┐ ┌──────────────┐ │ │ │ MONITOR │─────►│ LIVE │ │ │ │ (SCAN) │ │ (TRADE) │ │ │ └──────┬──────┘ └──────┬───────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────┐ ┌──────────────┐ │ │ │ Gate.io │ │ Redis │ │ │ │ API │◄────►│ Storage │ │ │ └─────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### Основные режимы | Режим | Назначение | Модуль | |-------|-----------|---------| | **MONITOR** | Сканирование памп-пар | `monitor.rs` | | **LIVE** | Торговля выбранной парой | `src/live/` | | **DUAL** | Одновременные LONG + SHORT | `gate.rs` | | **CROSS** | Общая маржа для обеих позиций | `gate.rs` | --- ## 🚀 Быстрый старт ### 1. Установка зависимостей ```bash sudo apt install redis-server cargo build --release ``` ### 2. Создание .env файла ```bash cp .env.example .env nano .env ``` ### 3. Настройка переменных ```env # Redis REDIS_URL=redis://127.0.0.1:6379/ # Сессия SESSION_ID=volatility-trader-1 # LIVE режим TICK_DELAY_MS=200 # SCAN фильтры MIN_VOL_PCT=10.0 MAX_VOL_PCT=100.0 SCAN_PAIRS_COUNT=20 # Баланс для расчёта позиции (3-5% от депо) BALANCE_USDT=50.0 # Gate.io API ключи (ОБЯЗАТЕЛЬНО!) GATE_API_KEY=your_api_key_here GATE_SECRET_KEY=your_secret_key_here ``` ### 4. Запуск ```bash cargo run --release ``` ### 5. Проверка Redis ```bash redis-cli > KEYS hb:* 1) "hb:meta:MEMES_USDT" 2) "hb:last:MEMES_USDT" 3) "hb:ticks:MEMES_USDT" 4) "hb:live_log:MEMES_USDT" 5) "hb:entry_calc:MEMES_USDT" ``` --- ## 🏗️ Структура проекта ``` src/ ├── main.rs # Точка входа, оркестрация SCAN + LIVE ├── config.rs # Конфигурация (.env) ├── redis.rs # Redis клиент (PING, DELETE, GET) ├── gate.rs # Gate.io API клиент (HMAC-SHA512) ├── monitor.rs # MONITOR режим (SCAN + PARSE) ├── balance.rs # Учёт баланса между сессиями ├── logger.rs # JSONL логгер ├── feed.rs # Feed для тиков ├── types.rs # Типы данных (Tick) live/ ├── meta.rs # TradingMeta (из Redis) ├── state.rs # PositionSnapshot (состояние позиции) ├── actions.rs # LiveAction enum ├── strategy_core.rs # CoreStrategy (первый вход) ├── strategy_single.rs # SingleStrategy (LONG или SHORT) ├── strategy_both.rs # BothStrategy (LONG + SHORT) ├── volatility_cycle.rs # VolatilityCycle (резки) ├── hedge_guard.rs # HedgeGuard (экстренный хедж) ├── position_machine.rs # PositionMachine (фазы) ├── step.rs # live_step() (оркестрация) ├── logger.rs # write_live_log() (Redis) └── risk.rs # risk_check() (анализ рисков) readme/ ├── README.md # Этот файл ├── main.md # Документация main.rs ├── config.md # Документация config.rs ├── redis.md # Документация redis.rs ├── gate.md # Документация gate.rs ├── monitor.md # Документация monitor.rs ├── balance.md # Документация balance.rs ├── logger.md # Документация logger.rs ├── feed.md # Документация feed.rs ├── types.md # Документация types.rs ├── meta.md # Документация meta.rs ├── state.md # Документация state.rs ├── actions.md # Документация actions.rs ├── strategy_core.md # Документация strategy_core.rs ├── strategy_single.md # Документация strategy_single.rs ├── strategy_both.md # Документация strategy_both.md ├── volatility_cycle.md # Документация volatility_cycle.rs ├── hedge_guard.md # Документация hedge_guard.rs ├── position_machine.md # Документация position_machine.md ├── step.md # Документация step.rs ├── logger.md # Документация live/logger.rs └── risk.md # Документация risk.rs ``` --- ## 🔑 Redis ключи ### Ключи для монитора | Ключ | Тип | TTL | Описание | |------|-----|-----|----------| | `hb:last:{symbol}` | String | - | Последний тик (O(1) доступ) | | `hb:ticks:{symbol}` | List | - | История тиков (максимум 1000) | | `hb:meta:{symbol}` | String | - | Мета-данные контракта | ### Ключи для LIVE | Ключ | Тип | TTL | Описание | |------|-----|-----|----------| | `hb:entry_calc:{symbol}` | String | - | Расчёт входа (EntryCalculation) | | `hb:live_log:{symbol}` | List | - | Лог позиции (максимум 200 записей) | ### Очистка Redis ```bash # Очистить все ключи бота redis-cli --scan --pattern "hb:*" | xargs redis-cli DEL # Или через программу (автоматически при старте) cargo run --release # → Redis очищен: удалено 42 старых ключей ``` --- ## 📊 Стратегии торговли ### CoreStrategy (Первый вход) **Файл:** `src/live/strategy_core.rs` - **Когда срабатывает:** Если позиция пустая - **Что делает:** 1. Проверяет DUAL+CROSS режим (5-шаговая верификация) 2. Рассчитывает размер позиции (DistanceToLIQ ≥ 100%) 3. Открывает BOTH позицию (LONG + SHORT) **Точка входа:** При нахождении памп-пары (>10% за 24ч) --- ### SingleStrategy (Односторонняя позиция) **Файл:** `src/live/strategy_single.rs` - **Когда срабатывает:** Если только LONG или только SHORT - **Что делает:** 1. First cut at +3% (close 50%, rebuy 50%) 2. Second cut at +1.5% от rebuild_price 3. Hedge at -1.5% 4. Transition to BOTH после полной резки проигрывающей стороны **Cooldown:** 5 секунд после входа перед резкой/хеджем --- ### BothStrategy (BOTH режим) **Файл:** `src/live/strategy_both.rs` - **Когда срабатывает:** Если LONG + SHORT - **Фазы:** - **Both** - начальная фаза - **Boosted** - после 3 резок - **WindDown** - сокращение позиции - **ExitReady** - готовность к выходу - **Что делает:** - Авто-хедж при -1.5% PnL большей стороны - Авто-реверс защита при -1% от last_profit_rebuy_price - Exit при +0.5% прибыли в фазе ExitReady --- ### VolatilityCycle (Резки в BOTH) **Файл:** `src/live/volatility_cycle.rs` - **Когда срабатывает:** Если BOTH и чистый PnL обеих сторон ≥ порогу - **Пороги резки:** - 1 цикл: 3% (first cycle) - 2+ циклы: 2% (subsequent cycles) - **Что делает:** - Close 100% profit side - Close dynamic % of losing side (для breakeven) - Rebuy 100% profit side - Не rebuy losing side (постепенно резка до нуля) - Transition to Single когда losing side полностью закрыт **Критическое условие:** ``` if loss_pct_total >= 0.0 { return None } ``` Если обе стороны в убытке → не резкаем --- ### HedgeGuard (Экстренный хедж) **Файл:** `src/live/hedge_guard.rs` - **Когда срабатывает:** Если `delta <= -1.5%` (цена против позиции) - **Что делает:** - Открывает хедж-позицию против движения - Коолдаун: 5 секунд после входа - Emergency protection: если `total_depth < 1000` → порог снижается до -1.75% --- ## 📈 Фазы позиции (PositionMachine) **Файл:** `src/live/position_machine.rs` | Фаза | cut_count | Описание | Действия | |------|-----------|----------|----------| | **Single** | 0 | Одна позиция (LONG или SHORT) | SingleStrategy | | **Both** | 0 | Обе позиции открыты | BothStrategy, VolatilityCycle | | **Boosted** | 1, 2 | После 1-2 резок | Увеличенные резки, авто-хедж | | **WindDown** | 3+ | После 3+ резок | Сокращение позиции | | **ExitReady** | - | Готовность к выходу | Exit при +0.5% | **Transition:** ``` Single → Both → Boosted → WindDown → ExitReady → Single ``` --- ## 🔧 Конфигурация ### Переменные окружения (.env) ```env # ==================== REDIS ==================== REDIS_URL=redis://127.0.0.1:6379/ # ==================== СЕССИЯ ==================== SESSION_ID=volatility-trader-1 # ==================== START ==================== START_SYMBOL=VOLATILE_PAIRS FALLBACK_SYMBOL= # ==================== LIVE РЕЖИМ ==================== TICK_DELAY_MS=200 # ==================== ГОРИЗОНТ ==================== HORIZON_STEPS=20 HORIZON_STEP_PCT=2.0 # ==================== SCAN ФИЛЬТРЫ ==================== MIN_VOL_PCT=10.0 MAX_VOL_PCT=100.0 SCAN_PAIRS_COUNT=20 # ==================== БАЛАНС ==================== BALANCE_USDT=50.0 # ==================== GATE.IO API ==================== GATE_API_KEY=your_api_key_here GATE_SECRET_KEY=your_secret_key_here ``` ### Значения по умолчанию | Параметр | По умолчанию | Описание | |-----------|---------------|----------| | `REDIS_URL` | `redis://127.0.0.1/` | Redis URL | | `SESSION_ID` | `volatility-trader-1` | ID сессии | | `TICK_DELAY_MS` | `100` | Задержка между тиками (мс) | | `MIN_VOL_PCT` | `15.0` | Мин. волатильность (%) | | `MAX_VOL_PCT` | `1000.0` | Макс. волатильность (%) | | `SCAN_PAIRS_COUNT` | `50` | Количество пар для сканирования | | `BALANCE_USDT` | `50.0` | Баланс для расчёта позиции (USDT) | --- ## 🔐 Безопасность ### DUAL+CROSS режим **Критические проверки:** 1. `position_mode` = `dual_long` или `dual_short` 2. `margin` = 0 (подтверждает CROSS mode) 3. `size` у LONG и SHORT ≠ 0 4. `leverage` = 50 (или максимальное доступное) **Проверка:** ```bash # Получить позиции curl -X GET "https://api.gateio.ws/api/v4/futures/usdt/dual_comp/positions/MEMES_USDT" \ -H "KEY: $GATE_API_KEY" \ -H "Timestamp: $(date +%s)" \ -H "SIGN: $(echo -n "GET..." | openssl dgst -sha512 -hmac $GATE_SECRET_KEY -binary | xxd -p)" # Проверить mode и margin { "mode": "dual_long", "margin": "0", # ← Должен быть 0 для CROSS "size": "1000" } ``` --- ### DistanceToLIQ **Формула:** ``` DistanceToLIQ = (balance - margin_used) / margin_used × 100 ``` **Требование:** `DistanceToLIQ ≥ 100%` **Пример:** ``` balance = 100 USDT margin_used = 10 USDT DistanceToLIQ = (100 - 10) / 10 × 100 = 900% 900% ≥ 100% ✅ ``` --- ## 📝 Логирование ### Файлы логов ``` logs/ ├── global/ │ ├── monitor.jsonl │ ├── live.jsonl │ ├── system.jsonl │ └── actions.jsonl └── sess-{timestamp}/ ├── monitor.jsonl ├── live.jsonl ├── system.jsonl └── actions.jsonl ``` ### Формат JSONL ```json {"ts":1771747635,"message":"Selected: MEMES_USDT","data":{"symbol":"MEMES_USDT","score":12.3}} ``` ### Чтение логов ```bash # Последние 10 записей monitor tail -10 logs/sess-123456/monitor.jsonl # Все записи actions cat logs/sess-123456/actions.jsonl # Фильтр по действию grep "OPEN_LONG" logs/sess-123456/actions.jsonl # Форматированный вывод jq '.' logs/sess-123456/monitor.jsonl | tail -10 ``` --- ## 🐛 Отладка ### Проверка Redis ```bash # PING redis-cli PING # Все ключи бота redis-cli --scan --pattern "hb:*" # Последний тик redis-cli GET "hb:last:MEMES_USDT" | jq # Мета-данные redis-cli GET "hb:meta:MEMES_USDT" | jq # Лог позиции (последние 10) redis-cli LRANGE "hb:live_log:MEMES_USDT" 0 9 | jq ``` ### Проверка Gate.io ```bash # Баланс фьючерсного аккаунта curl -X GET "https://api.gateio.ws/api/v4/futures/usdt/accounts" \ -H "KEY: $GATE_API_KEY" \ -H "Timestamp: $(date +%s)" \ -H "SIGN: $(echo -n "GET..." | openssl dgst -sha512 -hmac $GATE_SECRET_KEY -binary | xxd -p)" | jq # Открытые ордера curl -X GET "https://api.gateio.ws/api/v4/futures/usdt/orders?settle=usdt&status=open" \ -H "KEY: $GATE_API_KEY" \ -H "Timestamp: $(date +%s)" \ -H "SIGN: $(echo -n "GET..." | openssl dgst -sha512 -hmac $GATE_SECRET_KEY -binary | xxd -p)" | jq # Позиции (DUAL) curl -X GET "https://api.gateio.ws/api/v4/futures/usdt/dual_comp/positions/MEMES_USDT" \ -H "KEY: $GATE_API_KEY" \ -H "Timestamp: $(date +%s)" \ -H "SIGN: $(echo -n "GET..." | openssl dgst -sha512 -hmac $GATE_SECRET_KEY -binary | xxd -p)" | jq ``` --- ## 📚 Документация модулей Подробная документация каждого модуля доступна в `readme/`: ### Основные модули - [main.md](readme/main.md) - Точка входа, оркестрация SCAN + LIVE - [config.md](readme/config.md) - Конфигурация из переменных окружения - [redis.md](readme/redis.md) - Redis клиент - [gate.md](readme/gate.md) - Gate.io API клиент - [monitor.md](readme/monitor.md) - MONITOR режим (SCAN + PARSE) - [balance.md](readme/balance.md) - Учёт баланса - [logger.md](readme/logger.md) - JSONL логгер - [types.md](readme/types.md) - Типы данных (Tick) ### LIVE движок - [meta.md](readme/meta.md) - TradingMeta (из Redis) - [state.md](readme/state.md) - PositionSnapshot (состояние позиции) - [actions.md](readme/actions.md) - LiveAction enum - [strategy_core.md](readme/strategy_core.md) - CoreStrategy (первый вход) - [strategy_single.md](readme/strategy_single.md) - SingleStrategy (LONG или SHORT) - [strategy_both.md](readme/strategy_both.md) - BothStrategy (LONG + SHORT) - [volatility_cycle.md](readme/volatility_cycle.md) - VolatilityCycle (резки) - [hedge_guard.md](readme/hedge_guard.md) - HedgeGuard (экстренный хедж) - [position_machine.md](readme/position_machine.md) - PositionMachine (фазы) - [step.md](readme/step.md) - live_step() (оркестрация) - [logger.md](readme/live/logger.md) - write_live_log() (Redis) - [risk.md](readme/risk.md) - risk_check() (анализ рисков) --- ## ⚡ Частые проблемы ### Redis недоступен ``` ❌ Redis сервер не запущен или недоступен! ``` **Решение:** ```bash sudo systemctl start redis-server sudo systemctl status redis-server ``` --- ### Не найден API ключ ``` thread 'main' panicked at 'GATE_API_KEY не найден в окружении (.env)', src/config.rs:128:20 ``` **Решение:** ```bash nano .env # Добавить: GATE_API_KEY=your_api_key_here GATE_SECRET_KEY=your_secret_key_here ``` --- ### DUAL mode не включен ``` ❌ DUAL mode не включен для контракта MEMES_USDT ``` **Решение:** ```bash # Включить DUAL mode через Gate.io UI: # 1. Зайти на Gate.io → Futures → Position Mode # 2. Выбрать "Dual Long" или "Dual Short" # 3. Сохранить # Или через API: curl -X POST "https://api.gateio.ws/api/v4/futures/usdt/dual_mode?dual_mode=true" \ -H "KEY: $GATE_API_KEY" \ -H "Timestamp: $(date +%s)" \ -H "SIGN: ..." ``` --- ### CROSS mode не установлен ``` ❌ Margin mode не CROSS для контракта MEMES_USDT ``` **Решение:** ```bash # Установить CROSS mode через Gate.io UI: # 1. Зайти на Gate.io → Futures → Margin Mode # 2. Выбрать "Cross" # 3. Сохранить # Или через API (для DUAL mode): curl -X POST "https://api.gateio.ws/api/v4/futures/usdt/dual_comp/positions/cross_mode" \ -H "KEY: $GATE_API_KEY" \ -H "Timestamp: $(date +%s)" \ -H "SIGN: ..." \ -H "Content-Type: application/json" \ -d '{"mode":"CROSS","contract":"MEMES_USDT"}' ``` --- ## 📖 Дополнительные ресурсы - [Gate.io Futures API](https://www.gate.io/docs/derivatives/futures/en/README) - [Redis документация](https://redis.io/documentation) - [Rust tokio](https://tokio.rs/) - [Serde](https://serde.rs/) --- ## 📄 Лицензия MIT License --- **Автор:** Claude Code Assistant **Дата:** 2026-02-22 **Версия:** 1.0