В свете бурного развития криптоиндустрии и криптоторговли в частности, наша команда, в рамках эксперимента, решила создать торгового робота, основной целью которого является торговля на криптоплощадке poloniex. В этой статье я постараюсь рассказать о всех трудностях, возникших во время написания робота, а так же о результатах, которых нам удалось достичь. В начале нашего пути нам был необходим ресурс, где бы мы смогли отслеживать наши «владения» — т.е. балансы разных валют на разных биржах в одном месте, с графиками и полными суммами. Так же была необходимость добавления кошельков основных валют, с отслеживанием истории транзакций на них. Первоначально робот опрашивал биржу один раз в несколько секунд, производил некоторые нехитрые расчеты с помощью вычисления Bollinger bands (link) и выставлял ордера, если считал, что это выгодно. Данный алгоритм работал несколько месяцев, после чего возникла идея принципиально изменить логику работы — робот не должен был опрашивать биржу на предмет изменения курса валюты, он должен был знать о изменении цены в сам момент её изменения. На момент написания скрипта таким функционалом обладала одна из криптовалютных площадок, которой мы пользовались — poloniex. Функционал этот — WAMP protocol. Он позволял подписаться на необходимый канал на бирже, и своевременно получать сообщения о изменениях курсов. После того как мы получили самую актуальную информацию о текущей ситуации на бирже, необходимо было придумать — когда выставить ордер, при каких условиях отменить его и сколько будет жить ордер на покупку или продажу если не сможет выполниться. Главной целью любого робота с подобными задачами — верно определить момент для покупки и продажи. В своем скрипте мы решили использовать механизм направлений, когда алгоритм пытается предугадать следующий шаг, по которому пойдет курс необходимой валюты. Далее приведена выдержка из логов бота, где можно увидеть «направления» для пары BTC — ETH: Первая цифра в данном листинге — та самая попытка робота предугадать куда направится цена в следующий момент, где 0 — цена снизится, 1 — цена увеличится. В результате работы бот имеет очень много таких направлений для каждой из более чем 50-ти торговых пар. Теперь необходимо определиться — как будет выглядеть маска из n последовательных направлений, когда мы сможем с уверенностью сказать, что эта точка является точкой, после которой курс изменится, и начнет расти в противоположном направлении. После долгого тестирования и изменения масок направлений, мы остановились на варианте где такой точке предшествует 5(-1 для допущения коррекции на бирже) одинаковых направлений и 2 противоположных. Например: Такой список направлений с вероятностью 80% свидетельствует о том, что в этот момент курс валюты начал падать и следует её продать. Ещё одним важным пунктом был вопрос расчета цены, по которой необходимо выставить ордер. Здесь нам на помощь приходят всё те же данные из WS — данные о текущих ордерах на бирже. Зная весь «стакан» ордеров на бирже, мы опускаемся в нем до тех пор, пока не достигнем условия, когда количество валюты, которое хочет выставить бот, равно сумме выставленных в ордерах количествах токенов. Такие настройки, как желаемое количество валюты и сами пары, с которыми мы хотим работать, мы решили вынести в Web интерфейс, чтобы в ходе работы мы смогли сами выбирать чем торговать. Время жизни ордера мы установили на 5 минут — ордера старше этого времени мы просто отменяем. После реализации описанного выше алгоритма у нас получилось следующее: На представленном выше скриншоте показан Web-интерфейс конечного результата. На графике видно, когда робот решил выставить ордер и по какой цене, когда ордер был отменен и по какой причине. В правой части интерфейса расположились всевозможные настройки, от отключения основных валют площадки до настройки желаемого количества токенов в процентном соотношении к общему количеству средств. Конечный результат нашей работы можно найти в нашем репозитории на GitHub. Python разработчик