Работа с API Poloniex. Часть первая - публичные данные

Андрей К…
Последнее изменение:
4
0
0

Давайте разберем 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

Ссылка для получения данных:

https://poloniex.com/public?command=returnTradeHistory¤cyPair=BTC_NXT&start=1410158341&end=1410499372

Возвращает массив сделок, отсортированный по времени исполнения по убывающей. Каждая сделка имеет формат

{
    "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 - период, на который готовы дать/взять.

Комментарии: (4)
04.02.2018 11:01
Спасибо за статью. Пожалуйста, скажите, как удалось обойти рекапчу?
04.02.2018 11:11
Пробую использовать класс, но выдает ошибку. Почти уверен, что дело в рекапче, но пока не разобрался как её обойти в питоне. 
https://gist.github.com/megasent1/ab8c296756c2cb17847da6b84cc46035
04.02.2018 11:42
заходи на полоникс через европейские прокси и капчи не будет, я так обходил
04.02.2018 12:47
Помогло, спасибо.
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий