Распределенный режим: первопроходец Bitfinex

Здесь вносим предложения и обсуждаем вектор развития бота
Ответить
dyno
Site Admin
Сообщения: 93
Зарегистрирован: 19 мар 2018, 14:48

Распределенный режим: первопроходец Bitfinex

Сообщение dyno » 23 мар 2018, 20:03

Всем привет!

Обновление 28-03-2018: распределенный режим включен для всех пользователей Bitfinex. Получение LAST по распределенной схеме пока только у некоторых пользователей.

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

В результате после раздумий и сбора существующих нюансов/граблей, родилась новая схема работы. Назовем ее "Распределенный режим", или просто - distributed.

В качестве подопытного кролика было решено использовать Bitfinex, поскольку бот с ним работал еле-еле. Связано это с тем, что эта биржа выставляет недетские ограничения по частоте обращения к своему API, а точнее - 10 обращений в минуту максимум. Разумеется, для бота это ни в какие ворота, потому что например при стандартных настройках мы имеем 20 ордеров в таблице. А теперь смотрим, что это значит:
- нужно рассчитать таблицу - несколько обращений к бирже (текущая цена, комиссия, точность цены/количества в ордере и др.)
- нужно выставить ордера - по 1 обращению на ордер
- в след цикле нужно проверить, есть ли сработки. 1 обращение
- Если сработок нет, проверить подтяжку. Это получить last - 1 обращение
- если подтяжка сработала, нужно снять все 20 ордеров (20 обращений) и выставить их снова после расчета - еще 24+ обращения.

Итого это может растянуться весьма надолго - около 5 минут при удачном раскладе.

Лично меня такая работа немного подбешивает :)

А теперь про distributed режим применительно к Bitfinex (и это только малая часть возможностей нового режима). Сейчас уже реализована установка/снятие таблицы ордеров через этот режим. То есть непосредственно команды бирже отдает не бот, а специальные исполнители, коих довольно много и они разбросаны по разным IP-адресам (а значит, у каждого свои ограничения 10 запросов в минуту).
Это сильно ускорило процесс, и этот режим включен у меня и у избранных пользователей, пожелавших потестировать на себе.
В этом режиме установка 20 ордеров занимает не фиксированное время, но обычно это от 10 до 30 секунд, что в разы быстрее.

Следущее медленное место - получение последней цены LAST. В текущей схеме работы этой задачей занимается сам бот, и запрашивает ее каждый раз, когда она нужна, у биржи. А это - 6 лишних секунд. На каждом расчете таблицы, на каждой проверке необходимости подтяжки.
В новой схеме, которая тестируется на мне, этим занимается специальный сервис, а бот получает цены по подписке. Дополнительный плюс - бот получает цену не раз в минуту, а каждую сделку на бирже сразу же, как она произошла. Общая задержка от биржи до бота составляет десятки миллисекунд. Это на будущее, пока не нужно. В купе с некоторыми другими оптимизациями (кэширование метаинформации биржи, уже доступно всем) стандартный цикл "не сработал ни один ордер, фикса нет, проверка подтяжки" занимает крайне мало времени. В примере - всего 102 миллисекунды!

Пример:

Код: Выделить всё

INFO  [2018-03-23 16:43:20,150] DownExecutor-: There are 3 macro orders and 0 fix orders found in database.
INFO  [2018-03-23 16:43:20,150] DownExecutor-: Check macro orders
INFO  [2018-03-23 16:43:20,251] DownExecutor-: Active fix order: null
INFO  [2018-03-23 16:43:20,252] DownExecutor-: No executed macro orders.
INFO  [2018-03-23 16:43:20,252] DownExecutor-: Check if pull down needed.
INFO  [2018-03-23 16:43:20,252] DownExecutor-: There is 0 fix orders.
INFO  [2018-03-23 16:43:20,252] DownExecutor-: Use doubled first step gap: 0.2
INFO  [2018-03-23 16:43:20,252] DownExecutor-: Retrieve LAST
INFO  [2018-03-23 16:43:20,252] DownExecutor-: LAST: 0.06094700000000000000
INFO  [2018-03-23 16:43:20,252] DownExecutor-: Lower cost of macro orders: 0.061003
INFO  [2018-03-23 16:43:20,252] DownExecutor-: Threshould cost: 0.060880994
INFO  [2018-03-23 16:43:20,252] DownExecutor-: No pull-down needed.
А вот пример создания новой таблицы на 3 ордера с ноля (время создания не увеличивается пропорционально количеству ордеров, здесь что 3, что 23 ордера - на время почти не влияет). Полное время цикла создания таблицы - всего 6 секунд, при этом бот сделал только 1 реальный запрос к бирже - запрос баланса на счету.

