Перейти к публикации
Форум ботоводов

Рекомендованные сообщения

Добрый день. Есть бот для Yobit -  "https://bablofil.ru/bot-dlya-birgi-yobit/" Который торгует заданной фиксированной суммой. Мне бы хотелось его переделать его так, чтобы он торговал на процент с баланса, и не уходил в минус. Как это сделать?

Ссылка на сообщение
Поделиться на других сайтах

Добрый день,

Тут задача сводится к тому, что бы бот запоминал кол-во денег, которое потратил при создании buy, и оперировал им при выставлении sell. 

По-хорошему, нужно завести базу данных, куда всё это скидывать, или хотя бы писать в файл - так бот сможет продолжить работу, если его остановить.

Но для этого нужно писать много букв, поэтому вот вариант проще - можно завести глобальные переменные состояния, куда писать всю эту информацию, и обновлять при создании/срабатывании ордеров. Недостаток такого подхода в том, что если бота остановить и потом запустить, то бот не будет помнить о том, что есть открытые ордера и начнет по новой с создания бая. Преимущество - мало кода, и вообще нечего останавливать бота :)

Вот такой получится код:

import os
import sys
import json
import requests
import urllib, http.client
import hmac, hashlib
import time

# Вписываем свои ключи
API_KEY = '' 
API_SECRET = b''

# Тонкая настройка
CURRENCY_1 = 'ltc' 
CURRENCY_2 = 'rur'

ORDER_LIFE_TIME = 3 # через сколько минут отменять неисполненный ордер на покупку CURRENCY_1
STOCK_FEE = 0.002 # Комиссия, которую берет биржа (0.002 = 0.2%)
OFFERS_AMOUNT = 1 # Сколько предложений из стакана берем для расчета средней цены

PROFIT_MARKUP = 0.001 # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
DEBUG = True # True - выводить отладочную информацию, False - писать как можно меньше

CAN_SPEND_PERC = 10 # % от баланса для покупок

# Тут ничего менять не надо
BUY_ORDER_ID = 0
BUY_SPENT = 0
BUY_AMOUNT = 0
SELL_ORDER_ID= 0


CURR_PAIR = CURRENCY_1.lower() + "_" + CURRENCY_2.lower()
"""
    Каждый новый запрос к серверу должен содержать увеличенное число в диапазоне 1-2147483646
    Поэтому храним число в файле поблизости, каждый раз обновляя его
"""
nonce_file = "./nonce"
if not os.path.exists(nonce_file):
    with open(nonce_file, "w") as out:
        out.write('1')

# Будем перехватывать все сообщения об ошибках с биржи
class ScriptError(Exception):
    pass
class ScriptQuitCondition(Exception):
    pass
        
def call_api(**kwargs):

    # При каждом обращении к торговому API увеличиваем счетчик nonce на единицу
    with open(nonce_file, 'r+') as inp:
        nonce = int(inp.read())
        inp.seek(0)
        inp.write(str(nonce+1))
        inp.truncate()

    payload = {'nonce': nonce}

    if kwargs:
        payload.update(kwargs)
    payload =  urllib.parse.urlencode(payload)

    H = hmac.new(key=API_SECRET, digestmod=hashlib.sha512)
    H.update(payload.encode('utf-8'))
    sign = H.hexdigest()
    
    headers = {"Content-type": "application/x-www-form-urlencoded",
           "Key":API_KEY,
           "Sign":sign}
    conn = http.client.HTTPSConnection("yobit.io", timeout=60)
    conn.request("POST", "/tapi/", payload, headers)
    response = conn.getresponse().read()
    
    conn.close()

    try:
        obj = json.loads(response.decode('utf-8'))

        if 'error' in obj and obj['error']:
            raise ScriptError(obj['error'])
        return obj
    except json.decoder.JSONDecodeError:
        raise ScriptError('Ошибка анализа возвращаемых данных, получена строка', response)


def wanna_get():
    global BUY_SPENT, BUY_AMOUNT
    return  (BUY_SPENT*(1+STOCK_FEE) + BUY_SPENT * PROFIT_MARKUP) / (1 - STOCK_FEE)  # сколько хотим получить за наше кол-во

