Локальний моніторинг TradFi-інструментів поверх криптобіржових маркетів з фокусом на Bybit. Проєкт збирає каталог інструментів, нормалізує символи, підписується на публічні WebSocket-потоки й віддає актуальні ціни через CLI, HTTP API та WebSocket.
- відкривати каталог TradFi/RWA-інструментів на
Bybit,GateіBitget - нормалізувати різні біржові символи до спільного формату на кшталт
TSLAUSDT - стрімити
bid / ask / lastпо одному або кількох символах - працювати як JSON-first CLI для локальної автоматизації
- піднімати локальний FastAPI-сервіс без авторизації
Актуальна реалізація знаходиться в src/tradfi_monitor/:
discovery/bybit.py- discovery і REST-допоміжні методи для Bybitprice/clients/- окремі стрімінгові клієнти для Bybit, Gate, Bitgetprice/hub.py- єдиний хаб, який зводить оновлення з усіх біржservice/- локальний HTTP/WebSocket шар на FastAPIcli.py- CLI інтерфейсscanner.pyіscripts/run_monitor.py- швидкий локальний запуск
Історичний код з UI, трейдингом і старими артефактами перенесений у legacy/ і не є частиною активного runtime.
- Python
3.12 - доступ у мережу до публічних REST/WebSocket endpoint'ів бірж
У репозиторії поки немає pyproject.toml, тому базові залежності винесені в requirements.txt.
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txthttpx потрібен для тестів API, pytest для unit-тестів.
Моніторити весь доступний маркет:
python .\scripts\run_monitor.pyМоніторити один символ:
python .\scripts\run_monitor.py TSLAUSDTЗапускати пакет напряму:
$env:PYTHONPATH = (Resolve-Path .\src)
python -m tradfi_monitor watch TSLAUSDT --limit 5Основна точка входу:
python .\scripts\run_monitor.py --helpПідтримувані команди:
list-symbolsvalidate-symbolsubscribe-manywatchwatch-manyserve
Приклади:
python .\scripts\run_monitor.py list-symbols
python .\scripts\run_monitor.py list-symbols --exchange bybit --group Stocks --query TSLA
python .\scripts\run_monitor.py validate-symbol TSLAUSDT
python .\scripts\run_monitor.py subscribe-many TSLAUSDT AAPLUSDT --wait-for-data
python .\scripts\run_monitor.py watch TSLAUSDT --limit 10
python .\scripts\run_monitor.py watch-many TSLAUSDT AAPLUSDT --limit 20
python .\scripts\run_monitor.py serve --host 127.0.0.1 --port 8000watch і watch-many друкують JSON-рядки з подіями типу subscribed та price, тому їх зручно використовувати у скриптах.
Після запуску:
python .\scripts\run_monitor.py serveСервіс доступний за замовчуванням на http://127.0.0.1:8000.
Swagger UI:
http://127.0.0.1:8000/docshttp://127.0.0.1:8000/redoc
Основні endpoint'и:
GET /healthGET /symbolsGET /symbols/{symbol}/validatePOST /subscriptionsGET /prices/latestGET /stream-statusWS /ws/prices?symbols=TSLAUSDT,AAPLUSDT
Приклади:
curl "http://127.0.0.1:8000/symbols?exchange=bybit&group=Stocks&query=TSLA"
curl "http://127.0.0.1:8000/symbols/TSLAUSDT/validate"
curl "http://127.0.0.1:8000/prices/latest?symbols=TSLAUSDT,AAPLUSDT&wait_for_data=true"Тіло для POST /subscriptions:
{
"symbols": ["TSLAUSDT", "AAPLUSDT"],
"wait_for_data": true,
"timeout": 10.0
}WebSocket надсилає повідомлення двох основних типів:
subscribed- результат підписки та перелік прийнятих/відхилених символівprice- нормалізований snapshot з біржі
Під час простою сервер може надсилати heartbeat.
Проєкт працює з нормалізованими символами, але зберігає сирі біржові ідентифікатори:
- Bybit:
TSLA.S,TSLA,TSLA+->TSLAUSDT - Gate:
TSLAX_USDT,TSLAON_USDT->TSLAUSDT - Bitget:
TSLAUSDT->TSLAUSDT
Це дозволяє:
- підписуватись на зручний символ для автоматизації
- не втрачати raw symbol для дебагу або майбутнього order-routing
.
|-- docs/
| `-- plans/
|-- legacy/
| |-- artifacts/
| |-- scripts/
| |-- tests/
| |-- trading/
| `-- ui/
|-- scripts/
| `-- run_monitor.py
|-- src/
| `-- tradfi_monitor/
| |-- discovery/
| |-- price/
| | |-- clients/
| | |-- common.py
| | `-- hub.py
| |-- service/
| |-- cli.py
| `-- scanner.py
`-- tests/
`-- unit/
Signed MT5 requests now read credentials from local environment variables instead of keeping them in the repository.
$env:BYBIT_API_KEY = "your-bybit-api-key"
$env:BYBIT_API_SECRET = "your-bybit-api-secret"
python .\scripts\run_monitor.pyFor manual legacy diagnostics, use the same environment variables before running
legacy/tests/test_auth.py directly.
Підняти локальний HTTP/WebSocket сервіс у контейнері:
docker compose up -d --buildСервіс буде доступний на http://127.0.0.1:8000.
Базова перевірка контейнера:
curl http://127.0.0.1:8000/health
docker compose psОчікуваний health response:
{"ok": true}Перевірений smoke-check API:
curl "http://127.0.0.1:8000/symbols?exchange=bybit&group=Stocks&query=TSLA"
curl "http://127.0.0.1:8000/symbols/TSLAUSDT/validate"
curl "http://127.0.0.1:8000/prices/latest?symbols=TSLAUSDT&wait_for_data=true&timeout=15"Перевірений CLI всередині контейнера:
docker compose exec -T app python -m tradfi_monitor validate-symbol TSLAUSDT
docker compose exec -T app python -m tradfi_monitor watch TSLAUSDT --limit 1/symbols, /prices/latest, watch і WebSocket сценарії потребують виходу з контейнера до публічних REST/WebSocket endpoint'ів бірж.
Корисні команди:
docker compose ps
docker compose logs -f app
docker compose down$env:PYTHONPATH = (Resolve-Path .\src)
python -m pytest .\tests\unit -qПоточні unit-тести покривають:
- CLI
- discovery Bybit
- multi-exchange price hub
- FastAPI transport layer
- service manager
- HTTP-сервіс локальний і навмисно не має auth-шару.
- Основний сценарій проєкту зараз це моніторинг, а не трейдинг.
- Частина історичних сценаріїв збережена в
legacy/, але не повинна вважатися production-runtime. - У
src/tradfi_monitor/discovery/bybit.pyє dev-only helper для MT5 account status, який читає ключі тільки зі змінних середовища. Для локальної розробки використовуйтеBYBIT_API_KEYіBYBIT_API_SECRET, не зберігаючи їх у репозиторії.
- дизайн-нотатки:
docs/plans/ - активні тести:
tests/unit/ - основна сервісна логіка:
src/tradfi_monitor/service/manager.py - інтеграція бірж:
src/tradfi_monitor/price/clients/