Чего бы с биржи стянуть? Изучаем 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 методов).

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

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


Это статья из цикла "Популярно о бирже"
Все статьи цикла:

Последнее изменение:

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



Комментарии
14.05.2017 11:47:34
Примечание для тех, у кого exmo.com заблокирован Ростелекомом. Вы можете продолжать пользоваться API, но все вхождения api.exmo.com вам нужно будет заменить на api.exmo.me.
Пример: 
строку
r = requests.get('https://api.exmo.com/v1/order_book/?pair=BTC_USD')
нужно заменить на
r = requests.get('https://api.exmo.me/v1/order_book/?pair=BTC_USD')

Если ваш скрипт будет после этого ругаться (вот так: requests.exceptions.SSLError: hostname 'api.exmo.me' doesn't match 'api.exmo.com')  и не работать, то нужно еще дописать verify=False в параметры, вот так:
r = requests.get('https://api.exmo.me/v1/order_book/?pair=BTC_USD', verify=False)

При этом ваш трафик пойдет по протоколу http, что, по идее, небезопасно, но так как на данном этапе вы не указываете никаких секретных данных, а только пользуетесь общедоступными методами, то вы ничем и не рискуете.
Проголосовать Проголосовать
1 0
19.06.2017 20:50:35
спасибо.все понятно и доступно. а дальше что?. хотелось бы получить разницу между максимальным и минимальным значением цены и найти самое максимальное из них.
Проголосовать Проголосовать
1 0
23.06.2017 19:42:27
А дальше в других статьях цикла )

Что бы получить максимальное значение из нескольких, есть соответствующая функция max, только значения надо привести к числовому типу float (числу с плавающей точкой).
Получится вот так (замените это в коде): 
        print(
            "Валюта",
            pair,
            "текущая максимальная цена покупки",
            obj[pair]['buy_price'],
            "текущая минимальная цена продажи",
            obj[pair]['sell_price'],
            "Максимальная вообще",
            max(float(obj[pair]['buy_price']), float(obj[pair]['sell_price']))
        )
Проголосовать Проголосовать
0 0
17.07.2017 14:36:41
import requests
import json
import time

# программа будет работать бесконечно
while True:
    # получить данные с биржи
    r = requests.get('https://api.exmo.com/v1/ticker/')

До сюда доходит и ничего не происходить, если убрать цикл с таймером то все работает. В чем может быть причина?
Проголосовать Проголосовать
0 0
19.07.2017 17:09:23
А как вы узнали, что дошло до туда, если ничего не происходит? )
Пальцем в небо - попробуйте таймаут добавить к коннекту

r = requests.get('https://api.exmo.com/v1/ticker/', timeout=10)
Проголосовать Проголосовать
0 0
24.07.2017 13:56:53
Спс, за доходчивый урок(все круто). Ради этого не поленился даже зарегистрироваться))))
Проголосовать Проголосовать
0 0
24.07.2017 15:30:46
Спасибо вам )
Проголосовать Проголосовать
0 0
25.07.2017 01:43:46
Если можно нужна помощь!
1. В конце списка нужно еще выводить один параметр которого нет, ((high-low)*100)/avg (подставлял само собой не так). Никак не получается это сделать, хоть и пытался менять тип данных.
2. Полученные данные мне снова нужно конвертировать в json. С этим у меня тоже проблемы, я так понимаю сначала нужно конвертануть в словарь, а потом в json?
import requests
import json

while True:
    r = requests.get('https://api.exmo.com/v1/ticker/')
    obj = json.loads(r.text)

    total = []
    for pair in obj:
        all_pair = (
            'pair:', pair.lower(),
            'updated:', obj[pair]['updated'],
            'last_trade:', obj[pair]['last_trade'],
            'high:', obj[pair]['high'],
            'low:', obj[pair]['low'],
            'avg:', obj[pair]['avg'],
            'buy:', obj[pair]['buy_price'],
            'sell:', obj[pair]['sell_price'],
            'vol_curr:', obj[pair]['vol_curr'],
            'vol:', obj[pair]['vol']
            float(obj[pair]['high']) - float(obj[pair]['low'])
        )
        total.append(all_pair)
    print(total)

P.S. Не судите строго еще нуб, только разбираюсь!
Проголосовать Проголосовать
0 0
25.07.2017 02:06:54
С первым вроде как разобрался. Так что быду благодарен если с json поможешь.
И плохо что свои комменты не можна редактировать!
Проголосовать Проголосовать
0 0
25.07.2017 02:12:37
import requests
import json
import  time

while True:
    r = requests.get('https://api.exmo.com/v1/ticker/')
    obj = json.loads(r.text)
    total = []
    
    for pair in obj:
        all_pair = (
            'pair:', pair.lower(),
            'updated:', obj[pair]['updated'],
            'last_trade:', obj[pair]['last_trade'],
            'high:', obj[pair]['high'],
            'low:', obj[pair]['low'],
            'avg:', obj[pair]['avg'],
            'buy:', obj[pair]['buy_price'],
            'sell:', obj[pair]['sell_price'],
            'vol_curr:', obj[pair]['vol_curr'],
            'vol:', obj[pair]['vol'],
            'volatilyty', ((float(obj[pair]['high']) - float(obj[pair]['low'])) * 100) / float(obj[pair]['avg'])
        )
        total.append(all_pair)
    print(total)
    time.sleep(300)
Проголосовать Проголосовать
0 0
25.07.2017 09:59:09
В JSON можно конвертировать и массивы [], и словари {}, смотря какая структура данных нужна на выходе.
Насчет кода пару замечаний - для создания словаря нужны {}, а не () 
В данном случае создавался кортеж из значений, разделенных запятой, а от двоеточий не было смысла, т.к. внутри кавычек они становятся не разделителями, а частью строки. В общем - словарь должен обрамляться {}, а все значения  в нем должны иметь вид "ключ" : "значение", например  {'pair': pair.lower(), 'updated': obj[pair]['updated']}. Кавычки могут быть, могут не быть, там по ситуации. Поправил код:

import requests
import json
import  time

while True:
    r = requests.get('https://api.exmo.com/v1/ticker/')
    obj = json.loads(r.text)
    total = []
    
    for pair in obj:
        all_pair = {
            'pair': pair.lower(),
            'updated': obj[pair]['updated'],
            'last_trade': obj[pair]['last_trade'],
            'high': obj[pair]['high'],
            'low': obj[pair]['low'],
            'avg': obj[pair]['avg'],
            'buy': obj[pair]['buy_price'],
            'sell': obj[pair]['sell_price'],
            'vol_curr': obj[pair]['vol_curr'],
            'vol': obj[pair]['vol'],
            'volatilyty': ((float(obj[pair]['high']) - float(obj[pair]['low'])) * 100) / float(obj[pair]['avg'])
        }
        total.append(all_pair)

    # Вывести содержимое получившегося массива со словарями
    #print(total)

    # Перевести структуру в объект JSON и вывести содержимое
    # all_pair_json = json.dumps(total)
    # print(all_pair_json)
    
    # Сформировать JSON и вывести в файл, расположенный там, откуда запускается скрипт
    with open('pair.json', 'w') as output:
        print(json.dumps(total), file=output)

    #time.sleep(300)

Насчет комментариев да, увы.. Подумаю, как лучше это сделать
Проголосовать Проголосовать
1 0
16.08.2017 14:53:18
Большая просьба написать подобную статью по бирже Poloniex. Если на Exmo в руководстве всё довольно подробно расписано, то на Poloniex мануал по API крайне скудный. Не находил в интернете такой информации, думаю ваша статья была бы популярной.
Проголосовать Проголосовать
0 0
12.09.2017 18:56:56
Подскажите нубу, как вывести значение из контейнера?
Вот такие данные получаю при запросе, как вывести например Ask
    "result": [
        {
            "Ask": 4270.0,
            "BaseVolume": 24494449.12946066,
            "Bid": 4269.0,
            "Created": "2015-12-11T06:31:40.633",
            "High": 4377.0,
            "Last": 4270.0,
            "Low": 4161.0,
            "MarketName": "USDT-BTC",
            "OpenBuyOrders": 5256,
            "OpenSellOrders": 2467,
            "PrevDay": 4283.99999982,
            "TimeStamp": "2017-09-12T14:56:06.36",
            "Volume": 5722.23013955
        }
Проголосовать Проголосовать
0 0
12.09.2017 19:00:27
] в конце еще забыл
Проголосовать Проголосовать
0 0
23.09.2017 17:10:18
Добрый!

result это массив, в массиве словари, первый словарь находится в позиции 0, второй в позиции 1 и т.п.

В данном случае
ask = obj['result'][0]['Ask']
Проголосовать Проголосовать
0 0
26.09.2017 16:19:19
добрый день если не сложно то yiobit.net такой же урок
Проголосовать Проголосовать
0 0
04.10.2017 23:43:21
Добрый день!
Не вопрос - https://bablofil.ru/yobit-api-python/
Проголосовать Проголосовать
0 0
22.12.2017 22:02:24
Здравствуйте. Поставил Python 3.6.4 Применил код :
import requests

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