# Реализация алгоритма
def main_flow():
    global BUY_ORDER_ID, SELL_ORDER_ID, BUY_SPENT, BUY_AMOUNT
    try:
        if not BUY_ORDER_ID and not SELL_ORDER_ID:
            # Открытых ордеров нет, нужно узнать баланс и посчитать от него процент
            print("Открытых ордеров нет, начинаем новый цикл")
            balances = call_api(method="getInfo")['return']['funds']
            curr_2_balance = float(balances.get(CURRENCY_2, 0))
            BUY_SPENT = curr_2_balance*(CAN_SPEND_PERC/100)
            print(
                """Баланс основной валюты {b:0.8f}, % для торгов {p:0.2f}, итого на создание ордера будет потрачено {s:0.8f}""".format(
                    b=curr_2_balance, p=CAN_SPEND_PERC, s=BUY_SPENT
                )
            )
            time.sleep(1)

            # Получаем информацию по предложениям из стакана
            offers = json.loads(requests.get("https://yobit.io/api/3/depth/"+CURR_PAIR+"?limit="+str(OFFERS_AMOUNT)).text)[CURR_PAIR]
            prices = [bid[0] for bid in offers['bids']]                    
            try:        
                avg_price = sum(prices)/len(prices)
                """
                    Посчитать, сколько валюты CURRENCY_1 можно купить.
                    На сумму CAN_SPEND за минусом STOCK_FEE, и с учетом PROFIT_MARKUP
                    ( = ниже средней цены рынка, с учетом комиссии и желаемого профита)
                """
                # Купить как есть, потом продать с учетом комиссии
                my_need_price = avg_price# - avg_price * (STOCK_FEE+PROFIT_MARKUP) 
                BUY_AMOUNT = BUY_SPENT/my_need_price
                
                print('buy: кол-во {amount:0.8f}, курс: {rate:0.8f}'.format(amount=BUY_AMOUNT, rate=my_need_price))
                
                # Допускается ли покупка такого кол-ва валюты (т.е. не нарушается минимальная сумма сделки)
                new_order = call_api(method="Trade", pair=CURR_PAIR, type="buy", rate="{rate:0.8f}".format(rate=my_need_price), amount="{amount:0.8f}".format(amount=BUY_AMOUNT))['return']
                BUY_ORDER_ID = new_order['order_id']
                           
                print(new_order)
                
                if DEBUG:
                    print('Создан ордер на покупку', new_order['order_id'])
                time.sleep(1)
                    
                
            except ZeroDivisionError:
                print('Не удается вычислить среднюю цену', prices)
        elif BUY_ORDER_ID:
            print(
                """Существует (вероятно) открытый BUY, проверяем его состояние"""
            )
            order_status = int(call_api(method="OrderInfo", order_id=BUY_ORDER_ID)['return'][str(BUY_ORDER_ID)]['status'])
            if order_status == 0:
                print("Ордер еще не исполнен")
            elif order_status == 1:
                print("Ордер на покупку исполнен, пора создавать SELL")
                print('sell', BUY_AMOUNT, wanna_get(), (wanna_get()/BUY_AMOUNT))
                new_order = call_api(method="Trade", pair=CURR_PAIR, type="sell", rate="{rate:0.8f}".format(rate=wanna_get()/BUY_AMOUNT), amount="{amount:0.8f}".format(amount=BUY_AMOUNT))['return']
                SELL_ORDER_ID = new_order['order_id']
                print(new_order)
                if DEBUG:
                    print('Создан ордер на продажу', CURRENCY_1, new_order['order_id'])
                BUY_ORDER_ID=0
                    
            elif order_status in (2,3):
                print("Ордер отменен, сброс состояния")
                BUY_ORDER_ID=0
            time.sleep(1)
        elif SELL_ORDER_ID:
            order_status = int(call_api(method="OrderInfo", order_id=SELL_ORDER_ID)['return'][str(SELL_ORDER_ID)]['status'])
            if order_status == 0:
                print("Ордер еще не исполнен")
            elif order_status == 1:
                print("Ордер на продажу исполнен")
                BUY_ORDER_ID=0
                SELL_ORDER_ID=0
            else:
                print("Ордер на продажу отменен")
                # Ордер на продажу был отменен человеком, значит на балансе остались монеты
                # Если нужно, что бы бот забил и начал заново покупать и продавать, раскомментируйте две строки ниже
                #BUY_ORDER_ID=0
                #SELL_ORDER_ID=0
                # Иначе, бот будет писать о том, что ордер отменен и больше ничего не делать
            
    except ScriptError as e:
        print(e)
    except ScriptQuitCondition as e:
        print(e)
    except IndexError as e:
        print("!!!!",e)

       
while(True):
    main_flow()
    time.sleep(1)

