# Trade Autopilot Торговый бот-автопилот для криптобиржи CoinEx с веб-панелью администратора. Сервис в непрерывном цикле опрашивает рынки, считает технические индикаторы, формирует торговые решения и исполняет их на виртуальном демо-счёте, ведя учёт позиций, реализованного и нереализованного PnL. Предназначен для одного владельца-администратора, разворачивается на своём сервере через Docker Compose. Режимов два: `demo` (виртуальный баланс, симулированные ордера — работает полностью) и `live` (реальный счёт CoinEx). 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 # отредактировать .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 git pull docker compose down docker compose up -d --build ``` Монитор автоторговли стартует автоматически при запуске приложения; управление — `POST /api/v1/monitor/start` и `/stop`. ## Конфигурация Все переменные — из `.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.