Биржам выгодно, что бы вы писали роботов.
И для этого они облегчают работу по их созданию
Для того, что бы автоматизировать и ускорить свою работу на бирже, надо как то научиться с биржей взаимодействовать. Специально для этого, биржи предоставляют специальный интерфейс для программистов. Более того – бирже ВЫГОДНО, что бы вы делали ставки чаще и прокручивали бОльшие суммы – это приносит бирже деньги за счет комиссии, и увеличивает объем торгов, что привлекает новых игроков.
Этот программный интерфейс называется 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 имеют структуру, одни элементы вкладываются в другие и так далее.
Напишем код, что бы выводить в таком же виде в окне программы
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 методов).
Так же я особо не налегаю на разъяснение языка программирования, который использую здесь, так как это отдельная большая тема для изучения, но может быть стоит какие-то моменты прояснять подробнее? Для человека, пока далекого от программирования, биржевой торговли и прочего этот материал может показаться сложным.
В любом случае, жду ваших вопросов и замечаний в комментариях, а вам желаю хороших заработков и удачи!
Пальцем в небо - попробуйте таймаут добавить к коннекту
r = requests.get('https://api.exmo.com/v1/ticker/', timeout=10)
И плохо что свои комменты не можна редактировать!
Не вопрос - https://bablofil.ru/yobit-api-python/
А можно в обычном c:\file.html сделать на базе
https://api.exmo.com/v1/currency
Просмотр курсов с эксмо? А то у них курс всегда отличается.
А по https://api.exmo.com/v1/currency/
["USD","EUR","RUB","PLN","UAH","BTC","LTC","DOGE","DASH","ETH","WAVES","ZEC","USDT","XMR","XRP","KICK","ETC","BCH"]
курсы
А по вашей ссылке просто список валют
Создайте файл file.html
Скопируйте туда этот текст
......