Файл прикладываю к посту. Впишите свои АПИ ключи и торгуйте. Я протестировал - он создал бай на указанный % от баланса, отследил его, после чего создал селл. Дальше он начал отслеживать селл, но с таким графиком это задача надолго, в теории после срабатывания селла он должен с нуля начать цикл купли/продажи, взяв % уже от нового баланса.

В целом, это более удачный бот, чем в статье, т.к. избавлен от болезни с неправильным расчетом цены и продажи лишних альтов на балансе, но конечно, лучше погонять, посмотреть.

yobit_perc.py

Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте всем, в коде выше всё ок, только вот отсутствует "ORDER_LIFE_TIME", т.е. цена покупки взлетела вверх, а бот будет долго висеть, пытаясь купить по низкой цене.

Кто подскажет, как допилить код, чтоб отмена покупки происходила и бот по текущей цене закупался?

Ссылка на сообщение
Поделиться на других сайтах

Точно, вот с отменой

Сам не проверял, но должно быть ок )

import os
import sys
import json
import requests
import urllib, http.client
import hmac, hashlib
import time

# Вписываем свои ключи
API_KEY = '' 
API_SECRET = b''

# Тонкая настройка
CURRENCY_1 = 'ltc' 
CURRENCY_2 = 'rur'

ORDER_LIFE_TIME = 3 # через сколько минут отменять неисполненный ордер на покупку CURRENCY_1
STOCK_FEE = 0.002 # Комиссия, которую берет биржа (0.002 = 0.2%)
OFFERS_AMOUNT = 1 # Сколько предложений из стакана берем для расчета средней цены

PROFIT_MARKUP = 0.001 # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
DEBUG = True # True - выводить отладочную информацию, False - писать как можно меньше

CAN_SPEND_PERC = 10 # % от баланса для покупок

# Тут ничего менять не надо
BUY_ORDER_ID = 0
BUY_SPENT = 0
BUY_AMOUNT = 0
SELL_ORDER_ID= 0


CURR_PAIR = CURRENCY_1.lower() + "_" + CURRENCY_2.lower()
"""
    Каждый новый запрос к серверу должен содержать увеличенное число в диапазоне 1-2147483646
    Поэтому храним число в файле поблизости, каждый раз обновляя его
"""
nonce_file = "./nonce"
if not os.path.exists(nonce_file):
    with open(nonce_file, "w") as out:
        out.write('1')

# Будем перехватывать все сообщения об ошибках с биржи
class ScriptError(Exception):
    pass
class ScriptQuitCondition(Exception):
    pass
        
def call_api(**kwargs):

    # При каждом обращении к торговому API увеличиваем счетчик nonce на единицу
    with open(nonce_file, 'r+') as inp:
        nonce = int(inp.read())
        inp.seek(0)
        inp.write(str(nonce+1))
        inp.truncate()

    payload = {'nonce': nonce}

    if kwargs:
        payload.update(kwargs)
    payload =  urllib.parse.urlencode(payload)

    H = hmac.new(key=API_SECRET, digestmod=hashlib.sha512)
    H.update(payload.encode('utf-8'))
    sign = H.hexdigest()
    
    headers = {"Content-type": "application/x-www-form-urlencoded",
           "Key":API_KEY,
           "Sign":sign}
    conn = http.client.HTTPSConnection("yobit.io", timeout=60)
    conn.request("POST", "/tapi/", payload, headers)
    response = conn.getresponse().read()
    
    conn.close()

    try:
        obj = json.loads(response.decode('utf-8'))

        if 'error' in obj and obj['error']:
            raise ScriptError(obj['error'])
        return obj
    except json.decoder.JSONDecodeError:
        raise ScriptError('Ошибка анализа возвращаемых данных, получена строка', response)


def wanna_get():
    global BUY_SPENT, BUY_AMOUNT
    return  (BUY_SPENT*(1+STOCK_FEE) + BUY_SPENT * PROFIT_MARKUP) / (1 - STOCK_FEE)  # сколько хотим получить за наше кол-во

