← Назад к главному
# 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