📖 Термины этого урока — простыми словами
Persistence (сохранение состояния) — способность бота помнить что происходило до перезапуска. Без этого каждый рестарт = чистый лист.
SQLite — простая база данных которая хранится в одном файле рядом с ботом. Не требует установки сервера. Идеальна для хранения состояния позиций.
Reconciliation (сверка) — сравнение того что бот думает о своём счёте с тем что реально есть на бирже. Делается через API биржи.
Floating PnL — нереализованная прибыль/убыток по открытой позиции. То что «плавает» пока сделка не закрыта. Может расходиться с расчётами бота.
❌ До этого урока
- Думаешь "у меня стоят стопы, я защищён"
- Paper-результаты кажутся реальной прибылью
- Не отличаешь бумажный PnL от фактически полученного
✅ После этого урока
- Знаешь про "амнезию стопов" — когда цена проходит дальше SL и убыток больше заявленного
- Понимаешь "призрачные деньги" — overshoot на paper vs реал
- Умеешь считать честный PnL с учётом проскальзывания и слипов
Кейс #4
Амнезия стопов
История
Бот торговал с трейлинг-стопом. За 3 дня стоп подтянулся с −2% до −0.4% — почти в безубыток. Ночью сервер перезагрузился (обновление системы). Бот запустился с нуля и вернул стоп на −2%. Следующее движение цены выбило позицию на 2% вниз вместо 0.4%. Потеря в 5 раз больше плана.
Диагноз
Трейлинг-стоп жил только в памяти процесса — в переменной внутри кода. Процесс умер → переменная пропала. При рестарте бот видит открытую позицию на бирже но не помнит до куда дотянул стоп. Устанавливает начальное значение как будто только открыл позицию.
❌ Как было
trailing_stop = -0.02
# живёт в памяти
# при рестарте = -0.02 снова
✓ Как надо
positions.db → таблица
symbol, entry, current_stop
при старте — загрузить из базы
Промпт для Claude Code
👤 Ты
Добавь сохранение состояния открытых позиций в SQLite базу. Бот должен при каждом обновлении трейлинг-стопа записывать в базу: символ, цена входа, текущий уровень стопа, время обновления. При запуске — загружать открытые позиции из базы а не начинать с нуля. Если в базе есть позиция которой нет на бирже — логировать и удалять из базы.
Как проверить
- Открой бота, дождись пока стоп подтянется хоть раз
- Останови бота — проверь что в базе записан актуальный уровень стопа
- Запусти снова — бот должен продолжить с сохранённым стопом а не сбросить
- В логах при старте: «Загружено N открытых позиций из базы»
Кейс #5
Призрачные деньги
История
Панель бота показывала +$6.15 по позиции BTR/USDT. Биржа показывала −$54.57 по той же монете. Разница $60 — без объяснений. Бот был уверен что зарабатывает. На самом деле — нет.
Диагноз
Бот считал PnL по своей логике: брал цену из внутреннего кеша, умножал на размер позиции из собственного словаря. Биржа считала иначе: включала фандинг-рейт, комиссии, частичные исполнения ордеров. Два расчёта существовали параллельно и никогда не сравнивались. Правда была только у биржи.
⚠️ Золотое правило
Источник истины о деньгах — всегда биржа, а не твой код. Всё что считает бот — это его предположение. Единственный способ знать реальный результат — запросить биржу напрямую.
Промпт для Claude Code
👤 Ты
Добавь в бота ежечасную сверку с биржей. Раз в час запрашивать реальный баланс счёта и реальные позиции через API биржи. Сравнить с тем что думает бот. Если расхождение больше $1 — записать в лог «РАСХОЖДЕНИЕ: бот думает X, биржа говорит Y» и отправить алерт в Telegram. Также в панели показывать два числа рядом: «По боту» и «По бирже» — чтобы я сразу видел если они расходятся.
Как проверить
- В панели появились два числа: «По боту» и «По бирже»
- Числа совпадают (или разница в пределах нескольких центов)
- Проверь лог через час — должна быть запись о плановой сверке
- Намеренно введи ошибку в расчёт бота — алерт должен прийти в Telegram
📍 Пять из семи
Амнезия стопов и призрачные деньги — оба про доверие. Бот думает одно, реальность — другое. Решение одинаковое: не доверять памяти процесса, сверяться с внешним источником правды. В следующем уроке — последние два кейса и финал курса.