# Реализация алгоритма
def main_flow():
    global BUY_ORDER_ID, SELL_ORDER_ID, BUY_SPENT, BUY_AMOUNT
    try:
        if not BUY_ORDER_ID and not SELL_ORDER_ID:
            # Открытых ордеров нет, нужно узнать баланс и посчитать от него процент
            print("Открытых ордеров нет, начинаем новый цикл")
            balances = call_api(method="getInfo")['return']['funds']
            curr_2_balance = float(balances.get(CURRENCY_2, 0))
            BUY_SPENT = curr_2_balance*(CAN_SPEND_PERC/100)
            print(
                """Баланс основной валюты {b:0.8f}, % для торгов {p:0.2f}, итого на создание ордера будет потрачено {s:0.8f}""".format(
                    b=curr_2_balance, p=CAN_SPEND_PERC, s=BUY_SPENT
                )
            )
            time.sleep(1)

            # Получаем информацию по предложениям из стакана
            offers = json.loads(requests.get("https://yobit.io/api/3/depth/"+CURR_PAIR+"?limit="+str(OFFERS_AMOUNT)).text)[CURR_PAIR]
            prices = [bid[0] for bid in offers['bids']]                    
            try:        
                avg_price = sum(prices)/len(prices)
                """
                    Посчитать, сколько валюты CURRENCY_1 можно купить.
                    На сумму CAN_SPEND за минусом STOCK_FEE, и с учетом PROFIT_MARKUP
                    ( = ниже средней цены рынка, с учетом комиссии и желаемого профита)
                """
                # Купить как есть, потом продать с учетом комиссии
                my_need_price = avg_price# - avg_price * (STOCK_FEE+PROFIT_MARKUP) 
                BUY_AMOUNT = BUY_SPENT/my_need_price
                
                print('buy: кол-во {amount:0.8f}, курс: {rate:0.8f}'.format(amount=BUY_AMOUNT, rate=my_need_price))
                
                # Допускается ли покупка такого кол-ва валюты (т.е. не нарушается минимальная сумма сделки)
                new_order = call_api(method="Trade", pair=CURR_PAIR, type="buy", rate="{rate:0.8f}".format(rate=my_need_price), amount="{amount:0.8f}".format(amount=BUY_AMOUNT))['return']
                BUY_ORDER_ID = new_order['order_id']
                           
                print(new_order)
                
                if DEBUG:
                    print('Создан ордер на покупку', new_order['order_id'])
                time.sleep(1)
                    
                
            except ZeroDivisionError:
                print('Не удается вычислить среднюю цену', prices)
        elif BUY_ORDER_ID:
            print(
                """Существует (вероятно) открытый BUY, проверяем его состояние"""
            )
            order_info = call_api(method="OrderInfo", order_id=BUY_ORDER_ID)['return'][str(BUY_ORDER_ID)]
            if int(order_info['status']) == 0:
                print("Ордер еще не исполнен")
 
                time_passed = time.time()  - int(order_info['timestamp_created'])

                if time_passed > ORDER_LIFE_TIME * 60:
                    print("Ордер уже давно висит, никому не нужен, отменяем")
                    call_api(method="CancelOrder", order_id=BUY_ORDER_ID) 
                    BUY_ORDER_ID=0
                else:
                    print("Ордер отменять рано, прошло мало времени")
                    
            elif int(order_info['status']) == 1:
                print("Ордер на покупку исполнен, пора создавать SELL")
                print('sell', BUY_AMOUNT, wanna_get(), (wanna_get()/BUY_AMOUNT))
                new_order = call_api(method="Trade", pair=CURR_PAIR, type="sell", rate="{rate:0.8f}".format(rate=wanna_get()/BUY_AMOUNT), amount="{amount:0.8f}".format(amount=BUY_AMOUNT))['return']
                SELL_ORDER_ID = new_order['order_id']
                print(new_order)
                if DEBUG:
                    print('Создан ордер на продажу', CURRENCY_1, new_order['order_id'])
                BUY_ORDER_ID=0
                    
            elif int(order_info['status']) in (2,3):
                print("Ордер отменен, сброс состояния")
                BUY_ORDER_ID=0
            time.sleep(1)
        elif SELL_ORDER_ID:
            order_status = int(call_api(method="OrderInfo", order_id=SELL_ORDER_ID)['return'][str(SELL_ORDER_ID)]['status'])
            if order_status == 0:
                print("Ордер еще не исполнен")
            elif order_status == 1:
                print("Ордер на продажу исполнен")
                BUY_ORDER_ID=0
                SELL_ORDER_ID=0
            else:
                print("Ордер на продажу отменен")
                # Ордер на продажу был отменен человеком, значит на балансе остались монеты
                # Если нужно, что бы бот забил и начал заново покупать и продавать, раскомментируйте две строки ниже
                #BUY_ORDER_ID=0
                #SELL_ORDER_ID=0
                # Иначе, бот будет писать о том, что ордер отменен и больше ничего не делать
            
    except ScriptError as e:
        print(e)
    except ScriptQuitCondition as e:
        print(e)
    except IndexError as e:
        print("!!!!",e)

       
