1
00:00:00,000 --> 00:00:09,050
Клод, смотри! Мой новый бот за первый же вечер сделал 11 баксов. Две сделки, обе в плюс. Винрейт 100%!

2
00:00:09,300 --> 00:00:18,231
Отличный старт! Конечно, на двух сделках это скорее удача, чем статистика, но всё равно очень приятно. Поздравляю!

3
00:00:18,481 --> 00:00:24,452
Спасибо! Сейчас поправлю там одну мелочь в API, перезапущу сервис и пойду праздновать.

4
00:00:24,852 --> 00:00:35,143
Так, я вернулся. Открываю дашборд... а где мои 11 долларов?! Всё по нулям! Сделок ноль, прибыль ноль. Что произошло?

5
00:00:35,393 --> 00:00:41,924
Странно. Дашборд показывает нули? Дай-ка я проверю логи сервиса после перезапуска.

6
00:00:42,174 --> 00:00:47,345
Давай быстрее, у меня сердце ёкнуло. Куда деньги делись, Лебовски?

7
00:00:47,745 --> 00:00:57,476
Я не понимаю. Я же сам видел эти сделки. Можешь в базу данных заглянуть? Прямо сейчас, сделай SELECT по закрытым позициям.

8
00:00:57,726 --> 00:01:10,937
Секунду... Готово. В таблице `positions` есть две записи со статусом 'CLOSED'. Суммарный PNL — 11.53 USDT. Данные на месте.

9
00:01:11,187 --> 00:01:18,038
Вот! Значит, они в базе есть. Но бот их не видит. Он что, забыл, что сам же их и записал?

10
00:01:18,288 --> 00:01:27,579
Похоже, он страдает амнезией после перезагрузки. Смотрит в базу за открытыми сделками, но игнорирует закрытые.

11
00:01:27,979 --> 00:01:37,990
А, всё, я понял! Классика. Это же Storage vs. Memory. Я после перезапуска создаю новый пустой список `closed_positions` в памяти.

12
00:01:38,240 --> 00:01:48,091
Именно. База данных — это постоянное хранилище, а переменная в коде — временная память. Она обнуляется при каждом рестарте.

13
00:01:48,341 --> 00:01:58,032
Вот же я балбес. У меня даже функция восстановления состояния была, но только для *открытых* сделок. Про историю совсем забыл.

14
00:01:58,432 --> 00:02:05,643
Так, надо это исправить. Накидай, как будет выглядеть логика. Только без листингов кода.

15
00:02:05,893 --> 00:02:21,584
Легко. При инициализации бота, сразу после загрузки открытых позиций, добавляем вызов новой функции. Она сделает `SELECT *` из базы по закрытым сделкам и заполнит ими исторический массив в памяти.

16
00:02:21,834 --> 00:02:29,485
Да, просто и понятно. Займёт минут 15. Хорошо, что это мой пет-проект, а не боевой.

17
00:02:29,885 --> 00:02:38,176
Представляю, если бы такое случилось в коммерческом продукте. Инвестор заходит, а вся его история торгов исчезла.

18
00:02:38,426 --> 00:02:46,717
Это был бы провал. Он бы не стал разбираться в базах данных. Просто решил бы, что сервис ненадежный, и ушел навсегда.

19
00:02:46,967 --> 00:02:54,218
Именно. Доверие — это всё. Состояние должно быть восстанавливаемым, иначе его как бы и нет.

20
00:02:54,618 --> 00:03:04,429
Давай сформулируем несколько железных правил, чтобы больше не наступать на эти грабли. Такой чек-лист для ботов с памятью как у рыбки.

21
00:03:04,679 --> 00:03:18,370
Хорошая идея. Вот четыре главных принципа: всё важное пишем в хранилище, восстанавливаем состояние при старте, тестируем перезапуски и не доверяем данным только из оперативной памяти.

22
00:03:18,770 --> 00:03:31,021
Забавно получается. Мы, люди, можем забыть что-то, потому что отвлеклись. А мой бот забыл, потому что я забыл написать 30 строчек кода.

23
00:03:31,271 --> 00:03:43,922
Именно. Искусственный интеллект забывает только по команде или по недосмотру создателя. Рад, что мы смогли восстановить историческую справедливость для твоих $11.

24
00:03:44,172 --> 00:03:48,342
Да, теперь он их точно не забудет. Спасибо за помощь, Клод.

