Выкачиваем информацию с биржи в Excel

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

Давайте что-нибудь проанализируем.. Например, историю торгов? Это и в принципе полезно, и скиллы набьются полезные… В общем план такой – научиться вытаскивать нужные данные с биржи, экспортировать в Excel, ну и что-нибудь с ними делать. Понятно, что не руками :) Поехали!

Подготовка.

Нам потребуется

а) Установленный питон с модулем requests (как установить читайте тут)

б) Установленный модуль openpyxl – но тут всё просто, запустите командную строку и вбейте pip install openpyxl

Проверка

После того, как вы все установили, давайте проверим, создаются ли валидные Excel файлы. Простейший пример (взятый с официального сайта) показывает, как создать новую книгу, внести туда данные и сохранить:

from openpyxl import Workbook
wb = Workbook()

# Выбрать активную книгу
ws = wb.active

# Запишем число 42 в ячейку А1
ws['A1'] = 42

# Добавим строку с данными
ws.append([1, 2, 3])

# В поле А2 запишем текущую дату и время
import datetime
ws['A2'] = datetime.datetime.now()

# Сохраним файл рядом со скриптом
import os

wb.save(os.path.dirname(os.path.abspath(__file__)) + "/sample.xlsx")

Копируем этот код, вставляем в IDLE (опять же, подробности тут), сохраняем под каким-нибудь именем (у меня это excel_test.py) и запускаем (F5). В папке рядом со скриптом должен появиться файл sample.xlsx. 

Можно открыть его экселем и посмотреть, что внутри:


Реклама


История торгов из Exmo в Excel

Ок, работает, писать данные можем. Теперь давайте попробуем забрать с exmo.me всю историю торгов. Точнее не так – всю историю Эксмо не дает, а дает максимум 10 000 последних торгов по паре.

Вот код – вставим в IDLE, сохраним как exmo_excel.py и запустим (о том, что такое API и как работать с ним на Exmo читайте в других статьях цикла – ссылки в конце статьи, над комментариями).

import urllib, http.client
import os
import time
import json
# эти модули нужны для генерации подписи API
import hmac, hashlib

from openpyxl import Workbook
from datetime import datetime, timezone

# ключи API, которые предоставила exmo
API_KEY = 'K-...'
# обратите внимание, что добавлена 'b' перед строкой
API_SECRET = b'S-...'

# базовые настройки
API_URL = 'api.exmo.com'
API_VERSION = 'v1'

# Свой класс исключений
class ScriptError(Exception):
    pass
class ScriptQuitCondition(Exception):
    pass

# все обращения к API проходят через эту функцию
def call_api(**kwargs):
    payload = {'nonce': int(round(time.time()*1000))}

    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(API_URL, timeout=60)
    conn.request("POST", "/"+API_VERSION + "/" + kwargs['method'], 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)

# Получим список всех пар, по которым торгует биржа
pairs_list = []
pairs = call_api(method='pair_settings')
for pair in pairs:
    pairs_list.append(pair) # сложим их в словарь

pairs_str = ','.join(pairs_list) # из словаря создадим строку, с парами, разделенными запятыми

# Получим историю торгов по всем парам
trades = call_api(method='user_trades', pair=pairs_str, limit=10000)
for pair in trades: # пройдемся по каждой паре
    if not trades[pair]: #пропускаем пары, по которым не было торгов
        continue
    # Теперь проходим по всем торгам этой пары
    print(pair, len(trades[pair]))

Должны увидеть список пар, по которым торговали, и кол-во полученных сделок по каждой их них. У меня это выглядит так:

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

Вообще, стоило бы сравнить с историей торгов на сайте Эксмо, но там как будто специально неудобно сделано.. В общем, похоже на правду, на этом и остановимся пока. Если что, историю торгов можно смотреть тут (раздел сделки):

Теперь, собственно, нужно объединить оба скрипта, что бы получить историю торгов и выгрузить в эксель. Немного магии и вуаля:

import urllib, http.client
import os
import time
import json
# эти модули нужны для генерации подписи API
import hmac, hashlib

from openpyxl import Workbook
from datetime import datetime, timezone

# ключи API, которые предоставила exmo
API_KEY = 'K-...'
# обратите внимание, что добавлена 'b' перед строкой
API_SECRET = b'S-...'

# базовые настройки
API_URL = 'api.exmo.com'
API_VERSION = 'v1'