while(True):
    main_flow()
    time.sleep(1)

 

 

 

Ссылка на сообщение
Поделиться на других сайтах

интересно другое, после запуска бота не прошло и 10 минут 
 

Error 1015 Ray ID: 47fa450d99d08eeb • 2018-11-26 06:24:02 UTC

You are being rate limited

 

What happened?

The owner of this website (yobit.io) has banned you temporarily from accessing this website.

Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, tiounaev сказал:

интересно другое, после запуска бота не прошло и 10 минут 
 

Error 1015 Ray ID: 47fa450d99d08eeb • 2018-11-26 06:24:02 UTC

You are being rate limited

 

What happened?

The owner of this website (yobit.io) has banned you temporarily from accessing this website.

Ну, это вы наверное двух ботов запустили или вроде того?

Йобит как только видит несколько запросов в секунду с одного IP, блокирует доступ на несколько минут

Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, admin сказал:

Ну, это вы наверное двух ботов запустили или вроде того?

Йобит как только видит несколько запросов в секунду с одного IP, блокирует доступ на несколько минут

больше 3х))), я уже понял что к чему, отличный робот!!!
Спасибо автору за интересную работу, а можно использовать средние MA в данных роботах?

Ссылка на сообщение
Поделиться на других сайтах
  • 6 months later...

Открытых ордеров нет, начинаем новый цикл
Traceback (most recent call last):
  File "C:\Users\user\Downloads\майнинг\bot\yobit\yobit_bot.py", line 193, in <module>
    main_flow()
  File "C:\Users\user\Downloads\майнинг\bot\yobit\yobit_bot.py", line 98, in main_flow
    balances = call_api(method="getInfo")['return']['funds']
  File "C:\Users\user\Downloads\майнинг\bot\yobit\yobit_bot.py", line 72, in call_api
    conn.request("POST", "/tapi/", payload, headers)
  File "C:\Python\Python37\lib\http\client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Python\Python37\lib\http\client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Python\Python37\lib\http\client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Python\Python37\lib\http\client.py", line 1016, in _send_output
    self.send(msg)
  File "C:\Python\Python37\lib\http\client.py", line 956, in send
    self.connect()
  File "C:\Python\Python37\lib\http\client.py", line 1392, in connect
    server_hostname=server_hostname)
  File "C:\Python\Python37\lib\ssl.py", line 412, in wrap_socket
    session=session
  File "C:\Python\Python37\lib\ssl.py", line 853, in _create
    self.do_handshake()
  File "C:\Python\Python37\lib\ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ConnectionResetError: [WinError 10054] Удаленный хост принудительно разорвал существующее подключение
>>>  

подскажите куда копать ?:)

Ссылка на сообщение
Поделиться на других сайтах

в сторону интернета )) Ответа от биржи походу нет.

Ключи api прописаны?

Модули питона все установлены (pip install .......)?

если включали уже до этого, увеличьте число nonce ))

Изменено пользователем Andrei22
Ссылка на сообщение
Поделиться на других сайтах
  • 2 months later...
  • 8 months later...

Судя по датам на форуме, проект заброшен что ли? В общем, хотел в бот прикрутить звук, но не чего не вышло. Ошибка синтаксиса. Что не правильно? И еще хотел спросить. Бот работает на удаленном компе. По тем или иным причинам, его иногда выключают местные "Чубайсы". В общем, после подачи питания компьютер включается, но бот самостоятельно не запускается. Файл yobit_perc.py добавлен в автозагрузку, но нужна комманда на авто запуск, а  написать её не получается. Вернее, просто не знаю. За ранее спасибо.

 

 

import os
import sys
import json
import requests
import urllib, http.client
import hmac, hashlib
import time
import winsound

1881788216_-2.jpg.693bb6275e8cf465505ed365993279f1.jpg

Ошибка синтаксиса.jpg

Изменено пользователем ua4xdi
Ссылка на сообщение
Поделиться на других сайтах

создай бат файл там же где лежит бот, например start.bat внутрь:

@ECHO OFF

TIMEOUT /T 30
MODE 120,20
title Yobit bot )))
setlocal
set PYTHONPATH=./
python ./yobit_perc.py
endlocal
pause

