Более прозрачный интерфейс управления для маркетмейкинга: ADAMANT WebUI, сценарий A-3

Инфраструктура маркетмейкинга часто обладает широкими техническими возможностями, но остается непрозрачной в операционном плане. Статус приходится проверять одной командой, параметры — другой, а причины защитной остановки могут быть скрыты в логах. Третий этап MVP сценария A, представляющий собой приватный self-hosted ADAMANT Market-Making WebUI, превращает браузер из набора разрозненных элементов управления в более понятную рабочую панель для операторов, ежедневно обеспечивающих ликвидность токенов.
Новая панель мониторинга (Dashboard) для каждого бота является основной точкой входа. Она объединяет контекст торговой пары и биржи, состояние маркетмейкинга из API бота /status, значок версии функционала, компактный 15-минутный ценовой график, список активных и неактивных модулей, сводку параметров, балансы и открытые ордера, сгруппированные по назначению. Значок версии — от Basic до Full — определяется установленными возможностями бота, а не тем, какие модули включены в данный момент. Это предотвращает путаницу, если оператор временно отключает какой-либо модуль.

Действие «Запуск» (Start) стало менее директивным. Запуск маркетмейкинга больше не принуждает к перезаписи стратегии; бот сохраняет текущую политику, уже сконфигурированную на нем. Это исключает риск случайного изменения модели работы стратегии одним кликом в интерфейсе. На уровне рынка операторы могут видеть формирующуюся свечу на графике OHLC, маркеры ордеров бота в стакане и списке недавних сделок, наложения открытых ордеров, контекст спреда, балансы и область ввода ордеров. Отмена ордера отправляет точный запрос { id, market, side }; если ордер уже исчез, это обрабатывается как успешный результат, а не как ложная ошибка. Это позволяет отличить реальный операционный сбой от нормальной ситуации, когда клик пользователя совпадает по времени с исполнением или отменой ордера.
Сценарий A-3 интегрирует систему безопасности в WebUI. Когда бот автоматически останавливает маркетмейкинг или приостанавливает торговую сетку в целях безопасности, в браузере появляется диалоговое окно с текстом уведомления, а аварийное состояние отображается в параметрах. События безопасности появляются на доске событий (Events) с соответствующими метками; приостановленную сетку можно возобновить прямо из строки события. Доска событий также записывает изменения параметров, сравнивая данные из WebUI и настройки на стороне бота, показывает состояние маркетмейкинга и может отображать снимки балансов и их изменения в момент совершения действия. Это создает целостный журнал аудита для расследования инцидентов.

Экран параметров теперь включает 12-часовую ленту состояния в реальном времени (Live) в часовом поясе оператора. Она суммирует стоимость активов и номинал открытых ордеров по типам, давая оператору представление о динамике экспозиции и распределении ликвидности. История состояния здоровья отображается по часам: деградировавший час отмечается желтым, а час, когда маркетмейкинг был остановлен, — серым. После запуска модели качества предоставляется 10-минутный льготный период, чтобы только что запущенный бот не оценивался по данным, которые он еще не успел сгенерировать. Визуализация должна честно отражать неопределенность: статусы «working», «degraded» и «stopped» полезнее, чем постоянно зеленая панель мониторинга.

Новый раздел конфигурации (Config), доступный только администраторам, собирает весь операционный контекст: Runtime, Pair и дерево значений tradeParams_*.js отображаются рядом, за ними следует структурированная сводка config.json и представление в формате «сырого» JSON. Снимок конфигурации очищен: поля сокетов помечаются как Not included, если бот их не передает, а биржевые параметры, где отсутствуют минимальные значения сделок, отображаются как Not provided, а не как вводящий в заблуждение ноль.

При работе с несколькими ботами переключение вкладок часто приводит к потере текущего места. Сценарий A-3 добавляет более удобную оболочку управления парком ботов (fleet shell) и реестр. Каждый бот получает редактируемую метку (Label) и аккаунт с полезными значениями по умолчанию, полученными из ID бота и конфигурации. Транспорт, версия, ветка и баланс пары видны на уровне всего парка. Офлайн-боты или неизвестные строки отображаются приглушенно, а подключенные, но остановленные боты остаются читаемыми. Интерфейс сохраняет вертикальную прокрутку и состояние страницы при переключении между ботами и разделами. Скрытые панели считывают замороженный снимок Redux вместо сброса к пустому состоянию, что позволяет операторам сравнивать рынки, проверять конфигурацию и возвращаться обратно без потери контекста.
WebUI остается приватным self-hosted решением. Он использует DirectHttpTransport для связи с интерфейсом бота /api/v1; браузер и бэкенд WebUI не подключаются к биржам напрямую, а API-ключи бирж не должны храниться в WebUI. Обязательная двухфакторная аутентификация (2FA) для оператора поддерживает проверку через email, ADAMANT или Ethereum-кошелек. Стек включает Vite, React 18, Chakra UI, Fastify BFF и SQLite для логов событий. Эта функция является дополнительной с откатом к существующему маршруту /health для старых ботов, которые еще не поддерживают /status. Для работы функции запуска без принудительной смены стратегии требуется соответствующая актуальная сборка бота.
Сценарий A, приватный self-hosted MVP, полностью завершен в рамках заявленного объема. Следующая модель развертывания, сценарий B, остается отдельным направлением: исходящие реле, публичная подписка на WebUI, лицензионные токены и push-уведомления рыночных данных не включены в этот релиз. WebUI по-прежнему опрашивает REST API для получения рыночных данных. Такое разделение делает существующий рабочий процесс приватного оператора более прозрачным и поддающимся аудиту перед расширением модели доверия. Для команд, управляющих ботами для маркетмейкинга токенов, результатом стало более спокойное решение базовой операционной задачи: один экран, объединяющий текущее состояние, управление, историю, конфигурацию и контекст безопасности, при этом граница биржи остается внутри бота.