Python-бот для USDT-M futures на HTX. Текущая конфигурация запускает стратегию
btc_countertrend_grid_v1 в одном combined-процессе с отдельными long/short
профилями. BTC используется как бенчмарк и не входит в торговую вселенную.
Торговля фьючерсами связана с высоким риском. Репозиторий не является инвестиционной рекомендацией. Конфигурация по умолчанию имеет
MODE=PRODUCTIONиdry_run=False, поэтомуpython bot.pyнельзя использовать как проверку установки. Для разработки и тестов отключайте чтение локального.envи не передавайте реальные ключи.
Публичный релизный номер задаётся только в pyproject.toml; до появления
соответствующего Git-тега изменения считаются Unreleased. История изменений
ведётся в CHANGELOG.md, порядок выпуска — в
RELEASING.md.
Подробная логика входа, экономического preflight, sizing, защитных ордеров и выходов описана в strategies/btc_countertrend_grid_v1/strategy.md.
Фактическая точка входа — bot.py. config.py сначала читает глобальное имя
из STRATEGY/HTXBOT_STRATEGY, затем загружает
strategies/<name>/settings.py. htxbot.app проверяет plugin contract и
собирает HtxFuturesBot из нейтрального движка и mixin-классов стратегии.
CombinedEngine разрешает профили из --profiles или BOT_PROFILES (по
умолчанию long,short), а выбранный пакет добавляет hooks своего цикла.
bot.py
└── STRATEGY -> strategies/<name>/plugin.py
└── CombinedEngine + strategy combined hooks
├── long HtxFuturesBot (position=long, entry=buy, exit=sell)
└── short HtxFuturesBot (position=short, entry=sell, exit=buy)
├── shared HTX exchange wrapper and public market-data cache
├── shared ticker WebSocket and private account snapshot
├── shared symbol reservations and mandatory state persistence
├── strategy capability: equity guard / hedge / shared ranking
└── separate state, lock, profile telemetry and direction rules
Combined-режим проверяет совместимость credentials/account routing,
dry_run, margin mode, leverage, HTX v5 и heartbeat. Перед обработкой каждого
профиля private caches сбрасываются, биржевой snapshot обновляется, а символы с
позицией или профильными ордерами другого направления резервируются. Один
combined PID нормально владеет обоими профильными runtime locks.
Основные модули:
config.py— credentials/profile/runtime resolution и загрузка settings выбранной стратегии; экспортирует только нейтральные имена (STRATEGY_SETTINGS,DEFAULT_STRATEGY_COINS,STRATEGY_REPLACEMENT_COINS);htxbot/strategy_contract.pyиhtxbot/strategy_loader.py— безопасный версионированный plugin contract, discovery и fail-fast validation;htxbot/app.py,htxbot/runner.py— нейтральный профильный движок: setup, private sync, lifecycle hooks, heartbeat и сохранение state;htxbot/execution_safety.py— обязательные для всех стратегий reduce-only, position-size, flat cleanup и adoption неизвестных close orders;htxbot/combined_engine.pyиhtxbot/combined.py— engine-owned lifecycle, shared exchange/private snapshot, locks, reservations и стабильный import;strategies/btc_countertrend_grid_v1/— текущие settings, signals, ranking, entry/exit/risk/stop и combined orchestration;strategies/xsec_reversion_v1/— отдельная cross-sectional reversion стратегия со своей спецификацией и state model;strategies/ema_pullback_lermont/— изолированный адаптер EMA Pullback изLermont/HTX-crypto-botс pinned upstream commit и лицензией;strategies/example_minimal/— безопасный минимальный шаблон для нового plugin-пакета;htxbot/state.py— persistedTradeState, миграции и reconciliation после рестарта;htxbot/exchange.pyиhtxbot/htx_v5.py— precision, contracts, HTX API и классификация ошибок;htxbot/monitoring.pyиhtxbot/sqlite_storage.py— события и аналитическая телеметрия;analysis/— read-only отчёты и воспроизводимые исследования;tests/— unit/regression-тесты на mock/stub exchange без live-ордеров. Дерево повторяет исходное:tests/engine/— движок иconfig.py,tests/strategies/<name>/— конкретная стратегия,tests/analysis/— исследовательские скрипты,tests/conformance/— strategy-agnostic acceptance kit, который обязан проходить для любой стратегии.
bash build.shСтавит системные пакеты (Python, C-библиотеку TA-Lib, инструменты сборки),
создаёт venv, устанавливает зависимости, готовит .env и проверяет результат
прогоном conformance-набора. Идемпотентен, перед установкой системных пакетов
спрашивает подтверждение. Флаги: --docker, --venv, --data-dir,
--skip-tests, --yes.
bash build.sh --docker
# Review .env and the live account; set DRY_RUN=false only when authorized.
docker compose up -dСборка сама прогоняет conformance внутри образа: битый образ не соберётся.
python -m venv .venv
.\.venv\Scripts\python -m pip install --upgrade pip
.\.venv\Scripts\python -m pip install -e ".[dev]"
$env:HTXBOT_DISABLE_DOTENV = "1"
.\.venv\Scripts\python -m compileall .
.\.venv\Scripts\python scripts/check_imports.py
.\.venv\Scripts\python -m pytest -q
Remove-Item Env:HTXBOT_DISABLE_DOTENVHTXBOT_DISABLE_DOTENV=1 не меняет .env: он только запрещает config.py
читать его в текущем процессе. Тесты используют временные каталоги и заглушки;
реальный HTX API им не требуется.
- Скопируйте
.env.exampleв локальный.envтолько в окружении, где действительно нужен доступ к HTX. Шаблон содержитDRY_RUN=true, поэтому standalone-запуск fail-closed откажется создавать live-клиент. Меняйте это значение наfalseтолько после отдельной проверки аккаунта, routing, позиций и открытых ордеров. - Укажите
STRATEGY=btc_countertrend_grid_v1,xsec_reversion_v1илиema_pullback_lermont. Храните в.envcredentials, account-to-coin routing и инфраструктурные параметры. Торговые и риск-параметры находятся вstrategies/<STRATEGY>/settings.py. - Не коммитьте
.env, profile snapshots, state, locks, event logs, SQLite и market-data archives — они исключены через.gitignore.
Ключевые профильные инварианты:
| Профиль | Position side | Entry side | Exit side | State |
|---|---|---|---|---|
long |
long |
buy |
sell |
long/bot_futures_state.json |
short |
short |
sell |
buy |
short/bot_futures_short_state.json |
Оба профиля по умолчанию используют cross margin, одно согласованное плечо, общий heartbeat и общую SQLite telemetry database. Один символ не должен одновременно принадлежать разным аккаунтам или обоим направлениям combined процесса.
Пакет strategies/<name>/ экспортирует settings.py и plugin.py. Plugin
объявляет bot hooks, optional combined hooks, runtime_timeframe, capabilities
и optional dataclass для собственного persisted state. Поля этой dataclass
хранятся в TradeState.strategy_state; движок мигрирует старые top-level поля и
fail-closed отказывается интерпретировать открытую позицию как состояние другой
стратегии.
Стратегия отвечает за сигнал, отбор, sizing и способ выхода. Движок всегда
владеет credentials/profile resolution, exchange transport, precision,
runtime locks, state I/O, private sync, базовой проверкой close orders,
combined lifecycle и shutdown. Combined mixin не может переопределить
__init__, setup, run_once, run, locks/reservations или persistence.
Все перечисленные ниже файлы создаются заново и не являются содержимым репозитория:
| Путь | Назначение |
|---|---|
long/, short/ |
state, locks, config snapshots, CSV/JSONL fallback и архивы профилей |
data/bot_telemetry.sqlite3* |
основная аналитическая телеметрия и WAL sidecars |
market_data/ |
локальные candle archives при включённом архивировании |
combined_equity_guard.json |
атомарный high-water/daily-loss state двух профилей |
bot_heartbeat.txt |
liveness combined-процесса |
watchdog.log, bot_child.log |
события watchdog и stdout/stderr дочернего процесса |
Persisted trading state и runtime locks намеренно остаются отдельными от SQLite: потеря аналитической базы не должна менять восстановление позиции или order management. Подробнее: docs/sqlite_storage.md.
Команда прямого запуска:
python bot.py --profiles long,shortWatchdog запускает тот же combined-процесс и контролирует heartbeat:
python bot_watchdog.pyЭти команды могут выйти на реальный аккаунт. Перед любым live-запуском отдельно проверьте API permissions, account routing, one-way position mode, cross margin, доступное плечо, risk tiers, существующие позиции и все неизвестные/скрытые close orders. Не запускайте второй экземпляр поверх живых locks.
После рестарта корректность подтверждается не только наличием процесса. Нужны новый PID, оба lock-файла с тем же владельцем, свежий heartbeat, оба config snapshot/state, успешная private sync и наблюдаемая защита открытых позиций.
SQLite — основной analytical sink. Постоянный CSV dual-write по умолчанию
выключен; trade/cycle/candle CSV используется как fallback при ошибке записи
SQLite, а rich JSONL остаётся аварийным человекочитаемым следом. Аналитические
скрипты открывают базу read-only через mode=ro и query_only.
python scripts/sqlite_telemetry.py verify --full
python analysis/journal_report.py --hours 24
python analysis/horizon_report.py --database D:\path\to\snapshot.sqlite3- strategies/btc_countertrend_grid_v1/strategy.md — спецификация и safety invariants bundled-стратегии;
- strategies/xsec_reversion_v1/strategy.md — спецификация cross-sectional reversion стратегии;
- docs/xsec_reversion_spec.ru.md — исследование и ограничения, из которых выросла xsec-реализация;
- docs/sqlite_storage.md — SQLite schema, import, verification, backup и read-only reports;
- docs/HTX_V5_API.md — локальная выдержка по используемым HTX v5 endpoints;
- docs/engine_api.md и docs/strategy_parameters.md — plugin contract API v2 и манифест настраиваемых параметров стратегии;
- docs/deployment.md — установка, Docker и проверка развёртывания;
- CHANGELOG.md и RELEASING.md — изменения и воспроизводимый порядок подготовки тега/GitHub Release;
- CONTRIBUTING.md — архитектурные границы, безопасная разработка и PR checklist;
- SECURITY.md — приватная отправка security-отчётов и правила обращения с утёкшими credentials;
- docs/history/ — архив: ТЗ предыдущей impulse-итерации (на его
разделы ссылаются пометки
ТЗ §Nв коде стратегии) и обзор отличий от старой публичной версии. Ничто в этом каталоге не описывает активную стратегию.