Разработка системы фиксации курса обмена (rate lock)

Курс, зафиксированный на время сделки, снимает главный источник споров между сторонами. Мы разрабатываем систему фиксации курса под ключ: настраиваем режимы удержания цены, правила пересчёта и защиту от расхождений. Доля оспоренных сделок и ручных сверок сокращается в разы.
Часто задаваемые вопросы

Почему система фиксации курса ломается на волатильном рынке

Система фиксации курса обещает одно: клиент подтверждает фиксацию курса обмена и получает ровно ту цену, которую видел на экране. Пока рынок спокоен, обещание держится. Как только цена начинает двигаться внутри минуты, цепочка «источник цены, расчёт, подтверждение, исполнение» рвётся сразу в нескольких местах.

Первое — расхождение котировок между источниками. Биржа, пул ликвидности и агрегатор дают разные значения, а окно усреднения добавляет лаг: к моменту расчёта цифра уже не соответствует рынку. Чем шире разброс между площадками, тем сильнее расхождение котировок и тем чаще система закладывает цену, которой на рынке уже нет.

Второе — задержка подтверждения. Между подтверждением сделки и её попаданием в блок проходит время, и на волатильном рынке это стоит процентов движения. Отсюда проскальзывание цены: клиент получает исполнение хуже зафиксированного, а если разрыв превышает порог защиты, срабатывает отмена сделки.

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

Разбираем, как эта цепочка закрывается.

Что даёт управляемая цена сделки: эффект в сроках и долях

Подписанная котировка — это обязательство, а не картинка на экране. Источник курса (Chainlink) отдаёт значение вместе с меткой времени и сроком жизни, а контракт обмена принимает только те заявки, чья подпись сходится и чьё окно не истекло. Не прошла проверка — обмен не создаётся вовсе: пользователь видит внятную ошибку вместо частично исполненной сделки по уехавшей цене.

Время подтверждения сделки сокращается, потому что у заявки появляется один детерминированный путь: проверка подписи, резерв средств, расчёт. Нет ожидания внешней сверки курса и повторных пересчётов — предсказуемая цена сделки известна до отправки. Окно от нажатия до подтверждения уходит с десятков секунд к единицам, и это гарантия, заданная сроком жизни котировки, а не среднее по нагрузке.

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

Ручные разборы обращений уходят в автоматику. У котировки есть идентификатор, все подписи и переходы статусов пишутся в журнал, поэтому спорная сделка воспроизводится по логу за минуты, а не восстанавливается по переписке. Обращения в духе «куда ушла цена» в штатном режиме исчезают, а поддержка занимается реальными сбоями.

Три метрики — время, доля отмен, ручные разборы — выводятся на панель мониторинга, так что эффект от управляемой цены виден в цифрах, а не на словах.

Режимы удержания цены: жёсткий, скользящий и условный

Режим удержания определяет, кто принимает на себя риск движения курса между расчётом цены и исполнением обмена. В системе он задаётся двумя параметрами: окном удержания цены — сколько живёт зафиксированное значение, и лимитом на сделку — какой объём можно закрыть по этой цене без пересчёта. Ниже — три режима и границы, за которыми каждый из них перестаёт работать в плюс.

Вариант Когда подходит Ограничения
Жёсткое удержание цены Сумма к получению известна заранее: выплаты, расчёты с фиксированной квотой, операции с низкой терпимостью к отклонению Риск движения рынка целиком на стороне площадки, поэтому окно короткое, а лимит на сделку ниже остальных режимов
Скользящее удержание цены Крупные объёмы и периоды волатильности, когда важнее исполнить сделку, чем удержать конкретное значение Итоговая сумма не гарантирована: цена следует за рынком внутри защитного коридора, за его границей сделка останавливается и требует подтверждения
Условное удержание цены Фиксация по событию: достижение порога, заданное время, статус контрагента или этап расчётов Нужен внешний источник данных и явная логика отмены — при недоступности условия заявка истекает, а не исполняется по последней цене

