Исполнение ордеров
Идемпотентность означает, что выполнение одной и той же операции более одного раза даёт тот же эффект, что и выполнение её один раз; в автоматизации торговли это свойство, при котором сигнал, доставленный дважды, или запрос на ордер, отправленный дважды после сетевой ошибки, приводит к одной позиции, а не к двум.
Дубли — обычное дело в системах обмена сообщениями: Telegram может доставить отредактированное сообщение как новое событие, отправитель вебхука повторяет запрос, если не получает быстрого подтверждения, а трейдер может дважды нажать «отправить тестовый сигнал». Без идемпотентности каждый дубль становится реальным ордером с реальной маржой. Проблема хуже всего проявляется именно тогда, когда система под нагрузкой, во время замедлений и сбоев на площадках, — а это как раз момент, когда повторы и дублирующиеся доставки умножаются.
AlgoVesta применяет идемпотентность в нескольких точках. Входящие сообщения Telegram записываются по идентификатору сообщения, поэтому одно и то же сообщение не обрабатывается дважды. Защита от дублей отклоняет второй сигнал для того же счёта, символа и направления в течение короткого окна, что поглощает повторные публикации и двойные клики; отклонение записывается в журнал вместе с причиной, а не отбрасывается молча. Размещения ордеров вслепую не повторяются после неоднозначных сбоев; платформа сверяется с позициями и историей сделок биржи, чтобы решить, существует ли ордер на самом деле, прежде чем действовать снова. У каждой стратегии свой собственный токен вебхука, и каждое исполнение привязано к вызвавшему его сигналу, поэтому один и тот же сигнал не может быть исполнен двумя путями. См. статью логика повторных попыток и страницу TradingView-бота.
Оповещение TradingView настроено на минутном графике и из-за настройки стратегии срабатывает дважды в пределах одной свечи с идентичным сообщением. Первый запрос открывает лонг по ETHUSDT. Второй приходит 20 секунд спустя и отклоняется защитой от дублей как тот же символ и направление в пределах окна; он появляется в журнале сигналов как заблокированный по причине дубля, и вторая позиция не открывается.