Давайте разберем API Полоникса, т.к. а так же ответим на некоторые вопросы, которые мне приходят по почте или в телеграмме.
Итак, документация по API расписана тут https://poloniex.com/support/api/.
Пойдем по порядку.
В самом начале указаны примеры готового кода для работы с API на трех разных языках программирования - NodeJS, PHP и Python. Это означает, что вы можете посмотреть, как другие люди подцепляются к API биржи и взять этот код за основу - тут нет логики, нет ботов и всего такого - это обертки для тех, кто не хочет писать лишний код.
Код, представленный для Питона, написан для Питона версии 2.7, в этом нет ничего плохого, эта версия всё еще используется, но я работаю в Python3.6+, поэтому напишу свою обертку. Вот такую:
import time
import json
import urllib, http.client
import hmac, hashlib
from urllib.parse import urlparse, urlencode
class Poloniex():
public_methods = [
'returnTicker',
'return24hVolume',
'returnOrderBook',
'returnTradeHistory',
'returnChartData',
'returnCurrencies',
'returnLoanOrders'
]
def __init__(self, API_KEY, API_SECRET):
self.API_KEY = API_KEY
self.API_SECRET = bytearray(API_SECRET, encoding='utf-8')
def __getattr__(self, name):
def wrapper(*args, **kwargs):
method = 'public' if name in self.public_methods else 'tradingApi'
kwargs.update(method=method, command=name)
return self.call_api(**kwargs)
return wrapper
def call_api(self, **kwargs):
api_url='https://poloniex.com/'+kwargs['method']
if kwargs['method'] == 'public':
api_url += '?'+urlencode(kwargs)
http_method="GET"
else:
http_method="POST"
time.sleep(0.2) # По правилам биржи нельзя больше 6 запросов в секунду
payload = {'nonce': int(round(time.time()*1000))}
if kwargs:
payload.update(kwargs)
payload = urllib.parse.urlencode(payload)
H = hmac.new(key=self.API_SECRET, digestmod=hashlib.sha512)
H.update(payload.encode('utf-8'))
sign = H.hexdigest()
headers = {"Content-type": "application/x-www-form-urlencoded",
"Key":self.API_KEY,
"Sign":sign}
url_o = urlparse(api_url)
conn = http.client.HTTPSConnection(url_o.netloc)
conn.request(http_method, api_url, payload, headers)
response = conn.getresponse().read()
conn.close()
try:
obj = json.loads(response.decode('utf-8'))
if 'error' in obj and obj['error']:
raise Exception(obj['error'])
return obj
except ValueError:
raise Exception('Получены некорректные данные (проверьте, правильно ли указан метод API {api_method})'.format(api_method=kwargs['command']))
Сохраните этот код в файл под названием poloniex_api.py (в данном случае это отчасти важно), и запомните, куда сохранили. Для демонстрации с API создайте в той же папке рядом файл polo_test.py (тут название не важно), туда скопируйте код
from poloniex_api import Poloniex
my_polo = Poloniex(
API_KEY = '',
API_SECRET = ''
)
ticker = my_polo.returnTicker()
print('TICKER', ticker)
Сохраните, нажмите F5 - вы должны увидеть информацию по рынку - подробнее рассмотрим далее. Ключи API на этом этапе вводить не обязательно.
Теперь будем разбирать само API биржи.
Push API
На этом этапе люди начинают думать, что такое Push API, начинают гуглить готовые библиотеки, офигевают от сложности и бросают это дело. Так вот - Push API вам не нужно.
Push API нужно тем, кто встраивает в свои сайты онлайн-графики, курсы и все такое через веб-сокеты - Полоникс предоставляет три метода:
Ticker - для получения текущих курсов
Order Book and Trades - книга открытых ордеров и совершенных сделок
Trollbox Messages - чат, которого уже нет.
В общем, эту информацию при желании можно прикрутить к боту, но эта же информация доступна и более простыми способами, так что не будем заострять на ней внимание.
Public API Methods
Методы, собранные в этом разделе, доступны без авторизации, для доступа к ним достаточно перейти по правильно сформированной ссылке. Данные возвращаются в формате JSON.
returnTicker
Этот метод позволяет получить текущую информацию по всем рынкам биржи: курсы, объем и т.п. Входных параметров нет. Для получения информации используется ссылка https://poloniex.com/public?command=returnTicker.
Давайте для примера получим информацию и выведем в удобном виде. Для этого в ранее созданном файле polo_test.py удалите все и используйте такой код:
from poloniex_api import Poloniex
my_polo = Poloniex(
API_KEY = '',
API_SECRET = ''
)
ticker = my_polo.returnTicker()
for pair in ticker:
print("""
Пара: {pair},
Последняя цена (last): {last},
Лучшая цена продажи (lowestAsk): {lowestAsk},
Лучшая цена покупки (highestBid): {highestBid},
Рост за сутки (percentChange, %): {percentChange},
Объем торгов в базовой валюте (baseVolume): {baseVolume},
Объем торгов в квотируемой валюте (quoteVolume): {quoteVolume},
Заморожена (полониксом, isFrozen, 1-да, 0 - нет): {isFrozen},
Высшая цена за сутки (high24hr): {high24hr},
Низшая цена за сутки (low24hr): {low24hr}
""".format(
pair=pair,
last=ticker[pair]['last'],
lowestAsk=ticker[pair]['lowestAsk'],
highestBid=ticker[pair]['highestBid'],
percentChange=ticker[pair]['percentChange'],
baseVolume=ticker[pair]['baseVolume'],
quoteVolume=ticker[pair]['quoteVolume'],
isFrozen=ticker[pair]['isFrozen'],
high24hr=ticker[pair]['high24hr'],
low24hr=ticker[pair]['low24hr']
))
print('*'*80)
Вы должны получить примерно такую информацию:
return24Volume
Метод позволяет получить объемы по торгам за сутки по всем парам. Для получения информации можно воспользоваться ссылкой https://poloniex.com/public?command=return24hVolume
Структура данных такая:
Это словарь, для каждой пары указан объем торгов, и так же подводится общий.
Например, мы хотим узнать, как торговался за сутки GAZ - видно, что в паре с эфиром оборачиваемость составила 8149 GAZ и 315 ETH, а в паре с BTC - 109 BTC и 47888 GAS.
Так же видно, что за сутки на бирже прокрутили 74995 BTC.
Что бы получить данные программно, замените код на
from poloniex_api import Poloniex
my_polo = Poloniex(
API_KEY = '',
API_SECRET = ''
)
vol = my_polo.return24hVolume()
print(vol)
print('Всего BTC', vol['totalBTC'])
returnOrderBook
Возвращает книгу открытых ордеров. Для вызова метода необходимо указать пару, так же можно указать кол-во возвращаемых ордеров.
Параметр currencyPair - либо название пары (например BTC_AMP), либо слово all - вернуть все пары.
Параметр depth - кол-во возвращаемых записей, число, указывать необязательно.
Ссылка:
для всех пар
https://poloniex.com/public?command=returnOrderBook¤cyPair=all
Структура полученного документа будет такой:
{
"asks": [
["курс", объем], ["курс", объем], ["курс", объем]
],
"bids":[
["курс", объем], ["курс", объем], ["курс", объем]
],
"isFrozen":"0",
"seq":46742770
}
Соответственно, в asks выложены цены тех, кто желает продать, в bids - тех, кто желает купить, отсортированы от лучшей цены в сторону ухудшения.
Для нужной пары
https://poloniex.com/public?command=returnOrderBook¤cyPair=BTC_AMP
Структура документа в целом остается, но для каждой пары добавляется ключ,
{
"BTC_AMP":
{
"asks": [
["курс", объем], ["курс", объем], ["курс", объем]
],
"bids":[
["курс", объем], ["курс", объем], ["курс", объем]
],
"isFrozen":"0",
"seq":46742770
}, "BTC_ARDR": {....
Для получения данных программно, замените код вот так:
from poloniex_api import Poloniex
my_polo = Poloniex(
API_KEY = '',
API_SECRET = ''
)
order_book = my_polo.returnOrderBook(currencyPair="BTC_AMP")
print(order_book)
print("Лучшая цена покупки", order_book['bids'][0][0])
print("Лучшая цена продажи", order_book['asks'][0][0])
returnTradeHistory
Возвращает историю торгов (разных участников) по выбранной паре- либо 200 последних сделок, либо до 50 000, если указать дату начала и окончания интересующего периода.
Параметры:
обязательный:
currencyPair - нужная пара
Необязательные:
start - время начала в формате UNIX
end - время окончания в формате UNIX
Ссылка для получения данных:
Возвращает массив сделок, отсортированный по времени исполнения по убывающей. Каждая сделка имеет формат
{
"globalTradeID":2036467,
"tradeID":21387,
"date":"2014-09-12 5:21:26",
"type":"buy",
"rate":"0.00008943",
"amount":"1.27241180",
"total":"0.00011379"
}
globalTradeID, tradeID - ID сделки внутри Полоникса
date - время исполнения
type - либо buy, либо sell
rate - курс
amount - количество квотируемой валюты
total - количество базовой валюты
Для получения программно, используйте код:
from poloniex_api import Poloniex
my_polo = Poloniex(
API_KEY = '',
API_SECRET = ''
)
# Получаем последние сделки
latest_trades = my_polo.returnTradeHistory(currencyPair="BTC_ETH")
print('Последние сделки', latest_trades)
#Получаем сделки за последние 30 минут
import time
end_time = int(time.time()) # время окончания - текущее
start_time = int(end_time - 60 * 30) # время начала - текущее минус 30 минут
latest_trades = my_polo.returnTradeHistory(currencyPair="BTC_ETH", start=start_time, end=end_time)
print('Получено', len(latest_trades), 'записей за период')
returnChartData
Метод позволяет получить данные японских свечей за указанный период.
Обязательные параметры
currencyPair - нужная пара
start - время начала в формате UNIX
end - время окончания в формате UNIX
period - период свечи в секундах. Допустимые значения 300, 900, 1800, 7200, 14400, and 86400 - от 5 минут до суток
Ссылка для получения данных - https://poloniex.com/public?command=returnChartData¤cyPair=BTC_XMR&start=1405699200&end=9999999999&period=14400
Возвращается массив словарей, где каждый словарь, это свеча, отсортировано по убыванию
[{"date":1405699200,"high":0.0045388,"low":0.00403001,"open":0.00404545,"close":0.00435873,"volume":44.34555992,"quoteVolume":10311.88079097,"weightedAverage":0.00430043},{"date":1405713600,"high":0.00435,"low":0.00412,"open":0.00428012,"close":0.00412,"volume":19.12271662,"quoteVolume":4531.85801066,"weightedAverage":0.00421961}, ....]
Где
date - дата начала свечи в формате UNIX
high - наивысшая цена в свече
low - низшая цена
open - цена открытия
close - цена закрытия
volume - объем базовой валюты свечи
quoteVolume - объем квотируемой валюты
weightedAverage - средневзвешенная цена
Для программного получения используйте код:
from poloniex_api import Poloniex
my_polo = Poloniex(
API_KEY = '',
API_SECRET = ''
)
#Получаем пятиминутные свечи за последние 30 минут
import time
end_time = int(time.time()) # время окончания - текущее
start_time = int(end_time - 60 * 30) # время начала - текущее минус 30 минут
candles = my_polo.returnChartData(currencyPair="BTC_ETH", start=start_time, end=end_time, period=300)
print(candles, 'Итого свечей', len(candles))
returnCurrencies
Общая информация по используемым на бирже валютам. Параметров не принимает.
Ссылка https://poloniex.com/public?command=returnCurrencies
Возвращает словарь словарей по каждой валюте
{"1CR":{"id":1,"name":"1CRedit","txFee":"0.01000000","minConf":3,"depositAddress":null,"disabled":0,"delisted":1,"frozen":0},"ABY":{"id":2,"name":"ArtByte","txFee":"0.01000000","minConf":8,"depositAddress":null,"disabled":0,"delisted":1,"frozen":0}, .... },
где, как мне кажется, нет никакой актуальной информации.. По крайней мере мне не удалось ни разу оттуда вытащить что-либо полезное, если что пишите в комментах, добавлю.
Для получения программно используйте метод returnCurrencies, например print(my_polo.returnCurrencies())
returnLoanOrders
Метод позволяет получить информацию о займах (спросе и предложении) - по каким ставкам какую сумму люди готовы взять или отдать (подробнее тут).
Принимает параметр
currency - Например, BTC
Ссылка https://poloniex.com/public?command=returnLoanOrders¤cy=BTC
Возвращает словарь, в котором два массива - offers и demands. Offers - это предложения, demands это спрос.
Каждая строка имеет формат {"rate":"0.00008000","amount":"0.14243033","rangeMin":2,"rangeMax":2}, где rate это курс, amount - кол-во монет, rangeMin-rangeMax - период, на который готовы дать/взять.