Получил:
Здравствуйте. Поставил Python 3.6.4 Применил код :
import requests

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

Получил:
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
 RESTART: C:/Users/USER/AppData/Local/Programs/Python/Python36-32/MYPROGS/2DemoTest_Exmo.py 
Traceback (most recent call last):
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connection.py", line 326, in connect
    ssl_context=context)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\util\ssl_.py", line 329, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 814, in __init__
    self.do_handshake()
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 1068, in do_handshake
    self._sslobj.do_handshake()
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:777)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\adapters.py", line 440, in send
    timeout=timeout
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\util\retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.exmo.com', port=443): Max retries exceeded with url: /v1/currency/ (Caused by SSLError(SSLError(1, '[SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:777)'),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/USER/AppData/Local/Programs/Python/Python36-32/MYPROGS/2DemoTest_Exmo.py", line 3, in <module>
    r = requests.get('https://api.exmo.com/v1/currency/')
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\adapters.py", line 506, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='api.exmo.com', port=443): Max retries exceeded with url: /v1/currency/ (Caused by SSLError(SSLError(1, '[SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:777)'),))
>>> 

Чё не так сделал? =) </module>
Проголосовать Проголосовать
0 0
22.12.2017 22:06:20
По ссылке https://api.exmo.com/v1/order_book/?pair=BTC_USD
Пройти не могу без VPN. Может из за этого?
Проголосовать Проголосовать
0 0
22.12.2017 22:47:56
Действительно из-за блокировки Exmo.com на Exmo.me переход идёт. 
Поменял первый пример на:
import requests

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

Получаю:
2DemoTest_Exmo.py 
["USD","EUR","RUB","PLN","UAH","BTC","LTC","DOGE","DASH","ETH","WAVES","ZEC","USDT","XMR","XRP","KICK","ETC","BCH"]
Проголосовать Проголосовать
0 0
24.12.2017 19:57:15
Доброго дня .
А можно в обычном c:\file.html сделать на базе
https://api.exmo.com/v1/currency
Просмотр курсов с эксмо? А то у них курс всегда отличается.
Проголосовать Проголосовать
0 0
25.12.2017 10:25:17
Легко.
Создайте файл file.html
Скопируйте туда этот текст

<html>
<head>
	<script crossorigin="anonymous" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

 <link crossorigin="anonymous" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" rel="stylesheet"/>
 <script crossorigin="anonymous" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

</head>
<body>

<table class="table">
  <thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">BUY</th>
      <th scope="col">SELL</th>
      <th scope="col">LAST</th>
      <th scope="col">HIGH</th>
      <th scope="col">LOW</th>
      <th scope="col">VOL</th>
    </tr>
  </thead>
  <tbody></tbody>
</table>
	
	<script type="text/javascript">
		$(function(){

			function get_data() {
				$(".rate_row").remove();
				$.get(
					"http://api.exmo.me/v1/ticker",
					{},
					function(data){
						$.each(data, function(k, v){
							var rate_row = '<tr class="rate_row">';
							rate_row += '<th scope="row">'+k+'</th>';
							rate_row += '<td>'+v['buy_price']+'</td>';
							rate_row += '<td>'+v['sell_price']+'</td>';
							rate_row += '<td>'+v['last_trade']+'</td>';
							rate_row += '<td>'+v['high']+'</td>';
							rate_row += '<td>'+v['low']+'</td>';
							rate_row += '<td>'+v['vol']+'</td>';
							rate_row += '</tr>';
							$("tbody").append(rate_row);
							console.log(k,v);
						});
					},
					'json'
				)
			}
			get_data();
			setInterval(get_data, 1500);
		});
	</script>
</body>
</html>

Сохраните
Откройте в браузере
Проголосовать Проголосовать
0 0
26.12.2017 14:05:29
Спасибо, но это немного другое, это вроде торги.
А по https://api.exmo.com/v1/currency/
["USD","EUR","RUB","PLN","UAH","BTC","LTC","DOGE","DASH","ETH","WAVES","ZEC","USDT","XMR","XRP","KICK","ETC","BCH"]
курсы
Проголосовать Проголосовать
0 0
27.12.2017 11:07:15
Нет, это курсы
А по вашей ссылке просто список валют
Проголосовать Проголосовать
0 0
07.01.2018 20:08:57
Андрей
Спасибо Большое за статью. Недавно начала изучать Питон и наконецто (о боже) хоть какие то знания мне пригодились. А то сухую книгу читаю да ролики смотрю

Вопрос, точнее пожелание.
Можете сделать такие "скрипты" для биржи Bitfinex. Иногда ооочень впадлу открывать браузер, ждать пока он загрузит.. лишь чтобы глянуть курс Битка или Рипла. С exmo теперь всё стало проще, хотелось бы для битфинекса =))
Проголосовать Проголосовать
0 0
30.01.2018 17:55:05
Здравствуйте, подскажите пожалуйста, как из API https://www.cryptopia.co.nz/api/GetMarkets
Получить значения AskPrice и BidPrice только по парам
ETC/BTC  ETC/DOGE ETC/USDT 

Если для yobit.net код будет выглядит так: 

res = requests.get('https://yobit.net/api/3/ticker/btc_rur-usd_rur') 
res_obj = json.loads(res.text)
print( res_obj['usd_rur']['sell'],
res_obj['btc_rur']['sell'],)

как сделать тоже самое для cryptopia.co.nz?
Проголосовать Проголосовать
0 0
04.02.2018 16:38:25
Добрый вечер. Андрей спасибо информация интересная и главное полезная. Собрал из ваших примеров скрипт но не могу заставить его обновляться автоматически подскажите в чем причина.
import requests
import json
import time

# получить данные с биржи
res = requests.get('https://yobit.io/api/3/ticker/btc_rur-eth_rur-doge_rur-waves_rur-usd_rur') # получаем данные ticker'а
res_obj = json.loads(res.text) # переводим полученный текст в объект с данными


from openpyxl import Workbook
wb = Workbook()
# Выбрать активную книгу
ws = wb.active
# Добавим строку с данными
ws.append(['rur '])

# Запишем котировки в столбик А
ws['A2'] = (" %0.8f" % res_obj['btc_rur']['buy'])
ws['A3'] = (" %0.8f" % res_obj['eth_rur']['buy'])
ws['A4'] = (" %0.8f" % res_obj['doge_rur']['buy'])
ws['A5'] = (" %0.8f" % res_obj['waves_rur']['buy'])
ws['A6'] = (" %0.8f" % res_obj['usd_rur']['buy'])

# Сохраним файл рядом со скриптом
import os

wb.save(os.path.dirname(os.path.abspath(__file__)) + "/sample.xlsx")
   
# подождать три секунды и начать заново
time.sleep(10)
Проголосовать Проголосовать
0 0
15.02.2018 09:52:18
Добрый день.
Добавьте цикл
while True:
    # получить данные с биржи
    res = reque.....
    .....
    time.sleep(10)
Проголосовать Проголосовать
0 0
19.02.2018 11:17:25
Добрый день. С циклом тоже пробовал но либо вылазят ошибки либо скрипт вообще не выполняется.
Проголосовать Проголосовать
0 0
11.02.2018 21:43:58
"Легко.
Создайте файл file.html
Скопируйте туда этот текст
......



Сохраните
Откройте в браузере"

Подскажите пожалуйста, как в данном коде сделать выборку нескольких пар, а не всех?
Проголосовать Проголосовать
0 0
03.03.2018 07:05:29
Здравствуйте
Спасибо за статью.

При попытке подключиться к API биржи EXMO с простейшим запросом как в вашем примере возникает некая ошибка (связанная с библиотекой requests)
Текст скрипта:

import requests
r = requests.get('<span class="marker">https://api.exmo.com/v1/currency/</span>')
print(r.text)

Попытка исполнения скрипта дает следующее:

============= RESTART: Z:\Python - коды\TestEXMO_API_public_1.py =============
Traceback (most recent call last):
  File "Z:\Python - коды\TestEXMO_API_public_1.py", line 3, in <module>
    r = requests.get('<span class="marker">https://api.exmo.com/v1/currency/</span>')
  File "Z:\Program Files (x86)\Python36-32\lib\site-packages\requests\api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "Z:\Program Files (x86)\Python36-32\lib\site-packages\requests\api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "Z:\Program Files (x86)\Python36-32\lib\site-packages\requests\sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "Z:\Program Files (x86)\Python36-32\lib\site-packages\requests\sessions.py", line 612, in send
    adapter = self.get_adapter(url=request.url)
  File "Z:\Program Files (x86)\Python36-32\lib\site-packages\requests\sessions.py", line 703, in get_adapter
    raise InvalidSchema("No connection adapters were found for '%s'" % url)
requests.exceptions.InvalidSchema: No connection adapters were found for '<span class="marker">https://api.exmo.com/v1/currency/</span>'
>>> 