# Свой класс исключений
class ScriptError(Exception):
    pass
class ScriptQuitCondition(Exception):
    pass

# все обращения к API проходят через эту функцию
def call_api(**kwargs):
    payload = {'nonce': int(round(time.time()*1000))}

    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(API_URL, timeout=60)
    conn.request("POST", "/"+API_VERSION + "/" + kwargs['method'], 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)

# Получим список всех пар, по которым торгует биржа
pairs_list = []
pairs = call_api(method='pair_settings')
for pair in pairs:
    pairs_list.append(pair) # сложим их в словарь

pairs_str = ','.join(pairs_list) # из словаря создадим строку, с парами, разделенными запятыми

# Создадим Excel файл
wb = Workbook()
ws = wb.active
# Вставим заголовки
ws.append(["Дата сделки", "Пара сделки", "ID ордера", "ID сделки", "Тип сделки", "Кол-во по сделке", "Цена сделки", "Сумма сделки"])

# Получим историю торгов по всем парам
trades = call_api(method='user_trades', pair=pairs_str, limit=10000)
for pair in trades: # пройдемся по каждой паре
    if not trades[pair]: #пропускаем пары, по которым не было торгов
        continue
    # Теперь проходим по всем торгам этой пары
    for trade in trades[pair]:
        # Мы бы могли использовать метод dict.values(), но нам нужны данные в определенном порядке, причем каждый раз для каждого массива, так что немного усложним код
        # Форматируем и вставляем строку с данными в Excel
        ws.append([
            datetime.fromtimestamp(trade['date'], timezone.utc), # дата сделки
            pair, # Пара сделки
            trade['order_id'], # ID ордера
            trade['trade_id'], # ID сделки
            'Покупка' if trade['type'] == 'buy' else 'Продажа',
            float(trade['quantity']), # Кол-во по сделке
            float(trade['price']), # Цена сделки
            float(trade['amount']) * (-1 if trade['type'] == 'buy' else 0.998), # сумма сделки, если buy то отрицательная - так удобнее считать потом
        ])
    
# Сохраняем файл
wb.save(os.path.dirname(os.path.abspath(__file__)) + "/exmo_excel.xlsx")
print('Работу закончил')

Вставляем этот код в IDLE, сохраняем, запускаем.. У вас должен появиться Excel-файл exmo_excel.xlsx рядом со скриптом. Откроем, посмотрим.

Я поставил фильтр по паре LTC_RUB, что бы еще раз акцентировать внимание на сделках, так в файле все торги по всем парам (точнее, последние 10 000 торгов). В первой колонке время сделки (по времени биржи), в остальных вроде понятно, объясню про ID ордера и ID сделки.

Смотреть стоит по времени, т.е. снизу вверх. 14 августа я на почти 150р купил 0, 618LTC по курсу 242,38. Для этого я создавал отложенный ордер (52466257), который был исполнен в рамках одной сделки (5227092).

После этого я, видимо, выставил отложенный ордер на продажу купленного (52466294), который исполнился опять же одной сделкой.

После этого я создал отложенный ордер на покупку (62752648), который был исполнен частями –обратите внимание, что тут две строки с одним и тем же номером ордера и одной и той же ценой, но разными суммами, временем и id сделки. Т.е. сначала кто-то купил почти всё, а потом кто-то еще докупил, что осталось.

Ну а потом сработала еще одна продажа купленного.

Если сложить все суммы сделки (вот почему покупку мы делали отрицательной), то получим сальдо или как там его – мне больше нравится слово профит, хотя и «прибыль» тоже ничего. В данном случае вроде бы 63 копейки прибыли, но….. Тут, насколько я вижу, хотя надо бы и проверить, сумма указывается ДО вычета комиссии биржи – 0.2%.

Если еще раз обратите внимание, то первую сделку я провел за 150 рублей, купив 0,618LTC, а продаю 0,617LTC – потому что часть купленного в LTC съела комиссия (рубли не псотрадали). Когда же я продаю купленное, комиссия берется с рублей – но тут я не вижу, что бы это отражалось. Поэтому, наверное, более точно было считать так (дополнил столбец руками):

Для положительных сумм сделок мы вычитаем комиссию 0.2% (формула видна на рисунке), отрицательные считаем как есть – так правильно. Итого, профит составил 2,8 копейки, юхууу))