далее, ПКМ создать ярлык (ярлык это ссылка на этот бат файл)

далее ПКМ на Пуск -> выполнить -> пишешь shell:startup (откроется папка автозагрузки)

далее ПКМ на ярлык - > копировать -> вставить в папку автозагрузки

звук проверь что диск с ))) и есть ли этот wave там:

import winsound
soundfile = "c:/Windows/Media/chimes.wav"
winsound.PlaySound(soundfile, winsound.SND_FILENAME | winsound.SND_ASYNC)

Изменено пользователем Andrei22
Ссылка на сообщение
Поделиться на других сайтах
08.05.2020 в 07:24, Andrei22 сказал:

звук проверь что диск с ))) и есть ли этот wave там:

import winsound
soundfile = "c:/Windows/Media/chimes.wav"
winsound.PlaySound(soundfile, winsound.SND_FILENAME | winsound.SND_ASYNC)

Спасибо Андрей. Автозапуск работает, а вот со звуком проблема.

import os
import sys
import json
import requests
import urllib, http.client
import hmac, hashlib
import time                                                                                                                                                                                                                                                                                                                 import winsound

Я первоначально прописывал как у вас в примере.

soundfile = "c:/Windows/Media/chimes.wav"
winsound.PlaySound(soundfile, winsound.SND_FILENAME | winsound.SND_ASYNC)

Но бот при старте не работал и выдавал синтаксическую ошибку. Я потом создал свою папку и положил туда wav файл. Путь вы уже видели на скрине. Но синтаксическая ошибка повторяется. Подозреваю, что код не верно прописан. Иными словами, не на том месте. Не просто же так интерпретатор обнаруживает синтаксическую проблему в коде. Хотелось бы заполучить живой пример кода звукового оповещения при создании допустим ордера на продажу. Еще раз спасибо что откликнулись.

P.S. import winsound

я просто добавил в коде строку (прописал). Может это не верно? 

 

 

Изменено пользователем ua4xdi
Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, patslk сказал:

Отступы похоже неправильно стоят в коде

Я в общем-то, тоже так подумал. Надо почитать help Python.

Рекомендуется использовать 4 пробела на каждый уровень отступа. Python 3 запрещает смешивание табуляции и пробелов в отступах. Код, в котором используются и те, и другие типы отступов, должен быть исправлен так, чтобы отступы в нем были расставлены только с помощью пробелов.

Изменено пользователем ua4xdi
Ссылка на сообщение
Поделиться на других сайтах
13.11.2018 в 01:07, admin сказал:

В целом, это более удачный бот, чем в статье, т.к. избавлен от болезни с неправильным расчетом цены и продажи лишних альтов на балансе, но конечно, лучше погонять, посмотреть.

 

Ошибка: ConnectionResetError: [WinError 10054] Удаленный хост принудительно разорвал существующее подключение.

Нужно проверить интернет подключение. Или тормозит, или обрывы.

 

Изменено пользователем ua4xdi
Ссылка на сообщение
Поделиться на других сайтах
  • 8 months later...

Подскажите как переделать для Yobit код, 

# -*- coding: utf-8 -*-
import sys
import http.client
import urllib
import json
import hashlib
import hmac
import time

class ExmoAPI:
    def __init__(self, API_KEY, API_SECRET, API_URL = 'api.exmo.me', API_VERSION = 'v1'):
        self.API_URL = API_URL
        self.API_VERSION = API_VERSION
        self.API_KEY = '     '
        self.API_SECRET = bytes('   ', encoding='utf-8')

    def sha512(self, data):
        H = hmac.new(key = self.API_SECRET, digestmod = hashlib.sha512)
        H.update(data.encode('utf-8'))
        return H.hexdigest()

    def api_query(self, api_method, params = {}):
        params['nonce'] = int(round(time.time() * 1000))
        params =  urllib.parse.urlencode(params)

        sign = self.sha512(params)
        headers = {
            "Content-type": "application/x-www-form-urlencoded",
            "Key": self.API_KEY,
            "Sign": sign
        }
        conn = http.client.HTTPSConnection(self.API_URL)
        conn.request("POST", "/" + self.API_VERSION + "/" + api_method, params, headers)
        response = conn.getresponse().read()

        conn.close()

        obj = json.loads(response)
        return obj

ExmoAPI_instance = ExmoAPI('YOUR API KEY', 'YOUR API SECRET')

запрос так выглядит   a = ExmoAPI_instance.api_query('user_open_orders')['USDT_RUB']

Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...