docs: подробный README (разбор проекта при переносе в Gitea)
Старый README сохранён как README.upstream.md.
Этот коммит содержится в:
+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.
|
||||
|
||||
@@ -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
|
||||
```
|
||||
Ссылка в новой задаче
Block a user