Initial import: grid-bot — grid trading bot for BTC-USDT on Cifra Markets

This commit is contained in:
Kolp
2026-09-24 13:22:23 +07:00
commit 642cc11a9f
18968 changed files with 5683248 additions and 0 deletions
+262
View File
@@ -0,0 +1,262 @@
# Деплой Kronos advisor на боевой сервер
**Файл пакета:** `kolp-deploy-2026-06-05.tar.gz` (130 КБ, 18 файлов, без `__pycache__`)
**SHA256:** см. `kolp-deploy-2026-06-05.tar.gz.sha256`
**Сервер:** `46.29.164.31`, корень проекта `/root/grid-bot`
---
## ⏱ 5-минутный план (на сервере)
### 0. Бэкап (30 сек)
```bash
cd /root/grid-bot
sudo systemctl stop grid-bot
tar -czf ~/grid-bot-backup-$(date +%F).tar.gz \
--exclude='kronos-venv' --exclude='__pycache__' \
--exclude='.env' --exclude='.env.bak' \
--exclude='*.log' --exclude='data' --exclude='models' .
ls -la ~/grid-bot-backup-*.tar.gz
```
### 1. Скопировать пакет (1 мин)
```bash
# На своём ноуте:
scp kolp-deploy-2026-06-05.tar.gz root@46.29.164.31:/root/grid-bot/
```
### 2. Распаковать поверх (30 сек)
```bash
cd /root/grid-bot
tar -xzf kolp-deploy-2026-06-05.tar.gz
# Проверить, что новые файлы на месте:
ls -la kronos/ kronos_advisor_main.py kronos-advisor.* kronos_advice.json
# Файлы main.py / config.py / .env.example / templates/dashboard.html — перезаписаны
```
### 3. Поднять venv для advisor-а (1 мин)
```bash
cd /root/grid-bot
python3 -m venv --without-pip --system-site-packages kronos-venv
curl -sSL https://bootstrap.pypa.io/get-pip.py | kronos-venv/bin/python
kronos-venv/bin/pip install --quiet --upgrade pip
kronos-venv/bin/pip install --quiet \
torch --index-url https://download.pytorch.org/whl/cpu
kronos-venv/bin/pip install --quiet \
numpy pandas einops==0.8.1 huggingface_hub==0.33.1 \
matplotlib==3.9.3 tqdm==4.67.1 safetensors==0.6.2 \
requests python-dotenv
# Скачать модель (~30 МБ, ~10 сек):
kronos-venv/bin/python -c "
import os
os.environ['HF_HOME'] = os.path.abspath('models/hf-cache')
os.makedirs(os.environ['HF_HOME'], exist_ok=True)
from huggingface_hub import snapshot_download
snapshot_download('NeoQuasar/Kronos-Tokenizer-2k', local_dir='models/Kronos-Tokenizer-2k', allow_patterns=['*.json','*.safetensors','*.txt'])
snapshot_download('NeoQuasar/Kronos-mini', local_dir='models/Kronos-mini', allow_patterns=['*.json','*.safetensors','*.txt'])
print('OK')
"
```
### 4. Обновить .env (1 мин)
```bash
cd /root/grid-bot
# Добавить новые переменные, ЕСЛИ их ещё нет
grep -q '^WEB_USERNAME=' .env || cat >> .env <<'EOF'
# === Web auth (ОБЯЗАТЕЛЬНО сменить) ===
WEB_USERNAME=kolpakov
WEB_PASSWORD=***ВАШ_СЛОЖНЫЙ_ПАРОЛЬ***
# === Kronos advisor ===
KRONOS_ENABLED=true
KRONOS_LIVE_ENABLED=false # ← сначала false, проверим в проде
KRONOS_MODEL=kronos-mini
KRONOS_TF_MIN=60
KRONOS_LOOKBACK=400
KRONOS_PRED_LEN=24
KRONOS_MIN_CONFIDENCE=0.4
KRONOS_ADVICE_FILE=/root/.openclaw/kronos_advice.json
EOF
# Сменить права
chmod 600 .env
```
### 5. Запустить grid-bot (30 сек)
```bash
sudo systemctl start grid-bot
sudo systemctl status grid-bot --no-pager
# В логах должно появиться:
# [INFO] Kronos kronos-mini loaded on cpu (max_context=2048)
# или просто запуск без Kronos (если KRONOS_ENABLED=false)
```
### 6. Установить systemd-timer для advisor-а (1 мин)
```bash
sudo cp /root/grid-bot/kronos-advisor.{service,timer} /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now kronos-advisor.timer
systemctl list-timers kronos-advisor.timer
# Должно показать "next" через <15 мин
```
### 7. Проверить работу (1 мин)
```bash
# 1) Через 5-10 мин проверить, что kronos_advice.json обновляется
ls -la /root/.openclaw/kronos_advice.json
cat /root/.openclaw/kronos_advice.json
# 2) Дашборд
curl -u "kolpakov:ВАШ_ПАРОЛЬ" https://gridbot.kolp.pro/api/kronos | python3 -m json.tool
# 3) Логи advisor-а
journalctl -u kronos-advisor.service -n 20 --no-pager
tail -50 /root/grid-bot/kronos-advisor.log
```
---
## 🔒 Безопасность — обязательно
1. **Сменить оба комплекта ключей Tradernet** (9adf.../97b0... и a8e6.../7313...) — они утекли в архив, который я видел.
- `https://tradernet.by` → Настройки → API-ключи → отозвать старые, выпустить новые
- Положить новые в `.env` (не в `config.py`!)
- В `config.py` старые ключи **уже удалены** (только `os.getenv`)
2. **`WEB_PASSWORD`** поставить сложный (16+ символов, не как в `.env.example`)
3. **Telegram-токен** — тоже отозвать (`@BotFather` → `/revoke` → новый)
---
## 🚦 Стратегия включения в проде
### Этап 1 — безопасно (текущий шаг)
- `KRONOS_ENABLED=true`
- `KRONOS_LIVE_ENABLED=false`
- Советник пишет `kronos_advice.json`, видим в дашборде
- **Бот работает как раньше**, Kronos **не влияет** на ордера
### Этап 2 — полу-включение (через 1-2 дня, если метрики ОК)
- `KRONOS_LIVE_ENABLED=true`
- Kronos начинает реально корректировать шаг/центр/паузу
- Следить за логом `[KRONOS] applied: ...`
- При проблемах → `KRONOS_LIVE_ENABLED=false` в `.env` + `sudo systemctl restart grid-bot`
### Этап 3 — прод-настройки (когда уверен)
- То же, что этап 2
- Включить Telegram-уведомления о смене совета (уже в коде — сработает само)
- Опционально: сменить `KRONOS_TF_MIN` на 15/30/120
---
## 🔄 Откат (если что-то пошло не так)
```bash
cd /root/grid-bot
sudo systemctl stop grid-bot
# Восстановить из бэкапа
tar -xzf ~/grid-bot-backup-2026-06-05.tar.gz
# Если нужно полностью выключить Kronos:
sed -i 's/^KRONOS_ENABLED=true/KRONOS_ENABLED=false/' .env
sed -i 's/^KRONOS_LIVE_ENABLED=true/KRONOS_LIVE_ENABLED=false/' .env
sudo systemctl start grid-bot
```
Или ещё проще:
```bash
# В .env:
KRONOS_ENABLED=false
KRONOS_LIVE_ENABLED=false
sudo systemctl restart grid-bot
# Бот работает как ДО интеграции с Kronos
```
---
## 📁 Что внутри пакета
```
grid-bot/
├── main.py ← обновлён (Kronos-интеграция)
├── config.py ← секреты → .env, KRONOS_* переменные
├── .env.example ← шаблон .env
├── .gitignore ← защита .env
├── kronos/ ← NEW: пакет советника
│ ├── __init__.py
│ ├── advisor.py ← KronosAdvisor
│ ├── data_source.py ← Tradernet + Binance источники
│ ├── backtest.py ← backtest static vs adaptive
│ └── compare_backtest.py ← сравнение conservative/adjusted/minimal
├── kronos_advisor_main.py ← CLI (запускается из systemd)
├── kronos_advice.json ← последний совет (пример)
├── kronos-advisor.service ← systemd unit
├── kronos-advisor.timer ← каждые 15 мин
├── kronos-advisor.README.md ← подробная докуменация по unit
├── templates/
│ └── dashboard.html ← обновлён (🧠 Kronos-блок)
└── static/
├── chart.umd.min.js
└── chartjs-plugin-annotation.min.js
```
**НЕ включено в пакет (нужно отдельно):**
- `kronos-venv/` (создаётся на шаге 3)
- `models/Kronos-Tokenizer-2k/` + `models/Kronos-mini/` (скачивается на шаге 3)
- `data/` (нет нужды — данные тянутся с биржи)
- `.env` и `.env.bak` (ты добавишь сам)
- `venv/` (твой существующий)
---
## 📊 Что мы знаем о качестве Kronos-прогноза
Результаты backtest-а на 14 мес BTCUSDT 1h (Apr 2025 → Jun 2026):
| Mode | PnL | WinRate | MaxDD | Sharpe |
|---|---|---|---|---|
| static (фикс 0.5%) | +1672% | 100% | -0.79% | 1.38 |
| conservative (Kronos) | +515% | 100% | -0.69% | 1.16 |
| adjusted (Kronos) | *в процессе* | | | |
| minimal (Kronos) | *в процессе* | | | |
**Вывод честный:**
- В **текущей** реализации Kronos для grid на трендовом рынке вредит (статичная сетка BTC-тренда выгоднее)
- Однако **Telegram-уведомления** и **adaptive pause** — это ценная страховка от резких обвалов
- Backtest на отрезке **с трендом вверх** искажает картину: grid зарабатывает на колебаниях, а Kronos их «фильтрует»
- На **боковике** adaptive может выиграть — нужно тестировать в проде в разные фазы рынка
**Рекомендация:** запускай в режиме «Этап 1» (наблюдение), через 1-2 недели включай «Этап 2», следи за метриками. Не жди чудес — Kronos это **советник**, не замена стратегии.
---
## ⚠️ Что я НЕ делал
- Не отзывал ключи Tradernet (ты сам)
- Не запускал ничего на твоём сервере
- Не менял существующий `grid-bot.service` (только добавил `kronos-advisor.{service,timer}`)
- Не трогал твой `.env` и `.env.bak`
- Не интегрировал в существующий дашборд `b.html` (если он у тебя живёт — нужно руками перенести Kronos-блок)
---
## 📞 Если что-то не работает
```bash
# Смотри логи в таком порядке:
journalctl -u grid-bot -n 50 --no-pager
journalctl -u kronos-advisor.service -n 50 --no-pager
tail -100 /root/grid-bot/kronos-advisor.log
tail -100 /root/grid-bot/margin-bot.log
# Проверь, что модель на месте
ls -la /root/grid-bot/models/Kronos-Tokenizer-2k/
ls -la /root/grid-bot/models/Kronos-mini/
# Проверь, что совет генерируется
cd /root/grid-bot
kronos-venv/bin/python kronos_advisor_main.py --live 2>&1 | tail -10
cat /root/.openclaw/kronos_advice.json
```
Если `kronos_advisor_main.py` падает — пришли мне вывод ошибки, разберёмся.