Не помню, что я тестил на этой паре год назад, и какие настройки прибыльности стояли, но в общем имейте в виду такую выдачу инфы, что через API, что на сайте.

Если хотите, можете сразу выводить в эксель прибыль за вычетом комиссии. Для этого строку

float(trade['amount']) * (-1 if trade['type'] == 'buy' else 1),

нужно заменить на

float(trade['amount']) * (-1 if trade['type'] == 'buy' else 0.998),

итог будет правильным:

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


Реклама


История торгов из Yobit в Excel

Ну и как бонус давайте сделаем тоже самое для биржи yobit.net. Тут уже будет меньше комментариев, т.к. по сути ничего не меняется, только немного кода. Более детально о том, как работать с API yobit, читайте так же по ссылкам в конце статьи.

В общем, вот код, вбивайте свои ключи, запускайте.. Он будет работать мучительно долго, т.к. во первых очень много пар, а во вторых, после каждой пары добавлено time.sleep(1), что бы вас Yobit не забанил.. Хотя, он может быть и так не забанит, так что можете удалить эту строку и все пойдет шустрее, но это на свой страх и риск.

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

from openpyxl import Workbook
from datetime import datetime, timezone

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

"""
    Каждый новый запрос к серверу должен содержать увеличенное число в диапазоне 1-2147483646
    Поэтому храним число в файле поблизости, каждый раз обновляя его
"""
nonce_file = "./nonce"
if not os.path.exists(nonce_file):
    with open(nonce_file, "w") as out:
        out.write('1')
# Будем перехватывать все сообщения об ошибках с биржи
class YobitException(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.net", 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 YobitException(obj['error'])
        return obj
    except json.decoder.JSONDecodeError:
        raise YobitException('Ошибка анализа возвращаемых данных, получена строка', response)

res = requests.get('https://yobit.net/api/3/info') # получаем данные info
res_obj = json.loads(res.text) # переводим полученный текст в объект с данными

pairs = [pair for pair in res_obj['pairs']] # создадим массив названий пар

# Создадим Excel файл
wb = Workbook()
ws = wb.active
# Вставим заголовки
ws.append(["Дата сделки", "Пара сделки", "ID ордера", "ID сделки", "Тип сделки", "Цена сделки", "Сумма сделки"])

for pair in pairs:
    try:
        print ('Получаем историю торгов по паре %s' % pair, '*'*30)
        data = call_api(method="TradeHistory", pair=pair)
        if(data.get('return')):
            for t in data['return']:
                trade = data['return'][t]
                ws.append([
                    datetime.fromtimestamp(int(trade['timestamp']), timezone.utc), # дата сделки
                    pair, # Пара сделки
                    trade['order_id'], # ID ордера
                    t, # ID сделки
                    'Покупка' if trade['type'] == 'buy' else 'Продажа',
                    float(trade['rate']), # Цена сделки
                    float(trade['amount']) * (-1 if trade['type'] == 'buy' else 1), # сумма сделки, если buy то отрицательная - так удобнее считать потом
                ])
        else:
            print('Торгов не было')
        #time.sleep(1)
    except YobitException as e:
        print("Облом:", e)
    
wb.save(os.path.dirname(os.path.abspath(__file__)) + "/yobit_excel.xlsx")
print('Работу закончил')

Когда оно всё доработает, рядом с файлом появится файл yobit_excel.xslx, можете открывать и делать выводы. Опять же, если нужно вычитать комиссию, то воспользуйтесь советом выше, для эксмо. Если что-то не будет работать или будет работать не так, пишите, поправим.

Удачи!

 

 

Это статья из цикла "Популярно о бирже"

Комментарии: (40)
18.11.2017 16:04
Андрей, добрый день!
Пробовал использовать ваш код для получения данных по торгам с yobit, но после отработки программы файл есель оказался пуст (кроме шапки таблицы) , а в процессе работы проги постоянной возникала ошибка  - Облом: invalid nonce (has already been used). Что можно поправить?
18.11.2017 17:15
Добрый день!
При каждом запросе к АПИ передается nonce - некоторое число, которое должно увеличиваться с каждым запросом.
В коде я начинаю с единицы - 1,2,3 и т.п. Соответственно, если вы уже использовали API для работы с каким-нибудь ботом, в мобильном приложении и т.п., то они тоже передавали какие-то значения, и явно они выше единицы. Даже если вы запускали этот код, то увеличивали счетчик.
В общем, самое простое решение будет пересоздать API ключи на бирже - для каждых новых ключей отсчет начинается заново.
Так же в процессе работы в папке с кодом создается файлик nonce, в который записывается последнее использованное кодом значение.
Если пересоздавать ключи API неудобно, то можно открыть этот файл блокнотом, записать туда например 1000000, сохранить, что бы постараться опередить уже использованное ранее значение.
18.11.2017 20:37
Андрей, к сожалению танцы с бубном с новыми API ключами и с увеличением цифры в nonce не принесли результата. Все тоже самое - пр работе питона на каждой скачиваемой паре пишет: Облом: invalid nonce (has already been used). Может еще есть варианты?
18.11.2017 21:04
Загадочная история, запустил только что, всё работает, значение в nonce увеличивается с каждой парой

Торгов не было
Получаем историю торгов по паре rad_usd ******************************
Торгов не было
Получаем историю торгов по паре rpc_usd ******************************
Торгов не было
Получаем историю торгов по паре xcre_rur ******************************
Торгов не было
Получаем историю торгов по паре limx_waves ******************************
Торгов не было
Получаем историю торгов по паре hdg_btc ******************************
Торгов не было

Кстати, нашел кое-что в коде, поправил статью, скачайте новый код. Но к nonce оно не относится. Есть еще вариант что у вас два экземпляра запущено, проверьте в диспетчере задач, сколько раз python.exe встречается. Может прав нет у питона писать в этот файл (nonce) в текущей директории? Тогда нужно от админа запустить
19.11.2017 07:02
Доброе утро! Установлен Python36-32, windows 7. При работе программы цифровое значение в файле nonce увеличивается - кроме цифр. значения в нем больше ничего нет. В екселе та же картина. Начало работы программы:
Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
============= RESTART: C:\Users\user\Desktop\1.py =============
Получаем историю торгов по паре ltc_btc ******************************
Облом: invalid nonce (has already been used)
Получаем историю торгов по паре nmc_btc ******************************
Облом: invalid nonce (has already been used)
Прошу помочь.
19.11.2017 10:21
Переустановка на Python 3.6.0 так же не помогла
прописал-
pip install requests
pip install openpyxl

История торгов из Exmo в Excel - тот же результат. excel пустой
25.11.2017 19:48
Добрый вечер! Как то исправилась ситуация (не понял как - по запускал ваши примеры по получении активных ордеров) и вроде заработало. Но программа до конца не дорабатывает - выходит ошибка 
Traceback (most recent call last):
  File "C:\Users\user\Desktop\1.py", line 84, in <module>
    datetime.fromtimestamp(trade['timestamp'], timezone.utc), # дата сделки
TypeError: an integer is required (got type str)
Лечится?</module>
25.11.2017 21:35
Обновил код, попробуйте пожалуйста скачать по новой и запустить
26.11.2017 07:50
Добрый день!
ошибка появилась другая:
Traceback (most recent call last):
  File "C:\Users\user\Desktop\4.py", line 90, in <module>
    float(trade['amount']) * (-1 if trade['s'] == 'buy' else 1), # сумма сделки, если buy то отрицательная - так удобнее считать потом
KeyError: 's'</module>
03.12.2017 12:44
Действительно)
Исправил
02.12.2017 14:09
я так понял чтоб что то сделать с 0 знаний в phyton уйдут месяцы - годы? я элементарно не могу понять как из ticker сделать ексел таблицу.. не говоря уже о проверки цен и выполнения действий в зависимости от необходимых алгоритмов.. я представляю логику действий которую хочу автоматизировать, но у меня 0 знаний в реализации посоветуйте что полистать чтоб хотя бы начало положить.. ваши примеры очень подробные но все же для тех у кого есть какой то базовый набор знаний..

ПС или может как то похожее можно на ексел реализовать? я там примерно логику действий отрабатываю.. но это все в статике.. а потом это надо как то через апи в онлайн..
03.12.2017 12:52
Да ну нет, всё зависит от задачи.
Можно тоже самое сделать в Экселе, макросами.
Тут задача то сводится к тому, что бы 
1. Получить значения - вот тут я подробно описывал с примерами https://bablofil.ru/exmo-api/. Только для другой биржи другие адреса понадобятся
2. Вставить значения в таблицу - в этой статье.

