Баг API биржи BITTREX (1)
Думаю, что не один я при написании торгового бота, работаю с API биржи BITTREX. Также, есть люди, которые пишут удобные клиенты для бирж и в частности для этой. И я хочу поделиться информацией о багах которые мне встретились и попортили нервы при работе с этой биржей и её API, так-как бот торгует реальными деньгами и ошибки в его работе могут привести к небольшим или большим финансовым потерям.
Багов у BITTREX-а не мало, из-за этого после названия статьи стоит единичка в круглых скобках. Не исключено, что появятся еще статьи с таким названием, а число в этих скобках может стать двузначным.
Я и первый баг приветствуем вас! Начинаем!
API BITTREX-а имеет инструмент для получения открытых ордеров. Получить можно ордера по какой-то одной паре или по всех сразу.
После отправки запроса мы получаем ответ в формате JSON который имеет вид как на картинке сверху.
Мой бот имеет функцию для обработки ответа в этом формате:
В ней все просто. Есть объект класса QList который хранит в себе объекты класса QString.
Так вот задача этой функции - это из массива result по очереди скопировать uuid каждого открытого ордера и записать его в объект openOrders.
В этой функции много проверок, сам BITTREX советует всегда проверять флаг success, а остальные проверки я добавил в процессе отладки.
Если полученный ответ будет удовлетворительным и пройдет все проверки, то вся нужная информация окажется в openOrders и функция даст сигнал окончания обработки и передаст openOrders другой функции задача которой проверить есть ли в openOrders uuid ордера который бот выставлял. Если uuid нашего ордера не нашлось, то значит он уже исполнен.
Изначально, эта функция прекрасно работала и выглядела приблизительно так:
Но через несколько дней, после изменения ситуации на рынке, ордера стали выполнятся долго, иногда и несколько дней, и начались проблемы.
Придя из университета первым делом, я подбежал к ноутбуку для того, чтобы посмотреть сколько бот наторговал. Я немного расстроился, что бот осуществил всего один трейд. Но еще больше я расстроился, когда зашел на вкладку Wallet биржи Bittrex и увидел, что мои ефирки куда-то пропали. Уже через минуту я обнаружил, что у меня просто весит не исполненный ордер. Но бот почему-то подумал, что он исполнен. Я решил забить и поставил бота заново, и история повторилась.
После этого я начал делать всякие проверки и выводить в консоль, всю информацию которая мне может помочь отследить ошибку. Этот баг начал повторяться несколько раз в день.
Оказывается, Bittrex иногда может прислать ответ, что у меня нету открытых ордеров, хоть на самом деле это не так. А мой бот с радостью верит этой бирже и принимает эту информацию за успешный трейд. Но если отправить еще один запрос, то нам придёт уже правдивый ответ, в котором указаны, еще не исполненные, открытые мной ордера.
После обнаружения этой особенности, мне пришлось изменить мою функцию. Теперь моя функция проверяет открыт ли ордер и только после того как несколько раз подряд подтвердится, что ордер исполнен, то бот решает, что нужный ордер закрыт и только после этого продолжает выполнять свою работу.
По коду видно, что теперь мой бот принимает, что ордер исполнен только после четырех подряд подтверждений.
Так-что, НЕ ВЕРЬТЕ BITTREX-у С ПЕРВОГО РАЗА!
Надеюсь, что обнаруженная мною особенность поможет многим избежать ошибок. Удачи вам!