Исполнение данной команды в браузере дает ожидаемый результат.
Библиотека requests установлена через командную строку командой pip install requests с виду без происшествий. Поскольку Python только начал осваивать, самому не получается понять в чем проблема.
Заранее спасибо.</module>
Проголосовать Проголосовать
0 0
03.03.2018 07:34:51
Разобрался. Прошу прощения за беспокойство. В текст запроса get случайно перенес и тег который оказался у вас в примере в тексте. Глупая ошибка, но сразу не заметил т.к. синтаксис пока только изучаю.
Проголосовать Проголосовать
0 0
03.03.2018 10:11:15
Спасибо, поправил статью)
Проголосовать Проголосовать
0 0
09.06.2018 19:38:32
а не могли бы вы отдельно статью про нонс написать, как его можно написать что за чем и почему!?!
Проголосовать Проголосовать
0 0
10.06.2018 11:06:42
Хорошо, но позже, т.к. это немного уход в криптографию
А в общих чертах я отвечал в комментариях к этой статье https://bablofil.ru/bot-dlya-birjy-exmo/
Благодаря nonce злоумышленник не сможет перехватить пакет данных, идущих к бирже и отправить повторно (точнее, это будет бесполезное действие)
Так же из-за сетевых задержек бирже нужно знать, какой пакет был отправлен первым, а какой вторым, что бы правильно воспроизвести порядок действий, и т.п.
Проголосовать Проголосовать
0 0
10.06.2018 04:39:37
Всем привет, в связи с отсутствием гайда для api по bitfinex задам совершенно тупой вопрос, в программированнии полный 0, не судите строго:
итак, вот ссылка на сам api: https://docs.bitfinex.com/v1/reference#rest-public-trades
прочитав статью пришел к этому, все ништяк, выдает данные с биржи в столбик, ура:
________________________________________________________________________
import requests
import json
import time

url = "https://api.bitfinex.com/v1/trades/btcusd"

r = requests.request("GET", url)

obj=json.loads(r.text)

print(json.dumps(obj, sort_keys=True, indent=4, separators=(',',': ')))
_______________________________________________________
идем дальше: теперь я хочу вывести только объемы по совершенным сделкам, для этого редактирую последнюю строчку таким образом:

print(json.dumps(obj['amount'], sort_keys=True, indent=4, separators=(',',': ')))

и получаю такую ошибку: 
TypeError: list indices must be integers or slices, not str

Как я понял, нужно изменить тип этой самой amount, в связи с этим возникает первый вопрос: как это сделать?
-Второй вопрос: в api биржи есть опция ограничения количества выводимых данных (limit_trades=число), куда мне его запихать?? (вариант, описанный в статье "ссылка&limit;=число" не работает)

-Третий вопрос: как осуществить только вывод объемов по типу buy и sell?

-Четвертый вопрос: как придать объемам типа sell отрицательное значение и суммировать все объемы?
Проголосовать Проголосовать
0 0
10.06.2018 11:18:12
obj у вас - набор словарей, что бы получить объем КАЖДОЙ записи вам нужно в цикле пройтись по каждому элементу, например, вот так:

for item in obj:
    print(item['type'], item['amount'])

To make long story short, вот вам код, который ответит на все вопросы: https://pastebin.com/jVakmmVx
Проголосовать Проголосовать
0 0
10.06.2018 12:59:45
Супер, спасибо за помощь, все так как и планировал)
Немного доработал код, вот что получилось:

import requests
import json
import time

while True:
#запрашиваем данные с биржи, поставив ограничение
#в 5 последних сделок ?limit_trades=5
 url = "https://api.bitfinex.com/v1/trades/btcusd?limit_trades=5"
    
 r = requests.request("GET", url)
#переводим данные в понятный компьютеру формат
 obj=json.loads(r.text)

#пишем сумму всех 5 сделок (по умолчанию-0)
 total = 0

#перебираем массив в словаре obj
 for item in obj:
    
   #задаем параметры для сделок типа BUY
    if item['type'] == 'buy':
        
        #прибавляем к сумме сделок, равной нулю, значения сделок типа BUY
        total += float(item['amount'])
        
   #задаем параметры для сделок типа SELL
    elif item['type'] == 'sell':
        
        #даем всем сделкам типа SELL отрицательное значение, и прибавляем
        #их к сумме
        total += -1*float(item['amount'])
        
#если сумма >2, пишется BUY, если <-2-SELL        
 if total>2: print ('BUY')
 if total<-2: print ('SELL')
time.sleep(0.5)
Проголосовать Проголосовать
0 0
Пожалуйста, авторизуйтесь, что бы оставить свой комментарий
Крипто-кошельки для помощи и благодарности проекту:

Bitcoin адрес проекта: [[address]]

Перевод на сумму [[value]] BTC получен. Спасибо!.
[[error]]

Ethereum адрес проекта: [[address]]