Режимы не взаимоисключающие: ядро поднимает жёсткое удержание цены на типовых заявках, скользящее — на крупных, а условное работает как страховка на сценариях с отложенным расчётом. Переключение задаётся правилом на уровне сделки, поэтому одна и та же интеграция закрывает разные схемы обмена без переписывания логики. Перед вводом в работу прогоняем на стенде истечение окна, дробление заявки по лимиту и недоступность источника цены — именно эти три случая дают расхождения в учёте.

Порядок внедрения: от аудита потока заявок до передачи

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

  1. Аудит потока заявок — разбираем журналы и очереди, считаем долю заявок с расхождением курса, фиксируем задержку между подтверждением и фактическим удержанием.
  2. Схема расчёта курса — описываем источники котировок, их вес, спред и окно актуальности; правило отбраковки устаревших значений формализуем в спецификации с примерами.
  3. Настройка правил удержания — задаём окно фиксации, лимиты по объёму, условия частичного исполнения и аннулирования, поведение системы при разрыве потока котировок.
  4. Проверка на нагрузке — воспроизводим профиль реального трафика с всплесками, замеряем время от подачи заявки до фиксации и убеждаемся, что правила удержания не деградируют на пике.
  5. Регламенты — описываем для поддержки и дежурной смены, как читать журналы расхождений, что делать при остановке источника и как оформлять спорные случаи.
  6. Передача — отдаём конфигурации, схему развёртывания, тестовые сценарии и документацию, обучаем команду и остаёмся на связи на период сопровождения.

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

Комплект поставки: настройки, схемы и регламенты расчёта

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

  • Файлы настроек — источники котировок, окно удержания курса, допустимое отклонение, лимиты на объём сделки. Правятся конфигурацией, без изменения логики и повторного развёртывания.
  • Схемы потоков заявок — путь от подачи до исполнения: где проверяются условия, где резервируется обеспечение, где фиксируется курс и что происходит при отказе.
  • Документация по расчёту — формулы курса исполнения и комиссий, порядок округления, правила сверки источников и признаки неисполнимой сделки.
  • Правила доступа — роли операторов, администраторов и внешних систем, матрица прав, порядок выдачи и отзыва ключей, лимиты на подпись операций.
  • Регламент разбора спорных сделок — сроки обращения, состав доказательной базы, сверка с журналом событий, сценарий закрытия зависшей заявки.
  • Регламент обновления и отката — как выпускается новая версия, кто её подтверждает и за какое время система возвращается к предыдущим настройкам.

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

Кейс: как сократили долю оспоренных сделок втрое

Что было на входе

Сервис обмена среднего размера: клиент нажимал «зафиксировать курс», приложение запоминало цифру, а исполнение шло отдельным запросом к внешнему источнику котировок. При резком движении рынка окно между фиксацией и подтверждением растягивалось, и курс в сделке расходился с курсом в момент списания. Спорных сделок набегало 4,8% от объёма, каждое обращение разбирали 2-3 дня — поддержка вручную сверяла биржевые выгрузки, внутренний кэш и данные CoinGecko. До 11% заявок клиенты отменяли сами, не дождавшись подтверждения.

Что изменили

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

Что стало

Доля оспоренных сделок — 4,8% → 1,6%. Разбор обращения — с двух дней до 40 минут: инженеру достаточно открыть журнал, где хранятся срез, метка времени и источник расчёта. Число отменённых заявок упало с 11% до 3%. Расхождение между фиксацией и подтверждением встречается в 0,1% сделок и всегда объяснимо по журналу — стабильность расчёта перестала зависеть от того, кто и в какую секунду нажал кнопку.

Как пересчитывается курс при частичном исполнении заявки

Удержанная цена привязана не к заявке целиком, а к объёму, под который зарезервировано обеспечение. Когда приходит частичное исполнение заявки, контракт фиксирует цену и объём этого исполнения отдельной записью, а резерв освобождает пропорционально: на 40% закрытого объёма уходит 40% блокировки. Остаток заявки продолжает жить как самостоятельная сущность со своим объёмом и своим сроком удержания.

