Блог им. Alexsey_Krasikov

Почему я так долго это не видел?!

В апреле мне написал пользователь. Один абзац, скриншот терминала Bybit. Открытая позиция по FLOKI. Без стоп-лосса.

Он его выставил. Бот его убрал.

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

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

КАК БОТ ВООБЩЕ МОЖЕТ УБРАТЬ СТОП

Кажется что просто. Открыл позицию — поставил стоп. Зачем его трогать?

Но в реальности торговый бот постоянно сверяется с биржей. Раз в несколько секунд он спрашивает: «что у меня сейчас открыто? какие стопы стоят? совпадает ли это с тем что я думаю?»

Это нужно потому что между ботом и биржей постоянно что-то ломается:

— Ордер ушёл, но ответ потерялся в сети — Биржа подвисла на минуту и не приняла стоп — Бот перезапустился и забыл что делал

Без такой сверки бот разъезжается с реальностью. Сегодня думает что у тебя одна позиция, а на самом деле там три. Завтра думает что стоп стоит, а на бирже его никогда не было.

Эту сверку называют сложным словом, но суть простая. Бот спрашивает биржу «как у нас дела?» и подгоняет свою картину мира под реальность.

ГДЕ БЫЛА МОЯ ОШИБКА

Я написал в боте защитное правило: «если на бирже есть позиция без стопа — не трогай её. Возможно, юзер её открыл руками сам».

Логика звучит правильно. Я не хочу чтобы мой бот лез в чужие сделки и ставил стопы там где не должен.

Но в этой защите была дыра.

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

И вот в эти 2-3 секунды между «стоп отклонён» и «переотправляю» — успевала сработать сверка с биржей. Она видела позицию без стопа. И помечала её как «чужая, не трогать».

После этого бот больше никогда не пытался поставить туда стоп. Потому что сам себя убедил что это не его позиция.

Юзер сидел с открытой позицией без защиты. Не зная об этом. Бот в логах писал что всё нормально.

ПОЧЕМУ Я ТАК ДОЛГО ЭТО НЕ ВИДЕЛ

Потому что в логах не было ошибок. Не было ни одного красного флажка. Бот корректно делал свою работу — просто эта работа была неправильной.

Это самый коварный тип бага. Когда система ломается с криком — ты быстро находишь и чинишь. Когда она тихо делает не то — она может работать так годами, и узнаёшь только когда кто-то напишет «у меня FLOKI улетел в минус».

Я полез смотреть всех пользователей с активными позициями за последний месяц. Нашёл больше десятка позиций без стопов прямо сейчас, в моменте. Просто никто пока не написал, потому что цена шла в их сторону. Если бы пошла обратно — был бы убыток у каждого.

Это был самый страшный момент за всё время проекта. Я понял что в моём коде живёт мина, которая когда-нибудь рванёт.

ЧТО Я СДЕЛАЛ

Два дня без сна. Переписал три отдельных слоя проверки.

Первый слой — проверка перед открытием. Раньше бот просто отправлял ордер и узнавал об ошибках после. Теперь — сначала локально считает, хватит ли маржи, правильно ли округлена цена, проходит ли позиция по риск-лимитам. Если что-то не так — ордер вообще не отправляется.

Второй слой — жёсткая проверка ответа биржи. Если бот открыл позицию, а стоп не встал — теперь это критическая ошибка. Позиция помечается как «незавершённая», приходит мне алерт в Telegram, бот пытается доставить стоп до тех пор пока не получится. Раньше это могло пройти незамеченным. Теперь — нет.

Третий слой — переписал ту самую сверку. Бот больше не определяет «своя позиция или чужая» по наличию стопа. Это была моя главная ошибка. Теперь — по уникальному номеру ордера в моей базе. Если в базе есть запись «я открывал эту позицию» — она моя, бот за неё отвечает. Если нет — не трогаем.

Заодно ускорил весь цикл сверки. Раньше он занимал 82 секунды, теперь — полсекунды. То есть если что-то пошло не так — бот теперь узнаёт об этом за секунду, а не за минуту с лишним.

ЧТО Я НАПИСАЛ КАЖДОМУ ПОЛЬЗОВАТЕЛЮ

Я не стал замалчивать. Написал лично каждому, у кого нашёл хотя бы одну «голую» позицию. Объяснил что произошло, что починил, как теперь будет.

Никто не ушёл. Все продолжили пользоваться. Думаю, потому что важнее не «у бота никогда нет багов» (так не бывает), а «автор сразу говорит когда нашёл и сразу чинит».

ЧТО Я ПОНЯЛ

Три вещи. Если ты пользуешься чьим-то ботом или сам пишешь — стоит запомнить.

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

Второе. Если автор бота говорит «у меня всё идеально, никаких багов не было» — это плохой знак. Баги были у всех. Вопрос только в том, знает ли о них автор и говорит ли о них вам.

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

🔧 Если хочешь посмотреть как эта система работает сейчас:

— Бесплатный тариф, 2 сигнала в день, без оплаты: t.me/chmbotsignal — Сравнение 4 стратегий и тарифов: chmup.top — Предупреждение о рисках: chmup.top/risk

Если у вас был похожий случай с любым другим ботом или сервисом — напишите в комментариях. Интересно сколько таких «тихих» багов на самом деле живёт в популярных решениях.

 

363
8 комментариев
avatar

__rtx, кстати, топ-идея.

У человека явно талант, если сам писал.

avatar
Op_Man, в наше время любой копирайт — сразу сомнение) не в обиде)
__rtx, хорошо бы, если бы вы устроили туда, раз оцениваете)
Alexsey_Krasikov, это так не работает. Вам надо самим(так же как и с трейдингом) доказать и показать что Вы можете и тогда не возникнет вопросов с устройством куда либо.
avatar
А почему бот не имеет признака автора позиции?
avatar

… Теперь — по уникальному номеру ордера в моей базе. Если в базе есть запись «я открывал эту позицию» — она моя, бот за неё отвечает...


Вообще внутренний номер использовать нужно для этого или в ордере есть поле комментарий там можно ставить номер или что либо ещё как идентификатор(я использую ext_id). Т.е. при отправке ордера сами проставляете внутренний номер(поле ext_id в плазе в квике и т.п. не знаю как называется но думаю что-то аналогичное есть) или комментарий и отправляете на биржу(она эти поля не трогает) Вам приходит ответ с order_id биржевым и нетронутым ext_id и комментарием.

avatar

Читайте на SMART-LAB:
Фото
Как раньше всех реагировать на новости рынка: новый инструмент в Т-Инвестициях
Чтобы получать оперативные новости, многие держат открытыми по несколько вкладок одновременно или устанавливают платные решения....
Фото
COFFEE: бодрящий разворот от многомесячных минимумов
Цена кофе на недельном таймфрейме уже несколько недель тестирует нижнюю границу широкого диапазона — область поддержки в пределах 275–280¢. Стоит...
Фото
Развал ОПЕК. Какое будущее ждет картель и нефтяной рынок
Вчера, 28 апреля, Объединенные Арабские Эмираты неожиданно объявили о своем выходе с 1 мая 2026 года из ОПЕК и расширенного альянса ОПЕК+. На...
Фото
Магнит: конец эпохе? Сделки по портфелю. Оперативный комментарий
Вчера-сегодня совершал сделки по портфелю. Информирую. ***************************************************************...

теги блога Alexsey_Krasikov

....все тэги



UPDONW
Новый дизайн