diff --git a/README.md b/README.md index be8aa53..c245f40 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/README.upstream.md b/README.upstream.md new file mode 100644 index 0000000..be8aa53 --- /dev/null +++ b/README.upstream.md @@ -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 +```