Биржевой бот на Python — часть 2

Переходим к практической части на Python

Влад Скуришин
2 min readFeb 7, 2018

Предыдущая часть: клац.

Подготовка

Итак для работы с 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.

--

--

Responses (1)