Биржевой бот на Python — часть 2
Переходим к практической части на Python
Предыдущая часть: клац.
Подготовка
Итак для работы с API Poloniex’а я воспользовался готовой библиотекой от s4w3d0ff — python-poloniex, которая позволяет получать стакан, тикер с биржи.
Устанавливаем ее с помощью pip3 install.
Формирование пар
Перейдем к самому алгоритму.
Первоначально я загружаю список пар валют (находится в pairs.json, тут вы можете задать свои пары), за которыми будет следить бот с помощью функции coin_pairs.
В связи с тем, что API предоставляет пары только в одном формате, мне нужно сформировать стоимость активов относительно других активов.
Например: на бирже существует пара BTC_ETH, но обратной ETH_BTC нет. Поэтому, если вы хотите выполнить покупку ETH_BTC, вам необходимо сделать продажу в BTC_ETH.
Для этого я создаю ассоциативный массив пар, в котором лежит другой ассоциативный массив — dictionary.
В результате я смогу получить информацию о паре, просто выполнив вызов dictionary[“ETH”][“BTC”]. Функция returnOrderBook возвращает биржевой стакан. Каждый объект будет хранить цену и доступный объем.
Давайте рассмотрим на примере как работает данная функция. Пусть наша пара будет BTC_ETH. Допустим, что при обращении за биржевым стаканом, мы получили список ордеров, в которых самым выгодным были ask [0.00007600, 1164], bid [0.00006901, 200]. Первая цифра — это стоимость за актив. Вторая - это объем.
Тогда для BTC_ETH мы сформируем следующий объект, который будет доступен с помощью вызова dictionary[“BTC”][“ETH”]:
А для ETH_BTC price будет равен 1 / 0.00006901, amount будет равен 200 * 0.00006901. Объект будет доступен по вызову , dictionary[“ETH”][“BTC”]
Отлично, теперь у нас есть стоимость за активы, относительно других активов.
Поиск арбитражных ситуаций
Перейдем к следующему этапу: циклу, внутри которого происходит поиск арбитражных ситуаций.
В MAIN_ACTIVE хранятся два актива, с которых будет начинаться и заканчиваться связка арбитражной ситуации. Сама связка состоит из трех контор. Приведу пример:
ETH-BCH-XPR-ETH
ETH в данном случае MAIN_ACTIVE.
Затем идет перебор двух других контор в цикле. Мы пропускаем итерацию, если одна из перебираемых контор входит в MAIN_ACTIVE.
order_1, order_2, order_3 являются описанными выше объектами, с помощью которых мы сможем выполнить ордера. В примере ETH-BCH-XPR-ETH order_1 будет отвечать за ETH_BCH, order_2 за BCH_XPR, order_3 за XPR_ETH.
Так как в разных парах могут быть разные объемы покупки и продажи актива. Нам необходимо высчитывать объем с помощью функции get_amount. Она пройдет по всему списку ордеров и выдаст необходимый объем.
В конце выполняется вычисление функции, которая позволяет понять является ли данная связка арбитражной ситуацией.
В данном случае выражение transfer_3 / order_price должно быть больше единицы.
Вот и все. Попробуйте запустить данную программу и в течении 5–10 минут и вы увидите арбитражные ситуации, жизнь которых будет 1–3 секунд. Заработать на них вы не сумеете, так как обработать несколько ордеров за 3 секунды практически невозможно, но понимание работы бирж, позволит вам создавать более сложные стратегии заработка на бирже.
Код вы можете найти на github.