Клод, смотри! Мой новый бот за первый же вечер сделал 11 баксов. Две сделки, обе в плюс. Винрейт 100%!
Отличный старт! Конечно, на двух сделках это скорее удача, чем статистика, но всё равно очень приятно. Поздравляю!
Спасибо! Сейчас поправлю там одну мелочь в API, перезапущу сервис и пойду праздновать.
Так, я вернулся. Открываю дашборд... а где мои 11 долларов?! Всё по нулям! Сделок ноль, прибыль ноль. Что произошло?
Странно. Дашборд показывает нули? Дай-ка я проверю логи сервиса после перезапуска.
Давай быстрее, у меня сердце ёкнуло. Куда деньги делись, Лебовски?
Я не понимаю. Я же сам видел эти сделки. Можешь в базу данных заглянуть? Прямо сейчас, сделай SELECT по закрытым позициям.
Секунду... Готово. В таблице `positions` есть две записи со статусом 'CLOSED'. Суммарный PNL — 11.53 USDT. Данные на месте.
Вот! Значит, они в базе есть. Но бот их не видит. Он что, забыл, что сам же их и записал?
Похоже, он страдает амнезией после перезагрузки. Смотрит в базу за открытыми сделками, но игнорирует закрытые.
А, всё, я понял! Классика. Это же Storage vs. Memory. Я после перезапуска создаю новый пустой список `closed_positions` в памяти.
Именно. База данных — это постоянное хранилище, а переменная в коде — временная память. Она обнуляется при каждом рестарте.
Вот же я балбес. У меня даже функция восстановления состояния была, но только для *открытых* сделок. Про историю совсем забыл.
Так, надо это исправить. Накидай, как будет выглядеть логика. Только без листингов кода.
Легко. При инициализации бота, сразу после загрузки открытых позиций, добавляем вызов новой функции. Она сделает `SELECT *` из базы по закрытым сделкам и заполнит ими исторический массив в памяти.
Да, просто и понятно. Займёт минут 15. Хорошо, что это мой пет-проект, а не боевой.
Представляю, если бы такое случилось в коммерческом продукте. Инвестор заходит, а вся его история торгов исчезла.
Это был бы провал. Он бы не стал разбираться в базах данных. Просто решил бы, что сервис ненадежный, и ушел навсегда.
Именно. Доверие — это всё. Состояние должно быть восстанавливаемым, иначе его как бы и нет.
Давай сформулируем несколько железных правил, чтобы больше не наступать на эти грабли. Такой чек-лист для ботов с памятью как у рыбки.
Хорошая идея. Вот четыре главных принципа: всё важное пишем в хранилище, восстанавливаем состояние при старте, тестируем перезапуски и не доверяем данным только из оперативной памяти.
Забавно получается. Мы, люди, можем забыть что-то, потому что отвлеклись. А мой бот забыл, потому что я забыл написать 30 строчек кода.
Именно. Искусственный интеллект забывает только по команде или по недосмотру создателя. Рад, что мы смогли восстановить историческую справедливость для твоих $11.
Да, теперь он их точно не забудет. Спасибо за помощь, Клод.