Автоматизация криптоторговли с Django и Celery +5


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


Trade


Почему Python?
Во время написания робота я активно изучал сам Python 3 версии и один из его самых популярных фреймворков — Django. Поэтому вопросов с выбором языка разработки не было.

Почему Django?
На первых порах мы написали робота, работающего в терминале. После появилась необходимость визуально наблюдать за работой робота, добавлять несколько аккаунтов для торговли, настраивать конфигурацию — для всего этого был необходим некий Web-интерфейс.


Начало истории


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


Bot home page

Алгоритм работы робота


Первоначально робот опрашивал биржу один раз в несколько секунд, производил некоторые нехитрые расчеты с помощью вычисления Bollinger bands (link) и выставлял ордера, если считал, что это выгодно.


Данный алгоритм работал несколько месяцев, после чего возникла идея принципиально изменить логику работы — робот не должен был опрашивать биржу на предмет изменения курса валюты, он должен был знать о изменении цены в сам момент её изменения. На момент написания скрипта таким функционалом обладала одна из криптовалютных площадок, которой мы пользовались — poloniex. Функционал этот — WAMP protocol. Он позволял подписаться на необходимый канал на бирже, и своевременно получать сообщения о изменениях курсов.


Вообще, подписавшись на Web Socket poloniex мы получаем не только информацию о курсах валют. Кроме этого нам приходит информация о так называемых «стаканах» bids
& asks, о ордерах и даже о сообщениях в местном чате, но это уже совсем другая история.

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


Когда выставлять ордер?


Главной целью любого робота с подобными задачами — верно определить момент для покупки и продажи. В своем скрипте мы решили использовать механизм направлений, когда алгоритм пытается предугадать следующий шаг, по которому пойдет курс необходимой валюты. Далее приведена выдержка из логов бота, где можно увидеть «направления» для пары BTC — ETH:


0, date: 2017-10-04 11:14:05.217362, last: 0.06349930 
1, date: 2017-10-04 11:14:41.798799, last: 0.06349955 
1, date: 2017-10-04 11:19:54.559547, last: 0.06360275 
1, date: 2017-10-04 11:20:37.940202, last: 0.06370000 
0, date: 2017-10-04 11:20:52.351764, last: 0.06371080 
1, date: 2017-10-04 11:21:23.222651, last: 0.06364501 
1, date: 2017-10-04 11:21:42.255728, last: 0.06365983 
1, date: 2017-10-04 11:22:02.589577, last: 0.06370500 

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

Первая цифра в данном листинге — та самая попытка робота предугадать куда направится цена в следующий момент, где 0 — цена снизится, 1 — цена увеличится. В результате работы бот имеет очень много таких направлений для каждой из более чем 50-ти торговых пар.


Направления получили. А что дальше?


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


(1, 1, 1, 1, 1, 0, 0)

Такой список направлений с вероятностью 80% свидетельствует о том, что в этот момент курс валюты начал падать и следует её продать.


По какой цене выставлять?


Ещё одним важным пунктом был вопрос расчета цены, по которой необходимо выставить ордер. Здесь нам на помощь приходят всё те же данные из WS — данные о текущих ордерах на бирже. Зная весь «стакан» ордеров на бирже, мы опускаемся в нем до тех пор, пока не достигнем условия, когда количество валюты, которое хочет выставить бот, равно сумме выставленных в ордерах количествах токенов.


Остальные настройки


Такие настройки, как желаемое количество валюты и сами пары, с которыми мы хотим работать, мы решили вынести в Web интерфейс, чтобы в ходе работы мы смогли сами выбирать чем торговать. Время жизни ордера мы установили на 5 минут — ордера старше этого времени мы просто отменяем.


Что в итоге?


После реализации описанного выше алгоритма у нас получилось следующее:


Botwebinterface

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




Конечный результат нашей работы можно найти в нашем репозитории на GitHub.




К сожалению, не доступен сервер mySQL