Дальше вступает правило пересчёта курса. Модель «одна котировка на заявку» держит исходную цену до конца срока удержания — остаток исполняется по той же цене, что и первая часть. Модель «котировка на исполнение» переоценивает остаток после каждого частичного исполнения, беря цену из актуального состояния источника: им служит проверенный оракул вроде Chainlink, а не собственный расчётный модуль.

Выбор модели — это компромисс. Жёстко зафиксированная цена предсказуема для клиента, но при резком движении рынка остаток становится удобной целью для арбитража: заявку намеренно добивают частями, пока старая котировка ещё жива. Переоценка снимает этот риск, но добавляет заявке неопределённость — заранее неизвестно, по какому курсу закроется хвост.

Поэтому остаток получает повторное удержание цены с явными границами. Если отклонение от исходного курса выходит за заданный порог, остаток не исполняется: система отменяет его и возвращает зарезервированное обеспечение, а не закрывает по устаревшей цене. Каждый вызов привязан к идентификатору заявки и номеру исполнения, поэтому повторная обработка одного и того же события не задваивает резерв.

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

Частые технические вопросы по расчёту и защите от расхождений

Пять вопросов задают до старта работ: от того, как устроен ответ, зависит архитектура расчёта и набор проверок. Ниже — короткие ответы в том виде, в каком мы их даём: без формулировки «сделаем надёжно», а с конкретной механикой.

Откуда берётся курс — один источник или несколько?

Берём выборку независимых поставщиков и считаем медиану, а не среднее: одиночный выброс не двигает результат. Если расхождение котировок между источниками превышает заданный допуск, значение отбрасывается, а не усредняется.

Что именно попадает в журнал расчётов?

Каждая фиксация пишет неизменяемую запись: входные котировки с метками времени, применённый допуск, итоговый курс, идентификатор запроса. Журнал только дополняется, а правка оформляется отдельной записью-корректировкой со ссылкой на исходную.

Как устроена защита от манипуляций на тонком рынке?

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

Насколько свежими должны быть данные на момент фиксации?

В расчёт идёт значение не старше заданного интервала — устаревшая котировка помечается и отбрасывается. При обрыве потока система переключается на резервный источник и фиксирует факт переключения в журнале.

Можно ли проверить расчёт постфактум?

Да. По записи журнала расчёт воспроизводится: те же входные данные дают тот же курс. Это позволяет разобрать спорный случай без доступа к внутренней логике сервиса.

Обсудим задачу: что нужно для старта работ

Чтобы вернуться с оценкой и планом работ, а не с общими формулировками, нам нужны исходные данные по вашему сценарию фиксации. Ниже — то, что снимает основную часть неопределённости; часть пунктов закрываем прямо на созвоне.

  • Источники курса: свои или внешние, сколько независимых потоков, как решается расхождение между ними.
  • Логика фиксации: кто инициирует, на какой срок, что происходит по истечении и можно ли продлить.
  • Поведение при отклонении рынка: допустимый коридор, автоотмена, ручное подтверждение оператором.
  • Роли и доступы: кто ставит, подтверждает и отменяет фиксацию, какие лимиты действуют на оператора.
  • Где считается результат: изолированный контур, кастодиальный учёт или гибридная схема.
  • Учёт и отчётность: выгрузки для сверки, журнал всех действий, требования к хранению истории.
  • Нагрузка: сколько фиксаций в сутки и сколько одновременно в пике.
  • Что уже есть: контракты, интеграции, тестовые стенды, ограничения вашей инфраструктуры.

По этим данным собираем оценку и план работ: разбиваем на этапы, фиксируем точки контроля и сроки внедрения. Отдельно считаем контур фиксации, интеграции и отказоустойчивость — так запуск можно делать частями, без ожидания всего объёма. Опишите задачу в свободной форме, остальное уточним вопросами.

Направления блокчейн-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142