Чего бы с биржи стянуть? Изучаем API и способы работы с ним.

Биржам выгодно, что бы вы писали роботов.

И для этого они облегчают работу по их созданию

Для того, что бы автоматизировать и ускорить свою работу на бирже, надо как то научиться с биржей взаимодействовать. Специально для этого, биржи предоставляют специальный интерфейс для программистов. Более того – бирже ВЫГОДНО, что бы вы делали ставки чаще и прокручивали бОльшие суммы – это приносит бирже деньги за счет комиссии, и увеличивает объем торгов, что привлекает новых игроков.

Этот программный интерфейс называется API – аббревиатура от «application programming interface».На русский язык можно перевести как «интерфейс программирования приложений», «интерфейс прикладного программирования» и так далее. Не пугайтесь, все просто – вам достаточно зайти на нужную страницу на сайте биржи, и дело будет сделано.

Например, если вы зайдете на страницу https://api.exmo.com/v1/currency/, вы увидите список валют, по которым торгует биржа.

Данные предоставлены в специальном формате, удобном для программ, но и человеку не очень сложно понять их – например, в данном  случае вы видите список – USD, EUR, RUB и так далее, остальные символы разделяют и упорядочивают данные. Этот формат представления данных называется JSON, и он весьма популярен в Интернете.

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

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

Некоторые разделы API (страницы) общедоступны – например, последние совершенные сделки и текущие чужие открытые ордера. Такие разделы обычно именуются Public API, и для получения этой информации не требуется авторизация, получить данные может любой желающий.

Другие разделы, влияющие на личные данные пользователя или операции, связанные с деньгами – например, покупка валюты или запрос баланса, требуют определенных прав доступа, и их нужно настраивать отдельно. Такие методы доступа называются Private API. Работа с ними идет точно так же к с Public API, но требуются дополнительные действия при подключении. К таким операциям мы подойдем в следующих статьях, когда будем автоматизировать покупку/продажу.

В этой статье будет рассмотрена работа с Public API – тем более, что вам все равно нужны будут эти данные для полноценной работы робота. Все методы, доступные без авторизации, описаны на этой странице https://exmo.me/ru/api_doc#/public_api

Ладно, в общем, понятно, но как написать программу для работы с биржей?

В принципе, на картинке указан код, который получает те же данные, что и мы в начале статьи. Обратите внимание – всего три строчки кода.

о том, что надо установить на компьютер для написания такого кода, я писал в статье Автоматизируй это! Как перестать тратить время на рутину и заставить компьютер работать, почитайте, там тоже ничего сложного.

Вот сам код:

import requests

r = requests.get('https://api.exmo.com/v1/currency/')
print(r.text)

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

А вот результат вывода программы:


Реклама:


То же самое, что мы и видели на странице, не так ли? Давайте упорядочим полученные данные. Для этого надо немного изменить код. Пусть теперь он выглядит вот так:

import requests
import json

r = requests.get('https://api.exmo.com/v1/currency/')

obj = json.loads(r.text)
print(json.dumps(obj, sort_keys=True, indent=4, separators=(',',': ')))

Сохраним, запустим, что получилось?

Ура, оно вертится! Значит, программа получает и обрабатывает данные с биржи. Теперь надо научиться использовать это в практических целях – данный учебный пример, по большому счету, бесполезен.

Пишем что-то полезное

Что может быть полезным? Ну, например получение списка текущих сделок – мы сможем узнавать, кто что продает и покупает, выводить средний курс и вообще ориентироваться в происходящем.

За эти данные отвечает, как обычно, отдельный метод API, он доступен по этому адресу: https://api.exmo.com/v1/order_book/?pair=BTC_USD. Откроем его в браузере:

Эти данные посложнее для человеческого восприятия, и сходу выглядят как набор непонятных данных. Давайте пойдем по тому же пути, и для начала научимся получать их и выводить в окне программы. Поменяем адрес API (помните, я выделял желтым выше? Код возьмем оттуда же). И вот результат:

Все равно тарабарщина. А ведь это только 100 последних записей, что бы получить тысячу нужно в конец адреса добавить &limit=1000, итоговый адрес будет выглядеть вот так: https://api.exmo.com/v1/order_book/?pair=BTC_USD&limit=1000

Давайте выведем данные покрасивее и поймем, что там за структура – все данные в формате JSON имеют структуру, одни элементы вкладываются в другие и так далее.

ХИНТ: вы можете отформатировать JSON для комфортного просмотра online – перейдите на сайт http://jsoneditoronline.org/, вставьте код в левую колонку и нажмите на кнопку сверху слева. Получится примерно так:

Напишем код, что бы выводить в таком же виде в окне программы

import requests
import json

r = requests.get('https://api.exmo.com/v1/order_book/?pair=BTC_USD')

obj = json.loads(r.text)
print(json.dumps(obj, sort_keys=True, indent=4, separators=(',',': ')))

И выполняем его:

Стало читабельнее, не так ли? Давайте разберем структуру данных – я удалил ненужные пока записи, что бы умещалось на один экран. Вот так выглядит документ по сути:

В корневой узел BTC_USD вложены дочерние узлы:

ask_quantity - объем всех ордеров на продажу
ask_amount - сумма всех ордеров на продажу
ask_top - минимальная цена продажи
bid_quantity - объем всех ордеров на покупку
bid_amount - сумма всех ордеров на покупку
bid_top - максимальная цена покупки
bid - список ордеров на покупку, где каждая строка это цена, количество и сумма
ask - список ордеров на продажу, где каждая строка это цена, количество и сумма

Некоторые параметры представлены готовым значением. Некоторые содержат в себе дополнительные списки. Например “ask” по сути является контейнером, в котором лежат другие записи. Если бы мы могли свернуть “ask”, он выглядел бы примерно вот так:

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

Каждый такой контейнер внутри “ask” как раз определяет чье-то предложение на покупку. Первая цифра обозначает цену (в данном случае, в долларах) по которой этот человек хочет продать, вторая – сколько валюты он готов отдать(в данном случае, в BTC), а третья – итоговая сумма сделки. В этом примере человек хочет продать 0.001 BTC по цене 1068 долларов. Итоговая цена составит 1068*0.001 = 1.068. долларов. Человек хочет продать биткоинов на доллар, грубо говоря.

Что это вообще дает?

Давайте напишем программу, которая выводит максимальные цены покупки и продажи на текущий момент времени.

Код меняется не сильно, но теперь мы будем обращаться к конкретным полям документа – сейчас нас интересуют поля bid_top и ask_top. Давайте их выведем.

 Немного изменим код:

import requests
import json

r = requests.get('https://api.exmo.com/v1/order_book/?pair=BTC_USD')

obj = json.loads(r.text)
print(
        "минимальная цена продажи",
        obj['BTC_USD']['ask_top'],
        "максимальная цена покупки",
        obj['BTC_USD']['bid_top']
)


Запустим программу – получим текущие данные. Если будем запускать время от времени – они будут меняться, так как меняется максимальная сумма покупки и продажи.

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

import requests
import json
import time

while True:
    r = requests.get('https://api.exmo.com/v1/order_book/?pair=BTC_USD')

    obj = json.loads(r.text)
    print(
            "минимальная цена продажи",
            obj['BTC_USD']['ask_top'],
            "максимальная цена покупки",
            obj['BTC_USD']['bid_top']
    )
    time.sleep(30)

Работает, показывает данные (для выключения закройте окно программы)

Но.. как то скучно. Цена редко меняется, да и по одной валюте всего. Давайте используем другой метод - https://api.exmo.com/v1/ticker/.

Вот что он нам вернет (по всем валютам):

high - максимальная цена сделки за 24 часа
low - минимальная цена сделки за 24 часа
avg - средняя цена сделки за 24 часа
vol - объем всех сделок за 24 часа
vol_curr - сумма всех сделок за 24 часа
last_trade - цена последней сделки
buy_price - текущая максимальная цена покупки
sell_price - текущая минимальная цена продажи
updated - дата и время обновления данных

Немного поменяем код – как всегда, и выведем поля «текущая максимальная цена покупки» и «текущая минимальная цена продажи» для каждой валюты.

import requests
import json
import time

# программа будет работать бесконечно
while True:
    # получить данные с биржи
    r = requests.get('https://api.exmo.com/v1/ticker/')
    # переводим данные во понятный программе формат
    obj = json.loads(r.text)
    # находим все валюты, перечисленные в файле
    for pair in obj:

        print(
            "Валюта",
            pair,
            "текущая максимальная цена покупки",
            obj[pair]['buy_price'],
            "текущая минимальная цена продажи",
            obj[pair]['sell_price']
        )
   
    # подождать три секунды и начать заново
    time.sleep(3)

Вы можете спросить – зачем мне все это делать, если курсы я и так могу глазами посмотреть? Логично, но это нужно для того, что бы потом отрабатывать условия и давать роботу указания – например, если текущая цена такой-то валютной пары ниже такой-то суммы, то продавай.  Если программирование вас увлечет, вы можете эти данные не просто выводить на экран, а сохранять, анализировать, строить графики и т.п. Как вы уже видели, много кода писать не надо – все делается в несколько строк.

Для домашних экспериментов и практики могу посоветовать вам научиться получать и выводить информацию по всем методам, описанным на этой странице https://exmo.me/ru/api_doc#/public_api (от раздела  PUBLIC API до раздела AUTHENTICATED API – всего 5 методов).

Так же я особо не налегаю на разъяснение языка программирования, который использую здесь, так как это отдельная большая тема для изучения, но может быть стоит какие-то моменты прояснять подробнее? Для человека, пока далекого от программирования, биржевой торговли и прочего этот материал может показаться сложным.

В любом случае, жду ваших вопросов и замечаний в комментариях, а вам желаю хороших заработков и удачи!

Тэги: