docs: подробный README (разбор проекта при переносе в Gitea)

Старый README сохранён как README.upstream.md.
Этот коммит содержится в:
2026-08-20 04:18:36 +09:00
родитель 09cb1e201b
Коммит a72ad488ca
2 изменённых файлов: 216 добавлений и 103 удалений
+93 -103
Просмотреть файл
@@ -1,105 +1,62 @@
# Trade Autopilot
Сервис для анализа открытых новостей и рыночных данных с демо-счетом, CoinEx market data, AI-ботом и live-графиками.
Торговый бот-автопилот для криптобиржи CoinEx с веб-панелью администратора. Сервис в непрерывном цикле опрашивает рынки, считает технические индикаторы, формирует торговые решения и исполняет их на виртуальном демо-счёте, ведя учёт позиций, реализованного и нереализованного PnL. Предназначен для одного владельца-администратора, разворачивается на своём сервере через Docker Compose.
## Режимы
Режимов два: `demo` (виртуальный баланс, симулированные ордера — работает полностью) и `live` (реальный счёт CoinEx). Live-режим доведён до уровня «сигналы и защитные проверки работают, реальное выставление ордеров не реализовано» — подробности в разделе «Что не доделано».
- `demo` — режим по умолчанию. Виртуальный баланс, виртуальные сделки, история и PnL.
- `live` — режим работы с live-счетом. Переключается в настройках бота.
Исходный README автора сохранён в `README.upstream.md`.
## Быстрый старт
## Стек
- Python 3.12, FastAPI, Uvicorn, Pydantic Settings
- SQLAlchemy 2.0 + PostgreSQL 16 (psycopg 3), Redis 7 (объявлен в compose и настройках, в коде приложения не используется)
- httpx, websockets — HTTP и WebSocket-клиенты CoinEx; ccxt — добавлен для live-адаптера
- Frontend — один статический файл `app/static/index.html` без сборки и фреймворков
- Docker, Docker Compose
- Внешний API: CoinEx v2 — публичный HTTP (`https://api.coinex.com/v2`) и spot WebSocket (`wss://socket.coinex.com/v2/spot`)
## Структура
| Путь | Назначение |
| --- | --- |
| `app/main.py` | FastAPI-приложение, ~40 эндпоинтов `/api/v1/*`, WebSocket `/ws/market/{market}`, отдача дашборда |
| `app/core.py` | Настройки через `pydantic-settings`, свойства `live_enabled`, `markets` |
| `app/db.py` | Сессии SQLAlchemy, `init_db()` и «безопасные патчи схемы» — самописные ALTER-миграции вместо Alembic |
| `app/models.py` | 15 таблиц: демо-счёт, сделки, позиции, состояние бота, решения ИИ, новостные сигналы, логи, правила рынков, история графика, стратегии воркера, настройки CoinEx/Telegram, статус системы |
| `app/coinex.py` | HTTP-клиент CoinEx (kline, ticker, market info) и live WebSocket-стрим с HTTP-fallback |
| `app/ai_bot.py` | Основная логика бота: индикаторы, скоринг сигналов, ротация рынков, риск-чек, торговые решения |
| `app/monitor.py` | Фоновый асинхронный цикл: раз в 10 с обходит рынки, применяет решения, пишет человекочитаемый лог |
| `app/demo_account.py` | Демо-счёт: баланс, позиции, полное закрытие по рынку, расчёт realized/unrealized PnL |
| `app/legacy_bot.py` | Слой «legacy trading bot»: дашборд-KPI, открытые/закрытые сделки, стратегии, история графика |
| `app/market_rules.py` | Синхронизация торговых правил CoinEx: мин. объём, точность цены/количества, комиссии |
| `app/live_execution.py` | `LiveExecutionGuard` — проверки готовности к live-торговле перед отправкой ордера |
| `app/auth.py` | HTTP Basic-авторизация, применена ко всем эндпоинтам |
| `app/static/index.html` | Админ-панель: график свечей, KPI, позиции, лимиты, переключатель Demo/Live, логи бота |
| `scripts/fix_monitor_start.py` | Разовый патч для устранения гонки при быстром stop/start монитора на сервере |
| `Dockerfile`, `docker-compose.yml` | Образ API и сервисы api + postgres + redis |
| `project.sw` | Рабочие заметки автора: статус реализации, договорённости по UI, следующие шаги |
## Как запустить
```bash
cp .env.example .env
docker compose up --build
```
API:
```bash
curl http://localhost:8000/health
curl http://localhost:8000/api/v1/demo/account
curl "http://localhost:8000/api/v1/market/kline?market=BTCUSDT&period=1min&limit=100"
```
Dashboard:
```text
http://localhost:8000/
```
Live-график:
- История свечей грузится через CoinEx HTTP kline.
- Текущая свеча обновляется через backend WebSocket `/ws/market/{market}`.
- Backend подключается к CoinEx spot WebSocket и подписывается на сделки.
- Если WebSocket CoinEx недоступен, включается HTTP fallback.
## AI-бот
Endpoints:
```bash
curl http://localhost:8000/api/v1/bot/settings
curl "http://localhost:8000/api/v1/bot/analyze?market=BTCUSDT"
curl -X POST "http://localhost:8000/api/v1/bot/decide?market=BTCUSDT"
curl -X POST "http://localhost:8000/api/v1/bot/auto-trade?market=BTCUSDT"
```
Manual signal:
```bash
curl -X POST "http://localhost:8000/api/v1/signals/manual?title=BTC bullish news&market=BTCUSDT&sentiment=positive&score=80"
```
## Переключение Demo / Live
Через API:
```bash
curl -X POST "http://localhost:8000/api/v1/bot/settings?trade_mode=demo"
curl -X POST "http://localhost:8000/api/v1/bot/settings?trade_mode=live"
```
Через dashboard:
```text
Настройки -> Demo счет / Live счет
```
## Установка Git на сервер
Ubuntu/Debian:
```bash
sudo apt update
sudo apt install -y git ca-certificates curl
git --version
```
Клонирование:
```bash
cd /opt
sudo git clone https://github.com/viktor138irk/trade.git trade
sudo chown -R $USER:$USER /opt/trade
cd /opt/trade
```
## Docker на сервере
```bash
sudo apt update
sudo apt install -y git curl ca-certificates docker.io docker-compose-plugin
sudo systemctl enable --now docker
cd /opt/trade
cp .env.example .env
# отредактировать .env: ADMIN_PASSWORD обязательно, ключи CoinEx — при необходимости
docker compose up -d --build
```
## Обновление на сервере
Проверка:
```bash
curl http://localhost:8000/health
curl -u admin:<пароль> http://localhost:8000/api/v1/demo/account
curl -u admin:<пароль> "http://localhost:8000/api/v1/market/kline?market=BTCUSDT&period=1min&limit=100"
```
Панель: `http://localhost:8000/` (HTTP Basic).
Отдельные миграции запускать не нужно: при старте `init_db()` создаёт таблицы и применяет добавление недостающих колонок. Alembic не используется.
Обновление на сервере:
```bash
cd /opt/trade
@@ -108,16 +65,49 @@ docker compose down
docker compose up -d --build
```
## Структура
Монитор автоторговли стартует автоматически при запуске приложения; управление — `POST /api/v1/monitor/start` и `/stop`.
```text
app/
ai_bot.py monolithic AI bot logic
coinex.py CoinEx HTTP client and live WebSocket stream
core.py settings
db.py database setup
demo_account.py demo account service
models.py SQLAlchemy models
static/ live dashboard
main.py FastAPI entrypoint
```
## Конфигурация
Все переменные — из `.env` (образец в `.env.example`), значения по умолчанию — в `app/core.py`.
| Переменная | Назначение | Пример |
| --- | --- | --- |
| `APP_NAME` | Имя приложения в заголовке FastAPI | `Trade Autopilot` |
| `APP_ENV` | Метка окружения | `local` |
| `TRADE_MODE` | Режим торговли | `demo` / `live` |
| `ENABLE_LIVE_TRADING` | Второй флаг-предохранитель live-режима; live включается только при `TRADE_MODE=live` И `true` | `false` |
| `DEMO_INITIAL_BALANCE` | Стартовый виртуальный баланс | `10000` |
| `DEMO_QUOTE_ASSET` | Котируемый актив демо-счёта | `USDT` |
| `COINEX_API_BASE` | База HTTP API CoinEx | `https://api.coinex.com/v2` |
| `COINEX_WS_SPOT` | WebSocket spot CoinEx | `wss://socket.coinex.com/v2/spot` |
| `DEFAULT_MARKET` | Рынок по умолчанию для графика и запросов | `BTCUSDT` |
| `MARKET_UNIVERSE` | Стартовый список рынков; после синхронизации правил заменяется всеми активными USDT-рынками | `BTCUSDT,ETHUSDT,SOLUSDT,...` |
| `DATABASE_URL` | Строка подключения к БД; без Docker по умолчанию SQLite | `postgresql+psycopg://trade:trade@postgres:5432/trade` |
| `REDIS_URL` | Redis (сервис поднимается, приложением не используется) | `redis://redis:6379/0` |
| `COINEX_ACCESS_ID` | Access ID CoinEx для подписанных запросов | см. `.env` |
| `COINEX_SECRET_KEY` | Secret Key CoinEx | см. `.env` |
| `AUTH_ENABLED` | Включить HTTP Basic | `true` |
| `ADMIN_USERNAME` | Логин админа | `admin` |
| `ADMIN_PASSWORD` | Пароль админа; в `.env.example` стоит `admin` — обязательно заменить | см. `.env` |
Пароли PostgreSQL в `docker-compose.yml` захардкожены как `trade:trade`, порты 5432 и 6379 публикуются наружу — для сервера в интернете это нужно исправить.
## Состояние
Прототип, доведённый до рабочего состояния в демо-режиме. 87 коммитов, все датированы одним днём — 2026-05-08, последний коммит того же числа. Проект написан за один заход и с тех пор не развивался.
Demo-контур функционален: сбор рыночных данных, индикаторы, автоматические сделки, учёт позиций и PnL, живой график, авторизация, панель. Live-контур не завершён.
## Что не доделано
- **Реальное исполнение ордеров на live-счёте отсутствует.** `LiveExecutionGuard.execute_guarded_live_order()` проходит все проверки и возвращает `mode='live_adapter_pending'`, `executed=False` — низкоуровневый адаптер подписанных запросов CoinEx (`GET /assets/spot/balance`, `POST /spot/order`) не написан. Библиотека `ccxt` добавлена в зависимости, но не подключена.
- `GET /api/v1/live/account` — заглушка: реальный баланс live-счёта не отдаётся.
- Redis объявлен в настройках и compose, но в коде не используется.
- Сборщик новостей (RSS) не реализован — новостные сигналы вводятся только вручную через `POST /api/v1/signals/manual`, хотя «анализ открытых новостей» заявлен как цель проекта.
- Настройки Telegram-уведомлений есть в модели `TelegramSettings` и в UI, отправки уведомлений в коде нет.
- Тестов нет; CI нет; линтеров нет.
- Миграции — самописные ALTER-патчи в `app/db.py`; Alembic не подключён, откат схемы невозможен.
- `app/main.py` использует устаревший `@app.on_event('startup')`.
- Гонка при stop/start монитора чинится внешним скриптом `scripts/fix_monitor_start.py`, а не исправлена в коде.
- Незавершённые пункты из `project.sw`: вывод статуса синхронизации правил рынков в UI, маркеры сигналов и кривая эквити, тесты и CI.
+123
Просмотреть файл
@@ -0,0 +1,123 @@
# Trade Autopilot
Сервис для анализа открытых новостей и рыночных данных с демо-счетом, CoinEx market data, AI-ботом и live-графиками.
## Режимы
- `demo` — режим по умолчанию. Виртуальный баланс, виртуальные сделки, история и PnL.
- `live` — режим работы с live-счетом. Переключается в настройках бота.
## Быстрый старт
```bash
cp .env.example .env
docker compose up --build
```
API:
```bash
curl http://localhost:8000/health
curl http://localhost:8000/api/v1/demo/account
curl "http://localhost:8000/api/v1/market/kline?market=BTCUSDT&period=1min&limit=100"
```
Dashboard:
```text
http://localhost:8000/
```
Live-график:
- История свечей грузится через CoinEx HTTP kline.
- Текущая свеча обновляется через backend WebSocket `/ws/market/{market}`.
- Backend подключается к CoinEx spot WebSocket и подписывается на сделки.
- Если WebSocket CoinEx недоступен, включается HTTP fallback.
## AI-бот
Endpoints:
```bash
curl http://localhost:8000/api/v1/bot/settings
curl "http://localhost:8000/api/v1/bot/analyze?market=BTCUSDT"
curl -X POST "http://localhost:8000/api/v1/bot/decide?market=BTCUSDT"
curl -X POST "http://localhost:8000/api/v1/bot/auto-trade?market=BTCUSDT"
```
Manual signal:
```bash
curl -X POST "http://localhost:8000/api/v1/signals/manual?title=BTC bullish news&market=BTCUSDT&sentiment=positive&score=80"
```
## Переключение Demo / Live
Через API:
```bash
curl -X POST "http://localhost:8000/api/v1/bot/settings?trade_mode=demo"
curl -X POST "http://localhost:8000/api/v1/bot/settings?trade_mode=live"
```
Через dashboard:
```text
Настройки -> Demo счет / Live счет
```
## Установка Git на сервер
Ubuntu/Debian:
```bash
sudo apt update
sudo apt install -y git ca-certificates curl
git --version
```
Клонирование:
```bash
cd /opt
sudo git clone https://github.com/viktor138irk/trade.git trade
sudo chown -R $USER:$USER /opt/trade
cd /opt/trade
```
## Docker на сервере
```bash
sudo apt update
sudo apt install -y git curl ca-certificates docker.io docker-compose-plugin
sudo systemctl enable --now docker
cd /opt/trade
cp .env.example .env
docker compose up -d --build
```
## Обновление на сервере
```bash
cd /opt/trade
git pull
docker compose down
docker compose up -d --build
```
## Структура
```text
app/
ai_bot.py monolithic AI bot logic
coinex.py CoinEx HTTP client and live WebSocket stream
core.py settings
db.py database setup
demo_account.py demo account service
models.py SQLAlchemy models
static/ live dashboard
main.py FastAPI entrypoint
```