PullbackTrader — это minimal production-like runtime-каркас для real-time торговли по стратегии Trend + Pullback на BTCUSDT 5m.
Проект не заменяет исследовательский notebook и не предназначен для бэктестинга. Его задача — перенести уже существующую notebook-логику в понятную runtime-архитектуру, которую потом можно подключать к paper execution и далее к live execution.
Бот работает по закрытой свече и делает следующее:
- получает и обновляет market data
- поддерживает буфер свечей
- считает signal структуры, а не просто
bool - рассчитывает размер позиции по
risk_per_trade - передаёт ордерные команды в execution layer
- хранит state в JSON
- пишет сигналы и сделки в CSV
Это runtime skeleton, а не готовая live-trading система.
Перед live trading обязательно проверить:
- эквивалентность расчётов notebook/runtime
- модель исполнения ордеров и фактические fill prices
- комиссии, slippage, tick size и lot size
- восстановление после рестарта
- reconciliation локального состояния с exchange state
Trend + Pullback — это вход по направлению уже существующего восходящего движения, но не в момент перегретого импульса, а после контролируемого отката.
Почему стратегия не ловит дно и не гонится за ценой:
- она не покупает только из-за падения
- она не входит в любой сильный зелёный бар
- ей нужен уже подтверждённый тренд и затем откат
Почему используются фильтры тренда, волатильности и объёма:
- тренд-фильтр отсеивает сделки против доминирующего движения
- ATR-фильтр исключает слишком вялые и слишком хаотичные режимы
- volume ratio фильтр добавляет требование по рыночной активности
В чём смысл breakout trigger:
- после pullback стратегия ждёт признак возобновления импульса
- для этого используется пробой
micro high - это снижает число преждевременных входов внутри незавершённого отката
Сильные стороны стратегии:
- работа по направлению тренда
- отсутствие попыток ловить разворот с нуля
- формализованный risk management
Слабые стороны стратегии:
- возможны пропуски быстрых разворотов
- боковик ухудшает качество сигналов
- результат чувствителен к исполнению и параметрам фильтров
В каталоге проекта сохранён Strategy.ipynb.
Важно:
- production-реализация сохраняет ту же логику, что и research/backtest notebook
- runtime-код является адаптацией notebook-логики под real-time исполнение
- notebook не переписывается и не заменяется этим проектом
- все изменения касаются архитектуры и operational concerns, а не торговой идеи
Смысл логики не изменён:
- long-only модель
- trend filter:
close > EMA slowиEMA slow slope > 0 - pullback от локального high
- фильтр расстояния до fast EMA
- ATR filter
- volume ratio filter
- breakout trigger по
micro high - stop-loss
- take-profit по
RR - timeout по количеству баров
- sizing через
risk_per_trade
PullbackTrader/
├── Strategy.ipynb
├── pullback_trader/
│ ├── __init__.py
│ ├── app.py
│ ├── config.py
│ ├── models.py
│ ├── market.py
│ ├── strategy.py
│ ├── execution.py
│ ├── storage.py
│ └── utils.py
├── README.md
├── requirements.txt
├── .env.example
├── Dockerfile
├── docker-compose.yml
├── assets/
│ └── logo.svg
├── data/
├── logs/
└── state/
pullback_trader/app.py— главный entrypoint и runtime looppullback_trader/config.py— единая конфигурация и чтение.envpullback_trader/models.py— моделиCandle,Signal,PositionState,OrderResult,BotStatepullback_trader/market.py— initial history, closed-candle polling, обновление буфераpullback_trader/strategy.py— ядро стратегии без зависимости от execution layerpullback_trader/execution.py—BaseExecutionClient,PaperExecutionClient,LiveExecutionClientpullback_trader/storage.py— JSON state и CSV логиpullback_trader/utils.py— logger, safe float, rounding, time helpers
Runtime-реализация сохраняет порядок проверок из notebook:
-
Тренд-фильтр:
close > ema_slowema_slow_slope > 0
-
Pullback:
- рассчитывается откат от предыдущего локального high на окне
swing_window - откат должен быть в диапазоне
pullback_min_pct .. pullback_max_pct - сохраняется условие по расстоянию до
ema_fastв том же виде, что и в notebook
- рассчитывается откат от предыдущего локального high на окне
-
Фильтры:
ATR / closeдолжен быть в диапазонеmin_atr_pct .. max_atr_pctvolume / SMA(volume)должен быть не нижеmin_volume_ratio
-
Trigger:
- если
use_breakout_trigger=true, нуженclose > micro_high - иначе используется альтернативный trigger через
ema_fast, как в notebook
- если
-
Выход:
- сначала
stop-loss - затем
take-profit - затем
timeout
- сначала
ema_fast— период быстрой EMAema_slow— период медленной EMA, определяющей основной трендatr_period— период ATRvolume_window— окно SMA для расчёта volume ratioswing_window— окно для локального high/lowslope_lookback— сколько баров назад используется для оценки slope медленной EMApullback_min_pct— минимальный допустимый откат от локального highpullback_max_pct— максимальный допустимый откат от локального highmax_close_above_fast_ema_pct— параметр условия расстояния до fast EMA, перенесённый без смены смыслаmin_volume_ratio— минимальное значениеvolume / SMA(volume)min_atr_pct— нижняя границаATR / closemax_atr_pct— верхняя границаATR / closeuse_breakout_trigger— использовать ли breakout поmicro highrisk_per_trade— доля свободного cash, которую допускается рискнуть в одной сделкеrr_target— множитель Risk/Reward для take-profitatr_stop_mult— множитель ATR для ATR-based stopmax_bars_in_trade— максимальное количество баров в позиции
Linux/macOS:
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
python -m pullback_trader.appWindows PowerShell:
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env
python -m pullback_trader.apppullback_trader/app.py делает следующее:
- Загружает конфиг и локальный state
- Загружает history buffer для прогрева индикаторов
- Если бот перезапущен, пытается обработать пропущенные закрытые свечи
- Ждёт следующую закрытую свечу
- Обновляет буфер
- Вызывает
strategy.evaluate(...) - На entry считает quantity по той же risk logic, что и в notebook
- Отправляет сигнал в execution client
- Сохраняет
state/bot_state.json - Пишет сигналы и сделки в CSV
Сейчас доступны два execution-режима:
PaperExecutionClient— рабочий paper modeLiveExecutionClient— skeleton для будущей интеграции с биржей
Переключение:
PAPER_MODE=trueПри этом pullback_trader/strategy.py не зависит от конкретного execution adapter.
Локальное состояние хранится в:
state/bot_state.json
В state сохраняются:
- последняя обработанная свеча
- локальный cash
- текущая позиция
- timestamps последней синхронизации и ордера
- флаги
kill_switchиrecovery_required
Важно: в будущем при live execution exchange state должен быть приоритетнее локального state. Для этого оставлен метод sync_state().
data/signals.csv— сигналы стратегии на закрытых свечахdata/trades.csv— факты исполнения ордеровlogs/pullback_trader.log— runtime лог приложения
Это нужно для:
- проверки paper trading
- сверки поведения с notebook
- разбора ошибок и рестартов
Собрать образ:
docker build -t pullback-trader .Запустить через Docker Compose:
docker compose up --build -dГде будут логи и состояние:
./logs./state./data
Остановить сервис:
docker compose down