cryptofoundry

Связаться с cryptofoundry

Расскажите, что вы хотите создать или автоматизировать.

Электронная почта
[email protected]
ADAMANT Messenger
Открыть в ADAMANT
Статья

ADAMANT Market-Making Bot: Более безопасная и умная поддержка спреда

ADAMANT Market-Making Bot: Более безопасная и умная поддержка спреда

Поддержка спреда (SS) — одна из самых мощных функций ADAMANT Market-Making Bot, но и одна из самых уязвимых. Она поддерживает узкий спред и здоровье стакана, однако наивная логика пополнения может стать уязвимой: циклы пополнения воссоздают экспозицию, волатильные условия искажают размещение, а односторонние движения превращают полезный механизм в источник избежимого риска.

Это обновление решает проблему тремя этапами: специальным инструментом симуляции, разделением поддержки спреда и безопасной ликвидности на отдельные опциональные модули и заменой старой циклической логики пополнения на ограниченную стратегию зеркалирования, которая сохраняет узкий спред, не открывая циклы неограниченных убытков.

Почему это обновление важно

Логика ликвидности должна предсказуемо работать в стрессовых условиях. В отличие от ликвидности на основе глубины, которая естественным образом учитывает средние цены покупки и продажи, ордера SS призваны поддерживать сам спред. Это делает их уязвимыми к враждебным исполнениям, резким направленным движениям и правилам размещения, которые работают в спокойных условиях, но ломаются при волатильности. Это обновление направлено на то, чтобы поддержка спреда оставалась полезной, не превращаясь в источник неограниченного риска.

Этап 1: Инструмент симуляции и визуализации

Перед изменением основной логики был создан отдельный инструмент для анализа поведения SS в контролируемой среде. Инструмент включает trade/tests/liquidity_test.js и trade/tests/liquidity_test.html, работающие как приложение на Express + Socket.io.

ADAMANT Market-making bot: A Safer, Smarter Spread Support

В режиме paper инструмент хранит в памяти снимок одного стакана. Итерации SS можно запускать вручную, а клик по уровню цены имитирует полное исполнение всех ордеров до этого уровня, что упрощает воспроизведение граничных случаев и анализ реакции.

В режиме live инструмент постоянно обновляет стакан с биржи и работает с реальными записями ordersDb. Итерации по-прежнему запускаются вручную, но среда отражает реальные рыночные условия.

HTML-интерфейс включает цветовую таблицу стакана, различающую внешние ордера, ликвидность глубины, ордера SS и зеркальные ордера. Панель статистики показывает количество открытых, исполненных и отменённых ордеров SS по каждой стороне, значения VWAP покупки и продажи, а также дельты за итерацию. Панель tradeParams в режиме только для чтения отображает текущее состояние выполнения, а ручные элементы управления позволяют операторам запускать итерации SS, анализировать изменения состояния и копировать значения ячеек. Каждая итерация подсвечивает изменения, превращая поведение ликвидности из логического вывода на основе логов в прямое наблюдение.

Этап 2: Выделение безопасной ликвидности и поддержки спреда в отдельные модули

Раньше основное состояние безопасной ликвидности и логика размещения SS находились внутри mm_liquidity_provider, тесно связывая несколько разных функций. Это обновление разделяет их на два отдельных модуля: trade/mm_liquidity_safe.js и trade/mm_liquidity_ss.js.

Модуль безопасной ликвидности инкапсулирует состояние liqLimits и все связанные вспомогательные функции (updateLiqLimits, loadLiqLimits, storeLiqLimits, resetLiqLimits, getLiqLimits, getVwapRangeString). Он обрабатывает только исполнения глубины с жёстким фильтром subPurpose === 'depth', что позволяет сосредоточиться на истории исполнения по глубине и производных ограничениях.