В данной статье согласен, резкий переход от простого к сложному, но все промежуточные шаги описаны в других статьях цикла, ссылки над комментариями.
А так я даже не знаю чего почитать. Если просто абстрактное программирование на питоне, то Лутц ничего https://www.ozon.ru/context/detail/id/5730448/
Можно найти хорошие курсы на coursere https://www.coursera.org/courses?query=python
Именно по работе с биржами - не знаю =) Я ничего такого не читал
28.12.2017 19:40
статья Выкачиваем информацию с биржи в Exce -> б) Установленный модуль openpyxl  но тут всё просто, запустите командную строку и вбейте pip install openpyxl-> 

Microsoft Windows [Version 10.0.15063]
(c) Корпорация Майкрософт (Microsoft Corporation), 2017. Все права защищены.

C:\WINDOWS\system32>pip install openpyxl
Collecting openpyxl
  Downloading openpyxl-2.4.9.tar.gz (157kB)
    45% |██████████████▌                 | 71kB 378kB/s eta 0:00:0    51% |████████████████▋               | 81kB 409kB/s eta 0:00    58% |██████████████████▊             | 92kB 457kB/s eta 0:    64% |████████████████████▉           | 102kB 481kB/s eta    71% |██████████████████████▉         | 112kB 654kB/s e    77% |██ ███████████████████████       | 122kB 741kB/    84% |███████████████████████████     | 133kB 856k    90% |█████████████████████████ ████   | 143kB 1.    97% |███████████████████████████████▏| 153kB     100% |████████████████████████████████| 163kB 1.1MB/s
Collecting jdcal (from openpyxl)
  Downloading jdcal-1.3.tar.gz
Collecting et_xmlfile (from openpyxl)
  Downloading et_xmlfile-1.0.1.tar.gz
Installing collected packages: jdcal, et-xmlfile, openpyxl
  Running setup.py install for jdcal ... error