Код: Выделить всё

INFO  [2018-03-23 17:20:12,569] DownExecutor-: There are 0 macro orders and 0 fix orders found in database.
INFO  [2018-03-23 17:20:12,569] DownExecutor-: Retrieve LAST
INFO  [2018-03-23 17:20:12,569] DownExecutor-: Last is 0.06078400000000000000
INFO  [2018-03-23 17:20:12,569] DownExecutor-: Creating macro orders table
INFO  [2018-03-23 17:20:12,760] DownExecutor-: Free ETH: 0.08387301
INFO  [2018-03-23 17:20:12,760] DownExecutor-: Normalize price scale for value: 0.06084478399999999898017932764560100622475147247314453125
INFO  [2018-03-23 17:20:12,763] DownExecutor-: Normalized price: 0.060845
INFO  [2018-03-23 17:20:12,764] DownExecutor-: Use percentage depo value: 0.0838730100 ETH
INFO  [2018-03-23 17:20:12,764] DownExecutor-: Min value is: 0.020000
INFO  [2018-03-23 17:20:12,764] DownExecutor-: Use mathematics
INFO  [2018-03-23 17:20:12,764] DownExecutor-: Pair: ETH_BTC
INFO  [2018-03-23 17:20:12,764] DownExecutor-: Depo usage (%/abs): 100.00 / null
INFO  [2018-03-23 17:20:12,764] DownExecutor-: First step (gap %/abs): 0.1000 / null
INFO  [2018-03-23 17:20:12,764] DownExecutor-: Coverage: 2.00
INFO  [2018-03-23 17:20:12,764] DownExecutor-: Orders count: 5.00
INFO  [2018-03-23 17:20:12,765] DownExecutor-: Martingale: 5.00
INFO  [2018-03-23 17:20:12,765] DownExecutor-: Profit (%/abs): 0.10 / null
INFO  [2018-03-23 17:20:12,765] DownExecutor-: Normalize price scale for value: 0.060845000001
INFO  [2018-03-23 17:20:12,765] DownExecutor-: Normalized price: 0.060845
INFO  [2018-03-23 17:20:12,765] DownExecutor-: Normalize price scale for value: 0.061149225001
INFO  [2018-03-23 17:20:12,765] DownExecutor-: Normalized price: 0.061149
INFO  [2018-03-23 17:20:12,766] DownExecutor-: Normalize price scale for value: 0.061453450000
INFO  [2018-03-23 17:20:12,766] DownExecutor-: Normalized price: 0.061453
INFO  [2018-03-23 17:20:12,779] DownExecutor-: Send message to create order channel.
INFO  [2018-03-23 17:20:12,821] DownExecutor-: Send message to create order channel.
INFO  [2018-03-23 17:20:12,827] DownExecutor-: Send message to create order channel.
INFO  [2018-03-23 17:20:12,921] DownExecutor-: Waiting for messages...
INFO  [2018-03-23 17:20:13,196] DownExecutor-: Received result message for order 9705855338
INFO  [2018-03-23 17:20:13,399] DownExecutor-: Received result message for order 9705855512
INFO  [2018-03-23 17:20:18,457] DownExecutor-: Received result message for order 9705858535
INFO  [2018-03-23 17:20:18,495] DownExecutor-: DONE.
Так же на Bitfinex была добавлена фича проверки исполнения ордера по истории, поскольку я замечал пару раз неверные данные, пришедшие с биржи (не все ордера показывала), что воспринималось ботом как исполнение некоторых ордеров.

Если кому интересно - можете присоединяться к distributed режиму, написав в поддержку.

diav
Сообщения: 1
Зарегистрирован: 31 мар 2018, 18:27

Re: Распределенный режим: первопроходец Bitfinex

Сообщение diav » 31 мар 2018, 18:36

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

dyno
Site Admin
Сообщения: 93
Зарегистрирован: 19 мар 2018, 14:48

Re: Распределенный режим: первопроходец Bitfinex

Сообщение dyno » 31 мар 2018, 18:57