Модуль поддержки спреда инкапсулирует поведение SS, включая updateSsLiquidity(liquidityOrders, orderBookInfo), updateSsVwap(), логику цен SS, ограничения на количество ордеров SS и логику размещения зеркал. Сюда также перенесены константы, такие как минимальное и максимальное количество ордеров SS с каждой стороны.

Основной mm_liquidity_provider.js теперь загружает оба модуля через utils.softRequire(). Эти модули опциональны: если один из них отсутствует, бот продолжает работать корректно. Ликвидность по глубине продолжает функционировать. Если mm_liquidity_safe отсутствует, ограничения безопасной ликвидности просто неактивны. Если mm_liquidity_ss отсутствует, поддержка спреда отключена. Никаких сбоев, нарушений потока или отдельных веток кода не требуется.

Поставщик также делегирует специфические правила закрытия SS модулю SS при его наличии, заменяет встроенный цикл размещения SS на ss.updateSsLiquidity() и обновляет стакан после размещения SS, чтобы ордера глубины могли использовать актуальный серединный уровень, улучшая согласованность размещения.

Этап 3: Замена циклов пополнения на ограниченную стратегию зеркалирования

Это ключевое изменение поведения. Старая повторяемая модель пополнения могла бесконечно воссоздавать экспозицию в нежелательных сценариях.

ADAMANT Market-making bot: A Safer, Smarter Spread Support

Основное правило зеркалирования

Когда обычный ордер SS исполняется, бот размещает зеркальный ордер на противоположной стороне по отражённой цене и с тем же объёмом. Он не размещает замену на той же стороне.

ADAMANT Market-making bot: A Safer, Smarter Spread Support

Вместо бесконечного пополнения там, где ликвидность только что была использована, система фиксирует исполнение и отвечает ограниченным ордером на противоположной стороне. Это поддерживает узкий спред, не создавая неограниченного цикла пополнения на одной стороне.

Свойства зеркальных ордеров

Зеркальные ордера явно помечаются как subType: 'mirrored', subTypeString: ' (ss mirrored)' и priceCorrected: true. Поле priceCorrected позволяет существующей логике closeLiquidityOrders пропускать корректные зеркальные ордера, даже если они находятся за пределами обычного окна спреда SS, так что зеркала сохраняются там, где должны, без необходимости отдельного пути отмены.

Предотвращение каскадов

Главная опасность в логике зеркалирования — рекурсивное поведение: зеркало исполняется, затем зеркалируется снова и так далее. Это явно блокируется. Исполненные зеркальные ордера больше не зеркалируются. Модуль проверяет subType, и как только создаётся зеркало, исходный ордер помечается как источник зеркала, предотвращая цепочки каскадов и сохраняя механизм ограниченным.

Контроль рисков

Ограничение дистанции зеркалирования. Если математически «правильная» цена зеркала окажется слишком далеко от середины, бот использует ограниченную цену рядом с краем спреда SS вместо слепого размещения. Это предотвращает отрыв зеркал от осмысленного поведения ликвидности.

Защита по актуальности VWAP. SS теперь ведёт собственную статистику исполнений через отдельную эпоху fillsEngine с ключом subPurpose: 'ss', отдельно отслеживая buyVWAP и sellVWAP SS. Если VWAP SS отклоняется от текущей середины более чем на 2%, он считается устаревшим и игнорируется при ограничениях размещения. Это важно после сильных направленных разворотов, когда старая привязка VWAP может заставить логику SS застрять на одной стороне рынка.

Смягчение при широком спреде. На волатильных рынках внешний спред может временно стать намного шире целевой зоны SS. Когда это происходит с заданным множителем, проверки занятости зеркал смягчаются, чтобы поддержка спреда могла продолжать работать, а не замерзать из-за строгих предположений о размещении, не соответствующих рынку.

Ограниченное размещение обычных ордеров SS. Теперь обычное размещение SS учитывает VWAP SS, когда это актуально. Новые обычные покупки размещаются ниже buyVWAP SS, а новые обычные продажи — выше sellVWAP SS, снижая вероятность многократного добавления новой экспозиции на всё более невыгодных уровнях.

Улучшения наблюдаемости и контроля оператора

Команда /stats теперь проверяет пары через parseCommandParams, принимает любую пару или перпетуал (не только по умолчанию), отображает значения 24-часового спреда жирным шрифтом, использует стабильную точность для volumeInCoin2, показывает объём торгов и статистику исполненных ордеров только для пары по умолчанию, включает лестничные (ld) ордера в статистику исполненных ордеров и добавляет раздел Notes.

ADAMANT Market-making bot: A Safer, Smarter Spread Support

Новый расширенный вид статистики ликвидности доступен через /orders liq full. Он включает блок ликвидности по глубине с состоянием, параметрами спреда, количеством ордеров, открытыми объёмами, ограничениями безопасной ликвидности и историей исполнений; блок поддержки спреда с диапазоном спреда SS, ограничениями по размеру ордеров, количеством обычных и зеркальных ордеров, статистикой исполнений SS, VWAP и MTM PnL; блок общего итога, объединяющий данные по глубине и SS; время начала текущей эпохи ликвидности; информацию о минимальных ордерах биржи; и текущую информацию о стакане через повторно используемые помощники глубины. Таблицы статистики исполнений используют компактный четырёхколоночный формат: метка, Покупка, Продажа и Дельта.

ADAMANT Market-making bot: A Safer, Smarter Spread Support

Теперь обычный список /orders liq показывает процент исполнения для частично исполненных ордеров и включает метки subPurpose и subType, такие как ss, mirrored. Команда /orderbook включает новую колонку Purpose, показывающую, какие модули бота соответствуют каждому уровню цены, на основе актуальных записей ordersDb.

ADAMANT Market-making bot: A Safer, Smarter Spread Support

Команда /enable liq теперь включает подтверждение перед изменением параметров ликвидности и проверяет возможности сборки: нотация диапазона глубины отклоняется, если mm_liquidity_safe отсутствует, а параметры SS отклоняются, если mm_liquidity_ss отсутствует, с понятным сообщением. Новая подкоманда /enable liq reset сбрасывает mm_liquidityInitTs и очищает liqLimits, перезапуская эпоху VWAP после подтверждения.

Команды ручной /buy и /sell получили улучшение безопасности: если запрошенная цена ордера отклоняется от рынка более чем на 1000%, бот останавливается и запрашивает подтверждение через /y, защищая от случайных ордеров по экстремальным ценам. Команда /account теперь более устойчиво обрабатывает пустые списки комиссий от биржевых API.

Нет критических изменений

Оба модуля mm_liquidity_safe и mm_liquidity_ss опциональны. Если один из них отсутствует, mm_liquidity_provider продолжает работать корректно с активной ликвидностью по глубине. Единственное изменение формата — ключи статистики fillsEngine теперь могут включать необязательный сегмент :<subPurpose>; существующие записи без этого сегмента остаются валидными и не затрагиваются.

Резюме

Это обновление делает три вещи. Оно делает поддержку спреда видимой благодаря инструменту симуляции, превращающему скрытое поведение ликвидности в поддающееся анализу и воспроизведению. Оно делает поддержку спреда модульной, разделяя безопасную ликвидность и SS из одного пути поставщика. И, что наиболее важно, оно делает поддержку спреда безопаснее, заменяя повторяемую модель пополнения на ограниченную стратегию зеркалирования, предназначенную для поддержания узкого спреда без риска циклов неограниченных убытков.

ADAMANT Market-making bot: A Safer, Smarter Spread Support

Для систем маркет-мейкинга это правильное направление: не больше активности ради самой активности, а более умное поведение под реальным рыночным давлением. Поддержка спреда теперь более понятна, проще в сопровождении и намного сложнее для эксплуатации.