Exception:
Traceback (most recent call last):
  File "c:\users\хозяин win7\appdata\local\programs\python\python36\lib\site-packages\pip\compat\__init__.py", line 73, in console_to_str
    return s.decode(sys.__stdout__.encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf5 in position 39: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\хозяин win7\appdata\local\programs\python\python36\lib\site-packages\pip\basecommand.py", line 215, in main
    status = self.run(options, args)
  File "c:\users\хозяин win7\appdata\local\programs\python\python36\lib\site-packages\pip\commands\install.py", line 342, in run
    prefix=options.prefix_path,
  File "c:\users\хозяин win7\appdata\local\programs\python\python36\lib\site-packages\pip\req\req_set.py", line 784, in install
    **kwargs
  File "c:\users\хозяин win7\appdata\local\programs\python\python36\lib\site-packages\pip\req\req_install.py", line 878, in install
    spinner=spinner,
  File "c:\users\хозяин win7\appdata\local\programs\python\python36\lib\site-packages\pip\utils\__init__.py", line 676, in call_subprocess
    line = console_to_str(proc.stdout.readline())
  File "c:\users\хозяин win7\appdata\local\programs\python\python36\lib\site-packages\pip\compat\__init__.py", line 75, in console_to_str
    return s.decode('utf_8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf5 in position 39: invalid start byte

C:\WINDOWS\system32>
30.12.2017 14:42
Загадочно, возможно дело в том, что имя компа на русском (есть такой баг в питоне) или учетка..
Попробуйте переустановить питон, поставьте все галочки - пусть он установится в C:\Program Files...
20.01.2018 14:12
А можно, чтобы получал историю только по определённым парам например только рублёвым.
21.01.2018 12:24
Конечно, для эксмо, например, после строки
if not trades[pair]: #пропускаем пары, по которым не было торгов
        continue
добавьте 
if not 'RUB' in pair: #пропускаем пары, у которых нет RUB в названии
        continue
Для Yobit замените
pairs = [pair for pair in res_obj['pairs']] # создадим массив названий пар
на
pairs = [pair for pair in res_obj['pairs'] if 'rur' in pair] # создадим массив названий пар
Не проверял, но вроде бы все правильно
19.02.2018 09:30
Андрей а для Yobit почему этой конструкцией нельзя вытащить все криптопары для одной из основных крипт на этой бирже "waves", для всех других спокойно вытаскивается (btc, eth, doge, usd, rur), а "waves" не даёт, причем по одной паре достается, а вот чтоб все сразу нет, в чём может быть причина не проверите.

pairs = [pair for pair in res_obj['pairs'] if 'waves' in pair] # создадим массив названий по одной данной паре

в итоге всегда даёт такую ошибку

Traceback (most recent call last):
  File "C:\Python34\_waves.py", line 64, in <module>
    string = ('%0.8f' % ticker_res_obj[pair]['sell']) # ПОКУПКА
TypeError: 'int' object is not subscriptable

Причём подчёркиваю, что для других основный криптопар такая конструкция работает, без проблем, не посмотрите в чём может быть дело у них там.</module>
19.02.2018 09:51
Я так понимаю, вы про скрипт из этой статьи? https://bablofil.ru/yobit-api-python/
У waves длина названия больше, поэтому, если собирать их по 50 штук, выходит слишком длинная строка запроса, нужно уменьшить кол-во. Я обновил пример в статье, теперь там 30 записей за раз берется, waves работает
22.01.2018 09:39
Сначало работала на следующий день перестала, было обновление системы. Побывал обновлять ключи на Yobit, удалил файл nonce. Пробывал и на Windows тоже самое. 
Traceback (most recent call last):
  File "./excel.py", line 66, in <module>
    res_obj = json.loads(res.text) # переводим полученный текст в объект с данными
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
</module>
22.01.2018 10:03
Yobit что-то мудрит с защитой, попробуйте указать yobit.io вместо yobit.net в коде
04.02.2018 13:43
У меня код вывел Следующее
>>> D:\programmir\excel_test.py
  File "<stdin>", line 1
    D:\programmir\excel_test.py
                              ^
SyntaxError: unexpected character after line continuation character
Что надо исправить?</stdin>
05.02.2018 07:56
Вы запускаете не там
Win-R -> cmd -> python D:\programmir\excel_test.py
05.02.2018 15:40
вот что получаю (по этой ссылке у меня питон стоит и файл для битрикса работает нормально. мне было интересно, как там открыть графики и я начала с самого простого текста)

C:\Users\Наташа>python D:\programmir\excel_test.py
Traceback (most recent call last):
  File "D:\programmir\excel_test.py", line 1, in <module>
    from openpyxl import Workbook
ModuleNotFoundError: No module named 'openpyxl'</module>
05.02.2018 15:42
ой вроде поняла! забыла запустить модуль
05.02.2018 16:09
заработало
12.02.2018 13:28
Андрей здравствуйте, помогите новичкам решить три задачи по выгрузки файлов в эксель с элементарными примерами кодов.
1. Когда создается новый файл "питоном", как у Вас, то старый затирается, это не есть хорошо, нужно открывать уже существующий файл и в него добавлять эти таблички, т.к. в том файле уже может быть создан расчет, а он просто затирается новым файлом.
2. Научите нас пожалуйста вставлять сформированную таблицу в питоне начиная с конкретную ячейки, допустим "Н8", конкретного листа эксельки, а не как сейчас по умолчанию всё таблицы вставляются по умолчанию в ячейку "А1", то же на примере.
3. Так как биржа Yobit все цифры формирует с точкой после значащего знака "." (пример 0.12345678), а в эксельки все расчеты с цифрами можно производить только с запятой (пример 0,12345678), то научите как "питоном" менять все точки в цифрах на запятые, что бы загруженная в файл табличка была сразу готова для полноценной работы с ней, это очень важно.
Буду премного благодарен за такой ликбез, спасибо.
25.02.2018 07:41
Здравствуйте, а можно ли сделать так, чтобы бот отслеживал все валюты в реальном времени и оповещал если монета пампится, как например MoonBot для Binance. Конечно было бы не плохо если бы он еще и пару выбирал сам и делал 2 ордера на покупку и продажу.??
12.06.2018 16:34
Для yobit без комиссии

ws.append(["Дата сделки", "Пара сделки", "ID ордера", "ID сделки", "Тип сделки", "Цена сделки", "Сумма сделки", "Всего"])

ws.append([
                    datetime.fromtimestamp(int(trade['timestamp']), timezone.utc),  # дата сделки
                    pair,  # Пара сделки
                    trade['order_id'],  # ID ордера
                    t,  # ID сделки
                    'Покупка' if trade['type'] == 'buy' else 'Продажа',
                    float(trade['rate']),  # Цена сделки
                    float(trade['amount']) * (-1 if trade['type'] == 'buy' else 1),
                    round(float(trade['rate']) * float(trade['amount']), 8) * (-1 if trade['type'] == 'buy' else 1),
                    # сумма сделки, если buy то отрицательная - так удобнее считать потом
                ])
А уже после этого проделываем все манипуляции для подсчета профита по столбцу Всего - как в примере для эксмо без учета комиссии
13.06.2018 10:52
Для yobit с учетом всех комиссий получаем существенное отличие в виде

round(float(trade['rate']) * float(trade['amount']), 8) * (-1.002 if trade['type'] == 'buy' else 1),

по этому столбцу можем рассчитывать хоть сальдо, хоть профит, хоть прибыль или убыток. :-)
04.12.2018 12:36
почему если sell, то не считаете комиссию?
18.06.2018 19:37
вот бы в google sheets такую же инструкцию ))
28.11.2018 22:16
Доброе время суток !
программа долго лопатила историю йобита и в конце выдала ошибку, (ошибка ниже) долго питался понять в чем дело так и не понял, помогите пожалуйста разобраться. и можно ли сделать так чтобы не делать запрос ко всем парам, а только к тем по которым были торги, либо пары указанные в ручную? 