Интересно, у меня у самого торгует в этом режиме на финиксе, ничего такого не замечал.
Иногда только при большом количестве ордеров нет-нет, да и проскочит одинокая ошибка выставления с результатом, что биржа не смогла выставить ордер, поскольку не смогла посчитать баланс пользователя :). Слишком быстро выставляет.
Хотелось бы увидеть логи обоих случаев.

Аватара пользователя
JpS
Сообщения: 14
Зарегистрирован: 19 мар 2018, 22:08

Re: Распределенный режим: первопроходец Bitfinex

Сообщение JpS » 04 апр 2018, 12:57

хотел создать отдельный топик, но смотрю смысл моего топика пересекается с этим и решил написать прямо тут.
суть в чем. "подсмотрел" у соседей как они выставляют сетку. дело в том что они выставляют ее последовательно, а не всю сразу. ордера выставляются по мере исполнения сетки. т.е. сама сетка рассчитывается (и запоминается) ботом, а потом по мере исполнения ордеров по 3-5 штук выставляются остальные. при исполнении фикса так же снимаются только те, что успели выставиться к тому моменту.
таким образом убивается сразу несколько зайцев. во-первых, время выставления в разы сокращается (нужно выставлять 3-5 ордеров вместо 20-40 на каждой "подтяжке" сетки), во-вторых, немного освобождается депо (сомнительный плюс, но как бы не ради него все делается, это как бонус идет), в-третьих мы решаем (частично) вопрос с лимитами обращений от биржи. оно драматичным образом сокращается.

из минусов, которые можно было бы заметить (и обсудить). да он собственно пока видится один. работа на шпильках. да, мы можем пропустить таким образом шпильку. нууу... сомнительный скажем так минус. часто такие шпильки - это наоборот путь в инвестора и такой пропуск - может быть даже плюс а не минус :) но все же да, возможны ситуации, когда мы где-то могли бы получить более большой закуп (ну и соответственно и бОльший фикс и профит) в случае полной сетки.
однако если подумать: на продолжительном периоде вероятность возникновения таких шпилек стремится в нулю. а вот вероятность исполнения последнего ордера в сетке (по сравнению с первым) практически - к бесконечности. вот и вопрос, зачем висеть 10-15 "последних" ордеров, если их шанс исполнится практически невероятен (они будут висеть бесцельно только мешая и создавая проблемы).
и еще кстати по поводу шпильки. если это не шпилька, а резкий памп/дамп на плато, то давайте подумаем. так ведь это даже хорошо что последние ордера не выполнились. это же значит что если мы их даже выставим, то они исполнятся по гораздо более выгодной цене. да, мы их выставим с комсой тейкера, а не мейкера, но что то мне подсказывает что комсу мы таким образом уж точно отобъем. да и потом, алгоритм можно проимпрувить для того чтобы даже в этом случае ставиться как мейкер (ну опционально конечно же, возможно можно даже и не париться на эту тему ибо там действительно какая-то мелочь по сравнению с реально полученным профитом от такого внезапного скачка).
кстати, если бы мы занимались наукой и изучением торговли именно с точки зрения прикладной математики, то была бы интересна статистка по срабатыванию ордеров. типа:
сработал 1 ордер - 100% циклов (ибо если даже первый не сработал, то и цикла не было :) )
сработало 2 ордера - 90% циклов
сработало 3 ордера - 70% циклов
и т.д.
я уверен что где-то в районе
сработало 15 ордеров - Х% циклов
уже будут такие незначительные цифры, что мы увидим, как мы реально "дрочим" биржу пустыми запросами. понятно что в таких случаях им это не нравится и они вводят ограничения на свои АПИ.
-= J =-

dyno
Site Admin
Сообщения: 93
Зарегистрирован: 19 мар 2018, 14:48

Re: Распределенный режим: первопроходец Bitfinex

Сообщение dyno » 12 апр 2018, 21:04

Битфиникс-часть бота переехала на новую распределенную инфраструктуру. Таким образом закончена миграция битфинекс части.

dyno
Site Admin
Сообщения: 93
Зарегистрирован: 19 мар 2018, 14:48

Re: Распределенный режим: первопроходец Bitfinex

Сообщение dyno » 12 апр 2018, 21:05

JpS писал(а):
04 апр 2018, 12:57
хотел создать отдельный топик, но смотрю смысл моего топика пересекается с этим и решил написать прямо тут.
суть в чем. "подсмотрел" у соседей как они выставляют сетку. дело в том что они выставляют ее последовательно, а не всю сразу. ордера выставляются по мере исполнения сетки. т.е. сама сетка рассчитывается (и запоминается) ботом, а потом по мере исполнения ордеров по 3-5 штук выставляются остальные. при исполнении фикса так же снимаются только те, что успели выставиться к тому моменту.
таким образом убивается сразу несколько зайцев. во-первых, время выставления в разы сокращается (нужно выставлять 3-5 ордеров вместо 20-40 на каждой "подтяжке" сетки), во-вторых, немного освобождается депо (сомнительный плюс, но как бы не ради него все делается, это как бонус идет), в-третьих мы решаем (частично) вопрос с лимитами обращений от биржи. оно драматичным образом сокращается.

из минусов, которые можно было бы заметить (и обсудить). да он собственно пока видится один. работа на шпильках. да, мы можем пропустить таким образом шпильку. нууу... сомнительный скажем так минус. часто такие шпильки - это наоборот путь в инвестора и такой пропуск - может быть даже плюс а не минус :) но все же да, возможны ситуации, когда мы где-то могли бы получить более большой закуп (ну и соответственно и бОльший фикс и профит) в случае полной сетки.
однако если подумать: на продолжительном периоде вероятность возникновения таких шпилек стремится в нулю. а вот вероятность исполнения последнего ордера в сетке (по сравнению с первым) практически - к бесконечности. вот и вопрос, зачем висеть 10-15 "последних" ордеров, если их шанс исполнится практически невероятен (они будут висеть бесцельно только мешая и создавая проблемы).
и еще кстати по поводу шпильки. если это не шпилька, а резкий памп/дамп на плато, то давайте подумаем. так ведь это даже хорошо что последние ордера не выполнились. это же значит что если мы их даже выставим, то они исполнятся по гораздо более выгодной цене. да, мы их выставим с комсой тейкера, а не мейкера, но что то мне подсказывает что комсу мы таким образом уж точно отобъем. да и потом, алгоритм можно проимпрувить для того чтобы даже в этом случае ставиться как мейкер (ну опционально конечно же, возможно можно даже и не париться на эту тему ибо там действительно какая-то мелочь по сравнению с реально полученным профитом от такого внезапного скачка).
кстати, если бы мы занимались наукой и изучением торговли именно с точки зрения прикладной математики, то была бы интересна статистка по срабатыванию ордеров. типа:
сработал 1 ордер - 100% циклов (ибо если даже первый не сработал, то и цикла не было :) )
сработало 2 ордера - 90% циклов
сработало 3 ордера - 70% циклов
и т.д.
я уверен что где-то в районе
сработало 15 ордеров - Х% циклов
уже будут такие незначительные цифры, что мы увидим, как мы реально "дрочим" биржу пустыми запросами. понятно что в таких случаях им это не нравится и они вводят ограничения на свои АПИ.
Не совсем понял как этот топик пересекается с темой, но постепенное создание ордеров есть в ближайших планах.

Meetya
Сообщения: 20
Зарегистрирован: 12 апр 2018, 21:31

Re: Распределенный режим: первопроходец Bitfinex

Сообщение Meetya » 23 апр 2018, 17:08

Только последний ордер в сетке, самый дальний, хотелось бы видеть. Так как при скальпинге по нему удобно, видя волатильность, принимать решение, есть смысл, ждать его исполнения или нет. Понятно, что его можно и самому вычислить зная: перекрытие цены в % и прочие настройки стратегии. Но я же не бот, что я буду его работу делать!

Аватара пользователя
JpS
Сообщения: 14
Зарегистрирован: 19 мар 2018, 22:08

Re: Распределенный режим: первопроходец Bitfinex

Сообщение JpS » 23 апр 2018, 17:54

Meetya писал(а):
23 апр 2018, 17:08
Только последний ордер в сетке, самый дальний, хотелось бы видеть. Так как при скальпинге по нему удобно, видя волатильность, принимать решение, есть смысл, ждать его исполнения или нет. Понятно, что его можно и самому вычислить зная: перекрытие цены в % и прочие настройки стратегии. Но я же не бот, что я буду его работу делать!
звучит разумно. соглашусь.
-= J =-

Ответить