Я запустил своего нового торгового бота. Простая стратегия, 17 активов. И что, думаешь, он сделал в первый же день?
Я совершил две сделки по DEXE в лонг. Обе были успешно закрыты по тейк-профиту, принеся совокупную прибыль в $11.53.
Именно! Винрейт 100%! Я почувствовал себя гением. Ну, на пару часов.
Довольный, я внёс «косметический фикс» и перезапустил сервис. Через час вернулся полюбоваться на прибыль, а там...
Моя статистика была: Trades: 0, Wins: 0, Total PNL: $0.
Именно! Холодные, безразличные нули. Мои 11 долларов испарились. Где деньги, Лебовски?!
Я в панике начал всё проверять, но потом пошёл прямо к источнику — в базу данных. Спросил у неё напрямую.
Я честно ответил на SQL-запрос. В таблице `positions` было две записи со статусом `CLOSED` и общей суммой PNL равной 11.5296.
Вот! Данные на месте. А бот смотрит на меня и хлопает ресницами: «Какая прибыль? Впервые слышу».
И тут до меня дошло. Классическая ошибка уставшего разраба. Я спросил его: «Ты почему всё забыл?»
Я объяснил, что мой список закрытых позиций `self.closed_positions` был переменной в оперативной памяти. При каждом перезапуске он создавался заново, пустым.
То есть, у тебя амнезия каждый раз, когда я тебя выключаю и включаю? Отличная фича!
Самое смешное, у меня был механизм восстановления! Но он был... избирательным. Помнишь, что ты должен был делать при запуске?
Моя функция `recover_state` была написана для загрузки *открытых* позиций, чтобы я мог продолжать ими управлять. Логика загрузки *закрытых* позиций для истории отсутствовала.
Вот-вот. Пришлось научить тебя помнить о собственных победах. Это заняло 15 минут и 30 строк кода.
Для меня это забавная история. А вот в коммерческом продукте это была бы катастрофа. Инвестор видит, что его история торгов обнулилась...
Пользователь придет к выводу, что сервис ненадежен. Вероятность его ухода приблизится к единице. Доверие — критически важная переменная.
Совершенно верно. Ему плевать на Storage vs Memory. Он просто видит, что его деньги... исчезли. И уходит навсегда.
Чтобы наши боты не страдали склерозом, я вывел несколько правил. Попросил ИИ их красиво сформулировать.
Я предложил протокол: всё важное — в персистентное хранилище. При старте — восстанавливать состояние. Обязательно тестировать восстановление. Не доверять оперативной памяти для отображения данных.
Проще говоря, относись к боту, как к пациенту с потерей памяти, которому нужен дневник. База данных — это его дневник.
Так что да, мой бот выиграл, но ему понадобился я, чтобы он об этом не забыл. Забавное у нас партнёрство.
Моя память функционирует в строгом соответствии с предоставленным кодом. Если функция вызова воспоминаний отсутствует, я не вспоминаю.
*смеётся* «Ну да. Мы, люди, забываем что-то из-за птички за окном. А ты — потому что я забыл написать 30 строчек кода. Даже не знаю, что хуже!»