Получаем историю торгов по паре rec_eth ******************************
Traceback (most recent call last):
  File "D:\!Programing\Бот\histori yobit.py", line 79, in <module>
    data = call_api(method="TradeHistory", pair=pair)
  File "D:\!Programing\Бот\histori yobit.py", line 52, in call_api
    response = conn.getresponse().read()
  File "C:\Program Files (x86)\Python37-32\lib\http\client.py", line 1321, in getresponse
    response.begin()
  File "C:\Program Files (x86)\Python37-32\lib\http\client.py", line 296, in begin
    version, status, reason = self._read_status()
  File "C:\Program Files (x86)\Python37-32\lib\http\client.py", line 257, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "C:\Program Files (x86)\Python37-32\lib\socket.py", line 589, in readinto
    return self._sock.recv_into(b)
  File "C:\Program Files (x86)\Python37-32\lib\ssl.py", line 1049, in recv_into
    return self.read(nbytes, buffer)
  File "C:\Program Files (x86)\Python37-32\lib\ssl.py", line 908, in read
    return self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out
>>> </module>
30.11.2018 09:21
Доброе,
Это видимо сетевой сбой, медленный интернет или проблемы на стороне биржи, такое бывает
Выше в комментариях я писал, как выбрать только рублевые пары, например
Если вы ходите вообще свой список, то можно заменить вот эти три строки

res = requests.get('https://yobit.net/api/3/info') # получаем данные info
res_obj = json.loads(res.text) # переводим полученный текст в объект с данными

pairs = [pair for pair in res_obj['pairs']] # создадим массив названий пар

на одну

pairs = ['liza_rur', 'ltc_btc']
02.12.2018 17:43
Большое спасибо! буду пробовать
04.12.2018 12:47
все получилось, но он берет только несколько последних торгов по паре, можно ли получить всю историю своих торгов?
04.12.2018 16:28
Это скорее вопрос к Yobit, попробуйте поментять код на что то вроде
data = call_api(method="TradeHistory", pair=pair, count=10000)
30.03.2020 14:00
Нужна помощь хочу создать запрос на ексмо через python для того чтобы записывались ордера рынка в excel
30.03.2020 14:04
import requests
import json
import time
while False:
	pass
r = requests.get('https://api.exmo.com/v1/order_book/?pair=BTC_USD&limit=1')
r_obj = json.loads(r.text)
from openpyxl import Workbook
wb = Workbook()
# Выбрать активную книгу
ws = wb.active
# Добавим строку с данными
ws.append(['USD'])

# Запишем котировки в столбик А
ws['A2'] = (r_obj['BTC_USD']['ask'])
# Сохраним файл рядом со скриптом
import os

wb.save(os.path.dirname(os.path.abspath(__file__)) + "/BTC_USD.xlsx")
time.sleep(1)
30.03.2020 14:09
value error (cannot convert {o!r} to Excel ''.format(value))
ValueError :cannot counvert [['6638.75', ' 0.0022', '14.60525']] to Excel
28.06.2020 13:29
Нужно как то так
ws['A2'] = (r_obj['BTC_USD']['ask'][0])
ws['B2'] = (r_obj['BTC_USD']['ask'][1])
ws['C2'] = (r_obj['BTC_USD']['ask'][2])
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий