Великий баг (08.09.2018) aka ценник 300.000.000
-
Опишите пожалуйста, что произошло, как восстановили, как исправили, как это работает сейчас и самое главное, будет ли компенсация автору бага (мне) за его нахождение?)
-
Баг был в коде market бота. Причина в округлении суммы новой цены. Например, если ордер бота на продажу обработался, он создаёт новый ордер для выкупа равного количества голдов по заниженной цене. Цена уменьшалась на 0,1% * (random от 1 до 5). Итоговая цена округлялась, чтобы в стакане у ордеров бота были круглые цены: 973 вместо 973,12. Из-за этого при подходе к 100, новая уменьшенная цена получалась, например 99,95 и округлялась до 100. Сначала новые ордеры бота стремились к 100, а потом перекрылся спред и ордера бота стали отклоняться в связи с попыткой совершить операцию с самим собой. Точно не выяснено, но похоже игрок Александр разом продал объём превышающий общую сумму bid ордеров бота, потому что при низкой цене он стал меньше 100000 кешей. В итоге market бот лишился всех ордеров. Crowd бот и ядро биржи работало в штатном режиме.
Сделано:
- Убрано округление. Теперь цены ордеров бота не ровные, зато нет проблем с масштабом цены.
- Максимальный объём рыночного cash ордера вычисляется динамически: maxCashOrder = 100 * price. Предположительно, теперь общее предложение market бота будет всегда больше максимального рыночного cash ордера.
- Протестировано снижение цены до 0,01. Если кто-то опять догонит, то сможет закрыть все bid ордеры бота. При этом ask ордеры остаются.
- Пришлось восстановить базу на начало суток.
Выводы:
- Плохо тестировали поведение бота при низких ценах. Не удосужились посмотреть, что будет если слить 10000 голдов.
Большое спасибо Александру за постоянную проверку игры на прочность и за нахождение этого бага! Ваши затраты полностью компенсированы при восстановлении базы:)
Есть побочный эффект восстановления базы. Клиентские данные содержат связанные списки (нотификации и чаты). Контроль целостности данных жёсткий, поэтому возможны ошибки при отправлении сообщения в чат. Лечится путём Profile > Logout и входа заново. Если в процессе соединения произошла ошибка (при загрузке новых уведомлений), то автоматом происходит logout и при новом входе все клиентские данные загружаются заново. В общем если что-то пошло не так, делаем выход и новый вход. Удаление процесса приложения и новый запуск не поможет.
-
Еще был вопрос про максимальную цену голда. Никаких ограничений нет. Но максимальная цена в ордере ограничена текущей ценой * 3, и минимальная текущая цена / 3. Недавно уменьшили этот коэффициент с 4 до 3.