Skip to content

DmitriiBobreshev/bnx

Repository files navigation

BaronEx

Поддерживаемые биржи

  • Binance — SPOT пары через REST API
  • Bybit — SPOT пары через REST API

Реализовано добавление новых бирже через декоратором @register с авто дискавери при старте.

Стек

  • Python 3.13, FastAPI, SQLModel, asyncpg
  • PostgreSQL 17
  • APScheduler (фоновый поллинг)
  • httpx (async HTTP)
  • Alembic (миграции)
  • Docker Compose

Быстрый старт

cp .env.example .env
docker compose up --build

API: http://localhost:8000. Swagger: http://localhost:8000/docs.

API

GET /api/health/

Healthcheck + db connect

GET /api/v1/market/pairs?symbol=BTCUSDT&symbol=ETHUSDT

Возвращает агрегированные курсы со всех бирж для запрошенных пар.

Запрошенные пары автоматически добавляются в список поллинга для сбора исторических данных.

Фоновые задачи

Задача Интервал Описание
poll_tick MARKET_POLL_INTERVAL (10с) Собирает курсы по всем отслеживаемым парам, записывает снапшоты
reload_all_pairs PAIRS_REFRESH_INTERVAL (600с) Обновляет список доступных пар с каждой биржи

Конфигурация

Настройки задаются через переменные окружения (префикс BARONEX_ или напрямую в .env):

Переменная По умолчанию Описание
DATABASE_URL postgresql+asyncpg://baronex:baronex@localhost:5432/baronex Строка подключения к БД
TITLE BaronEx Название приложения
HTTP_TIMEOUT 5.0 Таймаут httpx клиента (секунды)
LOG_LEVEL INFO Уровень логирования
MARKET_POLL_INTERVAL 10.0 Интервал поллинга тикеров (секунды)
PAIRS_REFRESH_INTERVAL 600.0 Интервал обновления списка пар (секунды)

Структура проекта

app/
├── main.py              # Lifespan, scheduler, фабрика приложения
├── core/
│   ├── config.py        # Настройки (pydantic-settings)
│   └── database.py      # Async engine и сессии
├── api/
│   ├── deps.py          # DI фабрики (MarketServiceDep, PollerServiceDep)
│   └── routes/
│       ├── health.py
│       └── v1/market.py
├── models/
│   ├── domain/          # Ticker, TradingPair (dataclasses)
│   ├── api/             # Request/response Pydantic модели
│   ├── db/              # SQLModel таблицы (PolledPair, TickerSnapshot)
│   └── providers/       # TypedDict схемы для API бирж
├── providers/
│   ├── base.py          # BaseProvider ABC + реестр
│   ├── binance.py
│   └── bybit.py
└── services/
    ├── market.py        # Логика агрегации курсов
    └── poller.py        # Фоновый сервис поллинга

Разработка

# Тесты
uv run pytest

# Линтинг и форматирование
uv run ruff check --fix .
uv run ruff format .

# Проверка типов
uv run pyright

# Миграции
uv run alembic upgrade head

Что можно улучшить

— Автоматическая очистка старых ticker_snapshots (партиционирование по дате или cron на DELETE)

  • Вынести трейдинг пары бирж в redis, если нужно поддерживать несколько инстансов(горизонтальное масштабирование)
  • Больше покрытие тестам(текущие только как пример)

About

bnx

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors