Order amount too small: что это, в чем причина и что делать

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

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

Создание ордеров ботом на бирже технически осуществляется путем подачи ботом команды бирже на создание ордера и передаче внутри команды параметров ордера — его типа (BUY/SELL), количества (amount) и цены (price) ордера.

Поскольку для биржи любой бот является внешним сервисом, биржа тщательно проверяет данные, которые получает. Кроме того, любая биржа предъявляет к этим данным определенные требования. Поскольку и поле «количество», и поле «цена» в ордере являются числовыми дробными значениями, то биржа как минимум выставляет требование к этим полям как к дробным числам. Это требование — точность числа (обычно количество знаков после запятой). Кроме того, это требование для каждой торговой пары может быть своим. Ну и разумеется, у каждой биржи свои требования.

Например, требование может звучать так: для ордеров на паре BTC/USDT допустимая точность поля «количество» — 3 знака после запятой. Это означает, что мы можем создать ордер с количеством 1,3 BTC, можем создать ордер с количеством 0,326 BTC, но НЕ можем создать ордер с количеством 0,3267 BTC. В последнем случае биржа не примет ордер, отвергнет его.

То же самое касается и поля «цена».

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

Как известно, все биржи берут комиссии за исполнение ордеров. Причем многие (большинство) бирж по умолчанию берут комиссию в той валюте, которую вы получили в результате выполнения ордера (например, при исполнении ордера на покупку в паре BTC/USDT комиссия будет снята в BTC, а при продаже — в USDT). Некоторые биржи позволяют настроить списание комиссии в третьей валюте (об этом ниже).

Теперь смотрим, как бот выполняет цикл «купил-продал» и где он учитывает комиссии (где биржа их снимает).

Допустим, мы работаем по паре BTC/USDT и комиссия биржи составляет 0,1%. Бот выставляет ордер на покупку 1 BTC по цене 48000. Через некоторое время ордер исполняется биржей, биржа забирает свою комиссию в 0,1% от купленного 1 BTC и зачисляет вам на счет 0,999 BTC. Далее бот должен создать ордер на продажу 0,999 BTC по такой цене, что бы после его исполнения и вычета комиссии биржи (на этот раз в USDT) нам на счет упало больше USDT, чем было потрачено на покупку.

Пока все четко и прозрачно. А теперь давайте добавим к нам в расчет требования биржи к точности поля «количество» в 1 знак после запятой.

После покупки бот должен создать ордер на 0,999 BTC, но он этого сделать не может, поскольку требования биржи — только 1 знак после запятой. Бот должен как-то округлить это число. Округлить до 1 он не может, поскольку на счете столько нет и ордер не будет принят из-за недостатка свободных средств. Значит, бот может округлить число только до 0,9. Он при этом выставит в продажу 0,9 BTC, а 0,099 BTC останется на счету неиспользованными и неучтенными. А это, между прочим, 9,9%. Бот в результате продаст битки в минус (ну, то есть выручит меньше USDT, чем потратил) и оставит на счету неучтенными 0,099 BTC.

Для предотвращения такого поведения, в боте работает неотключаемый контроль того, что поле «количество» в ордерах не меньше 3 значащих цифр. Например, если требования биржи к точности поля «количество» ордера 1 знак после запятой, то число с тремя значащими цифрами — это 10,0. Таким образом, бот будет работать только с ордерами, которые больше или равны 10 BTC для приведенного примера. Это позволяет минимизировать максимальную погрешность торгов и не допустить торговли в минус с накоплением неучтенного остатка на счете. В логах бота при срабатывании такой защиты видна ошибка «Order amount too small».

Есть одна биржа из тех, с которыми работает бот, которая предъявляет достаточно грубые требования к точности поля «количество» в ордерах — это BINANCE.

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

Да, на большинстве доступных пар депозит нужен немаленький. Но есть и другой путь — своеобразный лайфхак. О нем дальше.

Некоторые биржи, в частности BINANCE, позволяют настроить снятие комиссии не в валютах торговли, а в некой третьей валюте. У BINANCE это BNB. Включив в настройках аккаунта этот режим, мы получим с точки зрения бота торговлю без комиссии вообще. То есть если бот купил 1 BTC, то на счет тоже упал 1 BTC. Он продал его дороже и получил прибыль. Комиссия же снялась в BNB, и бот этого не видит. Для того, что бы торговать с учетом комиссий, мы эту комиссию, которая снимается теперь в BNB, должны приплюсовать к цене. То есть если у нас комиссия сделки 0,1%, то за цикл купил-продал, когда проходит две сделки, мы имеем две комиссии. Получается, увеличив цену продажи помимо своего профита на 0,2%, мы покроем комиссии — у нас на счету будет в итоге больше USDT, чем наш профит, и на эту разницу мы можем позже откупить BNB, что бы снова использовать ее для уплаты комиссий.

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

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

* Ноль в поле комиссии нужно указывать потому, что если там пустое поле, то бот будет использовать стандартную комиссию биржи по стандартной схеме.

Оставьте комментарий