Работа с Yobit API как с публичным так и с торговым из Python 3
Здорова пацаны! Если пойти и загуглить готовую функцию, как там работать с торговым API Yobit из python 3 то особо и не нагуглиш ничего, да возможно это я не нашел сразу рабочий код. Что бы так, взял код, запустил, и все! Запрос на Trade API Yobit отправился и вернулся ответ в JSON формате. Есть готовый Бот на питоне для Yobit, но там используется **kwargs а мне нужно было как-то без этого обойтись.
Короче пришлось все с нуля мутить. В итоге я получил то, что мне и нужно было. Это лёгкий вызов функции для Trade API и ещё проще для Public API. Сейчас объясню вкратце что это за API такие.
Public API — Это нужно, только для сбора некоторой информации и все. Торговать, выставлять, отменять ордера не получится. Биржа даёт ссылку, вызываете её с методом, например «ticker» и нужной парой монет и получаете информацию за последние 24 часа о это паре. Пример такой ссылки «yobitex.net/api/3/ticker/ltc_btc»
Trade API — Тут уже все не так просто. Но с этим API можно замутить полноценного торгового Бота, который сможет, покупать, продавать, выставлять, отменять ордера, короче можно все! Но тут не получится просто отправить запрос по какой либо ссылке и все, ордер выставился или что-то подобное произошло на бирже.
Не получится, так как имеется необходимость в «Аутентификации» и подписи секретным ключом с помощью HMAC-SHA512. Именно по этому поводу я гуглил, гуглил и нихрена готового не нагуглил.
Функция для работы с Yobit API из Python 3
Но тебе повезло больше чем мне, сейчас я дам тебе все готовое и рабочие без допиливания и прочих танцев. Хотел по частям выложить и разъяснить что кого тут вообще, но решил кинуть все код сразу, а поясню ниже..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
from time import time import urllib.parse import hashlib import hmac import requests import json APIkey = b'AAAAAAAAA' API_SECRET = b'e777' COINS1 = 'ltc' COINS2 = 'rur' COINS = COINS1 + '_' + COINS2 def GET_JSON(J): return(json.dumps(J, sort_keys=True, indent=4)) def API_YOBIT_PUBLIC(method, coin = False): if coin: result = requests.get('http://yobitex.net/api/3/' + method + '/' + coin) res_result = json.loads(result.content) return(res_result) else: result = requests.get('http://yobitex.net/api/3/' + method) res_result = json.loads(result.content) return(res_result) def API_YOBIT_TRADE(method, method_up = ''): nonce_file = "nonce" with open(nonce_file, 'r+') as inp: nonce = int(inp.read()) inp.seek(0) inp.write(str(nonce+1)) inp.truncate() NonceNum = {'nonce': nonce} payload = { 'method': method, 'nonce': NonceNum['nonce'] } if method_up: payload.update(method_up) paybytes = urllib.parse.urlencode(payload).encode('utf8') sign = hmac.new(API_SECRET, paybytes, hashlib.sha512).hexdigest() headers = {"Content-type": "application/x-www-form-urlencoded", "Key":APIkey, "Sign":sign } obj = requests.post('http://yobitex.net/tapi/', headers=headers, data=paybytes) if obj.status_code == 200: obj = obj.json() if method == 'ActiveOrders' or 'TradeHistory': try: key_id = {} for key, vel in obj['return'].items(): key_id.update({key:vel}) return(key_id) except: return (False) else: return (obj) else: return('Error code: ' + str(obj.status_code)) |
В общем функция «API_YOBIT_PUBLIC» это для работы, как не странно с «Public API» Ты её можешь переписать, как тебе угодно, я оставил так как она есть сейчас, мне так удобнее…
Ну и функция «API_YOBIT_TRADE» нужна для использования «Trade API» и сейчас я покажу как её правильно вызвать.
Допустим нужно получить информацию о активных ордерах, которые в данный момент весят на покупку или продажу. Для этого, исходя из документации биржи, нужно вызвать метод «ActiveOrders» с параметром «pair» которому нужно передать нужную пару монет, например «ltc_rur«. Сделать это можно очень просто.
Соберём информацию.
1 2 3 |
Trade_API = { 'pair':COINS } |
И вызовем функцию. (Помним что в «COINS» лежит пара монет)
1 2 |
Result_Trade = API_YOBIT_TRADE('ActiveOrders', Trade_API) print(GET_JSON(Result_Trade)) |
Если есть активные ордера, то биржа вернёт информацию о них в Json формате. Если активных ордеров нет, то функция вернёт «False«.
Ещё пример. Посмотрим историю сделок и выведем только 3 сделки из всей истории. Так же собираем информацию.
1 2 3 4 |
Trade_API = { 'pair':COINS, 'count' : 3 } |
И точно так же вызываем функцию, только уже с методом «TradeHistory»
1 2 |
Result_Trade = API_YOBIT_TRADE('TradeHistory', Trade_API) print(GET_JSON(Result_Trade)) |
Получаем ответ и информацию о сделках в JSON формате. С которой можно продолжить работать, как тебе нужно и как хочется.
Заключение:
Как видишь, все очень просто и легко, теперь можно использовать эту функцию для работы с API Yobit и строить свою логику торговли или зачем тебе это.