Ccxt: Problemas com assíncrono

Criado em 21 ago. 2017  ·  60Comentários  ·  Fonte: ccxt/ccxt

Parece haver muitos problemas usando a classe asnycio.

import ccxt.async as ccxt
gdax = ccxt.gdax()
print(asyncio.get_event_loop().run_until_complete(gdax.load_markets()))

Lança

ERROR:asyncio:Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f34fee189b0>

Se eu chamar fetch_balance()
Eu recebo:

  File "uvloop/loop.pyx", line 1203, in uvloop.loop.Loop.run_until_complete (uvloop/loop.c:25632)
  File ".venv/lib/python3.6/site-packages/ccxt/async/exchanges.py", line 8516, in fetch_balance
    balances = await self.privateGetAccounts()
  File "venv/lib/python3.6/site-packages/ccxt/async/exchanges.py", line 8678, in request
    response = await self.fetch(url, method, headers, body)
  File ".venv/lib/python3.6/site-packages/ccxt/async/exchange.py", line 85, in fetch
    async with session_method(url, data=body or None, headers=headers, timeout=(self.timeout / 1000)) as response:
  File ".venv/lib/python3.6/site-packages/aiohttp/client.py", line 603, in __aenter__
    self._resp = yield from self._coro
  File ".venv/lib/python3.6/site-packages/aiohttp/client.py", line 239, in _request
    resp = req.send(conn)
  File ".venv/lib/python3.6/site-packages/aiohttp/client_reqrep.py", line 401, in send
    writer.write_headers(status_line, self.headers)
  File ".venv/lib/python3.6/site-packages/aiohttp/http_writer.py", line 250, in write_headers
    [k + SEP + v + END for k, v in headers.items()])
  File ".venv/lib/python3.6/site-packages/aiohttp/http_writer.py", line 250, in <listcomp>
    [k + SEP + v + END for k, v in headers.items()])
TypeError: must be str, not bytes

Não está anexado ao GDAX. Receio que seja uma questão geral.
Boa sorte, espero que você possa encontrar o tempo.

Todos 60 comentários

Olá, bom ouvir de você!
Obrigado por postar isso!

Quanto à sessão do cliente não fechada - é um erro conhecido, você pode ignorá-lo com segurança por enquanto, apenas reclama que a sessão não foi fechada quando você sai do aplicativo. Nós vamos corrigi-lo. Além disso, você não está usando corretamente, até onde eu vejo. Você não está esperando o resultado load_markets() , em vez disso você imprime o retorno run_until_complete() que não retornará os mercados para você. Você deve definir uma função assíncrona como esta:

import ccxt.async as ccxt
async test_gdax():
    gdax = ccxt.gdax()
    print(await gdax.load_markets()) # print here
asyncio.get_event_loop().run_until_complete(test_gdax())) # no print here

Quanto ao TypeError - você pode colar o código que você usa para chamar fetch_balance() ? Pode ser o mesmo problema com o uso assíncrono impróprio.

Confira este exemplo (adicionado, pois outros usuários também podem precisar): https://github.com/kroitor/ccxt/blob/master/examples/py/async-basic.py

Deve ir async def em um exemplo superior. É um erro de digitação.
Não requer escrever a função def assíncrona. O código que eu escrevi lhe dará o mesmo efeito que o seu. Se você observar de perto, é a mesma coisa. Eu apenas pensei que não fechado é um problema maior do que é :) .

Quanto ao fetch_balance().

gdax = ccxt.gdax(**properly initilized**)
asyncio.get_event_loop().run_until_complete(gdax.fetch_balance())

@marinsokol5 sim, consertei os erros de digitação no exemplo, obrigado! Não se preocupe com o erro não fechado.
Quanto a gdax.fetch_balance() – isso é repetível com outras trocas? Se você confirmar, terei que depurá-lo por algum tempo.

Sim, infelizmente é, mas se eles estão todos usando o mesmo método, talvez não seja tão ruim.
As exchanges que testei e falharam são GDAX,Bitfinex e Kraken. Outros que testei passaram.

Tudo de bom. Espero ouvir de você em breve.
Se você precisar de alguém para testá-lo após a depuração estou aqui :) .

Ok, vou verificar isso e postar um trecho para um teste limpo aqui em breve, thx!

@marinsokol5 você pode tentar este, por favor (funciona para mim, mas precisamos localizar o problema):

https://github.com/kroitor/ccxt/blob/master/examples/py/async-balance.py

# -*- coding: utf-8 -*-

import asyncio
import os
import sys

#------------------------------------------------------------------------------

root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(root)

#------------------------------------------------------------------------------

import ccxt.async as ccxt  # noqa: E402

#------------------------------------------------------------------------------

async def test():
    bittrex = ccxt.bittrex({
        'apiKey': "c5af1d0ceeaa4729ad87da1b05d9dfc3",
        'secret': "d055d8e47fdf4c3bbd0ec6c289ea8ffd",
        'verbose': True,
    })
    # no need to load_markets anymore (done automatically upon first call)
    print(await bittrex.fetch_balance())

#------------------------------------------------------------------------------

asyncio.get_event_loop().run_until_complete(test())

O problema nunca foi com o Bittrex.
Bittrex funciona bem para mim. Assim como costumava.
O novo código está na versão ccxt mais recente porque o GDAX ainda não funciona?

O problema nunca foi com o Bittrex.

Desculpe, pensei que você o tivesse repetível para todas as trocas. Vai cavar no GDAX agora.

O novo código está na versão ccxt mais recente porque o GDAX ainda não funciona?

Ainda não enviei a correção para isso.

@marinsokol5 , atualize para a versão mais recente 1.4.72 e tente o seguinte:

https://github.com/kroitor/ccxt/blob/master/examples/py/async-balance-gdax.py

# -*- coding: utf-8 -*-

import asyncio
import os
import sys

#------------------------------------------------------------------------------

root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(root)

#------------------------------------------------------------------------------

import ccxt.async as ccxt  # noqa: E402

#------------------------------------------------------------------------------

async def test():
    gdax = ccxt.gdax({
        'apiKey': "a43edfe629bc5991acc83a536ac6358e",
        'secret': "xOvq+iH8NT07TheFB/fmY3GcnMZMwP7Xct9zwWtAZxsCbJh8rxeEe/0BGxfbV2em7P9iqQD7/TJGqmsDO8B/kw==",
        'password': 'zdmj8o7byla',
        'verbose': True, # switch it to False if you don't want the HTTP log
    })
    # move gdax to sandbox
    gdax.urls['api'] = 'https://api-public.sandbox.gdax.com'
    print(await gdax.fetch_balance())

#------------------------------------------------------------------------------

asyncio.get_event_loop().run_until_complete(test())

Corrigido o problema de decodificação bytes → str lá no GDAX. Eu acho que você não deve mais ter problemas com essa troca. Mas ainda pode haver problemas com as outras exchanges. Ficarei feliz se você ajudar a listar as trocas que ainda estão vulneráveis ​​a esse problema. Obrigado!

Vou verificar se há bitfinex e kraken agora.

GDAX corrigido!

Ok, enviei as correções para bitfinex e também para kraken. Por favor, atualize para a versão 1.4.73 e tente o seguinte:

https://github.com/kroitor/ccxt/blob/master/examples/py/async-balances.py

# -*- coding: utf-8 -*-

import asyncio
import os
import sys

#------------------------------------------------------------------------------

root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(root)

#------------------------------------------------------------------------------

import ccxt.async as ccxt  # noqa: E402

#------------------------------------------------------------------------------

async def test(exchange):
    print(await exchange.fetch_balance())

#------------------------------------------------------------------------------

kraken = ccxt.kraken({
    'apiKey': "hEvQNMDIeoCJbr7W/ZBb5CGOrx3G0lWF5B3zqa1JBxdZlEaL8EK+D0Mw",
    'secret': "JaE9wI6Nwgh5oRxiHcVxurwzwBxwc05W/qv/k1srGg4s3EYuXPpNkLLM5NYbbWpM8rCyijIeDavRuqWbU0ZV9A==",
    'verbose': True, # switch it to False if you don't want the HTTP log
})
bitfinex = ccxt.bitfinex({
    'apiKey': "4FlEDtxDl35gdEiobnfZ72vJeZteE4Bb7JdvqzjIjHq",
    'secret': "D4DXM8DZdHuAq9YptUsb42aWT1XBnGlIJgLi8a7tzFH",
    'verbose': True, # switch it to False if you don't want the HTTP log
})

[asyncio.ensure_future(test(exchange)) for exchange in [kraken, bitfinex]]
pending = asyncio.Task.all_tasks()
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*pending))

Se você não tiver mais problemas com essas trocas, encerre este problema. Se isso não resolver, continuaremos trabalhando nisso. Se você ainda tiver problemas com outras trocas posteriormente, sinta-se à vontade para reabri-la ou fazer uma nova. Obrigado!

Além disso, o aviso de sessão não fechada deve desaparecer agora.

Sim, o Kraken está consertado e funcionando muito bem. Sessão não fechada também.

Bitfinex não lança erro ao buscar saldos. Foi mal.
Estou tentando chamar um de seus métodos que são adicionados automaticamente como seus atributos.
bitfinex.private_post_account_infos() .
Ele joga
<class 'NameError'>: name 'ccxt' is not defined happened
É possível que tenha algo a ver com a classe exchange.py

        async with session_method(url, data=body or None, headers=headers, timeout=(self.timeout / 1000)) as response:
            text = await response.text()
            error = None
            details = text if text else None
            if response.status == 429:
                error = ccxt.DDoSProtection
            elif response.status in [404, 409, 500, 501, 502, 521, 522, 525]:
                details = str(response.status) + ' ' + text
                error = ccxt.ExchangeNotAvailable
            elif response.status in [400, 403, 405, 503]:
                # special case to detect ddos protection
                reason = text
                ddos_protection = re.search('(cloudflare|incapsula)', reason, flags=re.IGNORECASE)
                if ddos_protection:
                    error = ccxt.DDoSProtection
                else:
                    error = ccxt.ExchangeNotAvailable
                    details = '(possible reasons: ' + ', '.join([
                        'invalid API keys',
                        'bad or old nonce',
                        'exchange is down or offline',
                        'on maintenance',
                        'DDoS protection',
                        'rate-limiting',
                        reason,
                    ]) + ')'
            elif response.status in [408, 504]:
                error = ccxt.RequestTimeout
            elif response.status in [401, 422, 511]:
                error = ccxt.AuthenticationError
            if error:
                self.raise_error(error, url, method, str(response.status), details)
        if self.verbose:
            print(method, url, "\nResponse:", headers, text)
        return self.handle_response(url, method, headers, text)

Meu PyCharm lança vermelho no ccxt no código quando e não o encontra.

Ok, vou dar uma olhada no que está acontecendo com os métodos personalizados bitfinex e relatarei em breve.

BTW, o bitfinex ainda tinha o mesmo problema que o Kraken, então uma correção era necessária de qualquer maneira. Mas seu erro é provavelmente por algum outro motivo, cavando nele.

@marinsokol5 você pode postar um trecho mostrando como você chama esse método, incluindo os parâmetros?

Estou tentando, mas não consigo repetir o problema do bitfinex com o seguinte trecho:

https://github.com/kroitor/ccxt/blob/master/examples/py/async-bitfinex-private-post-account-infos.py

# -*- coding: utf-8 -*-

import asyncio
import os
import sys

#------------------------------------------------------------------------------

root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(root)

#------------------------------------------------------------------------------

import ccxt.async as ccxt  # noqa: E402

#------------------------------------------------------------------------------

async def test(exchange):
    print(await exchange.private_post_account_infos())

#------------------------------------------------------------------------------

bitfinex = ccxt.bitfinex({
    'apiKey': "4FlEDtxDl35gdEiobnfZ72vJeZteE4Bb7JdvqzjIjHq",
    'secret': "D4DXM8DZdHuAq9YptUsb42aWT1XBnGlIJgLi8a7tzFH",
    'verbose': True, # switch it to False if you don't want the HTTP log
})

[asyncio.ensure_future(test(exchange)) for exchange in [bitfinex]]
pending = asyncio.Task.all_tasks()
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*pending))

Você pode testar este código do seu lado e relatar se está funcionando para você?

Sim, seu código está funcionando.
Estranho.
Vou verificar um pouco mais pela manhã sobre bitfinex.
Ainda assim, o erro que recebo deve ser algum tipo de sobra no ccxt.
Na linha 1559: response = await self.fetch(url, method, headers, body)
Isso me leva à classe exchange.py e seu método fetch
async def fetch(self, url, method='GET', headers=None, body=None):
onde todo erro chama ccxt inexistente
exemplo error = ccxt.ExchangeNotAvailable .

Além disso:
Isso é o que liqui joga em mim

liqui=ccxt.liqui(***)
print(asyncio.get_event_loop().run_until_complete(liqui.fetch_balance())
  File "uvloop/loop.pyx", line 1203, in uvloop.loop.Loop.run_until_complete (uvloop/loop.c:25632)
  File "python3.6/site-packages/ccxt/async/exchanges.py", line 3786, in fetch_balance
    response = await self.privatePostGetInfo()
  File "python3.6/site-packages/ccxt/async/exchanges.py", line 10450, in request
    response = await self.fetch(url, method, headers, body)
  File "python3.6/site-packages/ccxt/async/exchange.py", line 89, in fetch
    async with session_method(url, data=body or None, headers=headers, timeout=(self.timeout / 1000)) as response:
  File "python3.6/site-packages/aiohttp/client.py", line 603, in __aenter__
    self._resp = yield from self._coro
  File "python3.6/site-packages/aiohttp/client.py", line 239, in _request
    resp = req.send(conn)
  File "python3.6/site-packages/aiohttp/client_reqrep.py", line 401, in send
    writer.write_headers(status_line, self.headers)
  File "python3.6/site-packages/aiohttp/http_writer.py", line 250, in write_headers
    [k + SEP + v + END for k, v in headers.items()])
  File "python3.6/site-packages/aiohttp/http_writer.py", line 250, in <listcomp>
    [k + SEP + v + END for k, v in headers.items()])
TypeError: must be str, not int
2017-08-21 23:10:32,079 [ERROR] asyncio {connector.py:__del__:64}: Unclosed connection
client_connection: Connection<('api.liqui.io', 443, True)>

Exatamente a mesma coisa com Liqui é com Bitstamp .

Ok, vou corrigir para Liqui e Bitstamp também, obrigado pela atualização.

Quanto ao bitfinex.private_post_accounts_infos(), se você quiser que eu ajude, você terá que escrever seu ambiente e como você executa o código, pois ainda não consegui reproduzir esse problema. Talvez uma diferença de versão (Python ou ambiente) e uma correção dentro do ccxt possam ser realmente necessárias para o seu ambiente. Basicamente, parece que é um problema relacionado ao env, mas vou corrigi-lo se você colar mais informações:

  • um stacktrace completo do código problemático
  • o próprio código (nem uma única linha ;)
  • os números de versão para seus pacotes de software
  • como você começa

Pelo menos, até reproduzi-lo, sou cego, preciso saber com mais detalhes o que você faz e o que recebe em troca.

Vou adicionar uma importação explícita dessas classes de exceção, talvez seja esse o caso. Será carregado em alguns minutos.

Ok, fiz algumas alterações com essas importações, você pode atualizar para 1.4.77, tente e veja se os erros desapareceram. Caso contrário, não serei muito útil sem mais informações suas. Estará à disposição para o seu feedback. THX!

Versão 1.4.8 do ccxt.

O problema com o Bitstamp ainda está aqui. Assim como Liqui no comentário superior. Chamar fetch_balance lança

[k + SEP + v + END for k, v in headers.items()])
TypeError: must be str, not int

Liqui agora ao chamar fetch_balance arremessos

  File "python3.6/site-packages/ccxt/async/exchanges.py", line 3795, in fetch_balance
    response = await self.privatePostGetInfo()
  File "python3.6/site-packages/ccxt/async/exchanges.py", line 10458, in request
    'Sign': self.decode(signature),
  File "python3.6/site-packages/ccxt/exchange.py", line 515, in decode
    return string.decode()
AttributeError: 'str' object has no attribute 'decode'

O problema com a importação errada foi corrigido! Obrigado por isso.
Agora o AuthentificationError é lançado.
Hmm, não havia uma explicação antes do que poderia ter dado errado junto com o erro? Pode ser apenas minha memória ruim.
De qualquer forma, se você quiser reproduzir o erro.

bitfinex = ccxt.bitfinex({
    'apiKey': "4FlEDtxDl35gdE4fdefZ72vJeZteE4Bb7JdvqzjIjHq",
    'secret': "D4DXM8DZdHuAq9YptUsb42aWT1XBnGlIJgLi8a7tzFH",
})
asyncio.get_event_loop().run_until_complete(bitfinex.fetch_balance())

Esta é a sua chave de API com um ou dois números alterados para gerar um erro.

O problema com o Bitstamp ainda está aqui. Então, como Liqui no comentário superior.

Você pode por favor colar o stacktrace completo?

Liqui agora ao chamar fetch_balance lança

Isso é estranho, mas vou corrigi-lo.

Agora o AuthentificationError é lançado. Hmm, não havia uma explicação antes do que poderia ter dado errado junto com o erro? Pode ser apenas minha memória ruim.

Sua memória está boa, só aparece em certas situações.

De qualquer forma, se você quiser reproduzir o erro.

Bem, se você tentar credenciais erradas, ele deve lançar AuthenticationError e funciona como esperado, certo? Então... esse último sobre bitfinex eu não entendi completamente.

Ok, o Liqui agora deve funcionar normalmente, na versão 1.4.81+.
Pelo que entendi, o Bitfinex também está funcionando normalmente (de acordo com o código colado anteriormente)?
Qual fica? Carimbo de bits?

O código bitfinex estava aqui apenas para representar que a mensagem de erro que acompanha o erro de autenticação parece um pouco mais curta do que antes.

Código bitstamp que me dá um erro:

bitstamp=ccxt.bitstamp(**)
print(asyncio.get_event_loop().run_until_complete(bitstamp.fetch_balance())

Rastreamento de pilha de bitstamp

  File "uvloop/loop.pyx", line 1203, in uvloop.loop.Loop.run_until_complete (uvloop/loop.c:25632)
  File "/python3.6/site-packages/ccxt/async/exchanges.py", line 2780, in fetch_balance
    balance = await self.privatePostBalance()
  File "/python3.6/site-packages/ccxt/async/exchanges.py", line 2844, in request
    response = await self.fetch(url, method, headers, body)
  File "/python3.6/site-packages/ccxt/async/exchange.py", line 99, in fetch
    async with session_method(url, data=body or None, headers=headers, timeout=(self.timeout / 1000)) as response:
  File "/python3.6/site-packages/aiohttp/client.py", line 603, in __aenter__
    self._resp = yield from self._coro
  File "/python3.6/site-packages/aiohttp/client.py", line 239, in _request
    resp = req.send(conn)
  File "python3.6/site-packages/aiohttp/client_reqrep.py", line 401, in send
    writer.write_headers(status_line, self.headers)
  File "python3.6/site-packages/aiohttp/http_writer.py", line 250, in write_headers
    [k + SEP + v + END for k, v in headers.items()])
  File "python3.6/site-packages/aiohttp/http_writer.py", line 250, in <listcomp>
    [k + SEP + v + END for k, v in headers.items()])
TypeError: must be str, not int
2017-08-22 08:47:16,966 [ERROR] asyncio {connector.py:__del__:64}: Unclosed connection
client_connection: Connection<('www.bitstamp.net', 443, True)>

@marinsokol5 Eu também adicionei uma correção para bitstamp em 1.4.81+, atualize e tente novamente (com liqui) em um minuto ou dois. THX!

Ok, está aí, atualize, experimente e me avise se bitstamp e liqui estão funcionando normalmente para você. Não vejo nada com esses dois nos testes.

Isso é estranho, deveria ser 1.4.81, já está no PyPI: https://pypi.python.org/pypi/ccxt. Talvez tente novamente em um minuto? Pode ser algum problema de cache atrapalhando.

Acabou de chegar

Ok Liqui e Bitstamp estão funcionando!!
Obrigada.

Legal! Deixe-me saber se você tiver quaisquer outros problemas (espero que não))))

Você está bem comigo mantendo isso aberto por meia hora ou uma hora.
Só para eu poder fazer outros testes com assíncrono?

Certo!

Se você está se perguntando, por que você obtém um AuthenticationError mais curto (sem uma lista de possíveis motivos) - é porque o ccxt conseguiu determinar isso com certeza. Se não for capaz de determinar o motivo exato, imprime os possíveis motivos. Essa é a lógica. Na maioria das situações, um AuthenticationError é muito específico e não requer uma explicação além da string de erro. E quando você recebe o ExchangeError – pode ser qualquer coisa, é quando imprimimos os possíveis motivos.

PS Algumas exchanges enviam apenas o ExchangeError (por qualquer motivo, mesmo para erros de autenticação)... essa é a explicação mais curta.

Bter

bter=ccxt.bter(**)
print(asyncio.get_event_loop().run_until_complete(bter.fetch_balance())
  response = await self.fetch(url, method, headers, body)
  File "/home/marin/fino/.venv/lib/python3.6/site-packages/ccxt/async/exchange.py", line 99, in fetch
    async with session_method(url, data=body or None, headers=headers, timeout=(self.timeout / 1000)) as response:
  File "/home/marin/fino/.venv/lib/python3.6/site-packages/aiohttp/client.py", line 603, in __aenter__
    self._resp = yield from self._coro
  File "/home/marin/fino/.venv/lib/python3.6/site-packages/aiohttp/client.py", line 239, in _request
    resp = req.send(conn)
  File "/home/marin/fino/.venv/lib/python3.6/site-packages/aiohttp/client_reqrep.py", line 401, in send
    writer.write_headers(status_line, self.headers)
  File "/home/marin/fino/.venv/lib/python3.6/site-packages/aiohttp/http_writer.py", line 250, in write_headers
    [k + SEP + v + END for k, v in headers.items()])
  File "/home/marin/fino/.venv/lib/python3.6/site-packages/aiohttp/http_writer.py", line 250, in <listcomp>
    [k + SEP + v + END for k, v in headers.items()])
TypeError: must be str, not int
2017-08-22 09:26:01,760 [ERROR] asyncio {connector.py:__del__:64}: Unclosed connection
client_connection: Connection<('api.bter.com', 443, True)>

Ok, o bter também deve funcionar normalmente na versão 1.4.82+ (já deve estar disponível no PyPI).

Bjs consertado!!!
Vai verificar mais alguns.

Impressionante! vou ficar de pé)

Você fez um bom trabalho cara. :)

Neste momento tudo me parece bem.
Vou postar um problema se eu encontrar algo.
Tudo de bom.

@marinsokol5 sem sua ajuda, seria muito mais difícil e levaria muito mais tempo, obrigado!

Olá. Eu encontrei o mesmo problema para o trocador de gatecoin:
Arquivo "/Users/kas/Documents/Bitcoin/proj/ccxt/async/gatecoin.py", linha 385, na solicitação
resposta = await self.fetch2(path, api, method, params, headers, body)
Arquivo "/Users/kas/Documents/Bitcoin/proj/ccxt/async/base/exchange.py", linha 84, em fetch2
return await self.fetch(request['url'], request['method'], request['headers'], request['body'])
Arquivo "/Users/kas/Documents/Bitcoin/proj/ccxt/async/base/exchange.py", linha 104, em busca
async com session_method(url, data=encoded_body, headers=headers, timeout=(self.timeout / 1000), proxy=self.aiohttp_proxy) como resposta:
Arquivo "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/aiohttp/client.py", linha 690, em __aenter__
self._resp = rendimento de self._coro
Arquivo "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/aiohttp/client.py", linha 275, em _request
resp = req.send(conn)
Arquivo "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/aiohttp/client_reqrep.py", linha 463, em enviar
escritor.write_headers(status_line, self.headers)
Arquivo "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/aiohttp/http_writer.py", linha 247, em write_headers
[k + SEP + v + END para k, v em headers.items()])
Arquivo "/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/aiohttp/http_writer.py", linha 247, em
[k + SEP + v + END para k, v em headers.items()])
TypeError: deve ser str, não bytes

Isso pode corrigir:
'API_PUBLIC_KEY': self.apiKey,
'API_REQUEST_SIGNATURE': self.decode(assinatura),
'API_REQUEST_DATE': str(nonce)

Obrigada

Olá, @alexsith! Qual é a sua versão do ccxt?

Agora eu uso 1.10.538.

@alexsith corrigido em 1.10.549. Atualize sua versão, o problema deve ter desaparecido. Ficaremos felizes se você informar, se funciona normalmente após a atualização ou não. THX!

@kroitor Muito obrigado. Mas não consigo atualizar o ccxt agora estou com um problema https://github.com/ccxt/ccxt/issues/1040

@alexsith irá corrigi-lo em 5-10 minutos também.

oi @kroitor Parece que estou recebendo esse problema com a versão 1.10.1189 e python 3.6, código anexado. Desculpe, noob aqui, então deixe-me saber se eu devo abrir um problema separado.
problema assíncrono.txt

import datetime as dt
import ccxt.async as ccxt
import asyncio


async def main(exchange, st_date):
    raw = []
    for i in range(0, 10):
        raw.extend(await exchange.public_get_executions({'product_id': '5',
                                                         'timestamp': st_date,
                                                         'limit': '1000',
                                                         'page': i + 1}))
        print("call " + str(i) + " returned. " + dt.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'))
    return raw

q = ccxt.quoinex({'enableRateLimit': True, })

# set start date parameter
st = dt.datetime.timestamp(dt.datetime.utcnow() - dt.timedelta(days=7))

# notify start of call process
print("initiating trade call " + dt.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'))

# get trades
tr = asyncio.get_event_loop().run_until_complete(main(q, st))

Obrigado!

Se você acha que clicou errado no chat ^^

No sábado, 24 de fevereiro de 2018 às 23h38, wheward [email protected] escreveu:

oi @kroitor https://github.com/kroitor Parece que estou recebendo esse problema
com versão 1.10.1189 e python 3.6, código anexado. Desculpe, noob aqui, então
deixe-me saber se eu deveria abrir um problema separado.
problema assíncrono.txt
https://github.com/ccxt/ccxt/files/1755383/async.issue.txt

Obrigado!


Você está recebendo isso porque está inscrito neste tópico.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/ccxt/ccxt/issues/139#issuecomment-368265879 ou silenciar
o segmento
https://github.com/notifications/unsubscribe-auth/AiHSIbVdbM-WYtCiF-IBUJLnLzwLs-NBks5tYI9xgaJpZM4O9gpG
.

--
Junho, junaga. [email protected]

visite meu ts em ts302.playeffect.de:10009
também em:
http://steamcommunity.com/id/Junaga/
https://www.reddit.com/user/junaga/comments/

@wheward oi! Você pode mostrar sua saída detalhada desse script seguindo estas etapas: https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how -to-submit-an-issue ?

obrigado por responder @kroitor aqui está a saída detalhada, reduzi a quantidade de dados solicitados para encurtar a resposta.

C:\Python36\python.exe "C:/Users/WH/Pycharm projects/untitled/async issue.py"
initiating trade call 2018-02-25 00:45:40

Request: GET https://api.quoine.com/executions?product_id=5&timestamp=1518875140.835389&limit=5&page=1 {'X-Quoine-API-Version': '2', 'Content-Type': 'application/json', 'User-Agent': 'python-requests/2.18.4', 'Accept-Encoding': 'gzip, deflate'} None

Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x000001E71C7C7DD8>
Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x000001E71AFFC390>, 97732.093)]']
connector: <aiohttp.connector.TCPConnector object at 0x000001E71C7C7D30>
Response: GET https://api.quoine.com/executions?product_id=5&timestamp=1518875140.835389&limit=5&page=1 200 <CIMultiDictProxy('Date': 'Sun, 25 Feb 2018 00:45:43 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '175', 'Connection': 'keep-alive', 'Set-Cookie': '__cfduid=d4feb28dd556cb1a383eac73a93798bae1519519543; expires=Mon, 25-Feb-19 00:45:43 GMT; path=/; domain=.quoine.com; HttpOnly', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Content-Encoding': 'gzip', 'Etag': '"88314c7260cfc8dba9b7959092133be0"', 'Set-Cookie': '_vax_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJTgzZjc3NzRiYmY0MjQ4ZGRkZTkyZjA4ZGRmZGExNGE0BjsAVEkiCWxhbmcGOwBGOgdlbg%3D%3D--95eca42fddba4a4aa28c0eb4d5126b45f4b67f3f; path=/; secure; HttpOnly', 'Status': '200 OK', 'Strict-Transport-Security': 'max-age=631152000; includeSubdomains', 'Vary': 'Accept-Encoding', 'Via': '1.1 spaces-router (03339d95e5c7)', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN', 'X-Powered-By': 'Phusion Passenger 5.1.2', 'X-Rack-Cache': 'miss', 'X-Request-Id': 'f5f9fe1f-6f10-0c62-d8f5-b5291fd8365d', 'X-Runtime': '0.031398', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'X-Xss-Protection': '1; mode=block', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '3f26a4b9aa4465bd-SYD')> [{"id":27223326,"quantity":"0.052","price":"1144576.47727","taker_side":"buy","created_at":1518875148},{"id":27223340,"quantity":"0.18","price":"1144578.60227","taker_side":"buy","created_at":1518875182},{"id":27223339,"quantity":"0.1197902","price":"1144567.68","taker_side":"buy","created_at":1518875182},{"id":27223338,"quantity":"0.7448","price":"1144567.67","taker_side":"buy","created_at":1518875182},{"id":27223337,"quantity":"0.052","price":"1144566.928","taker_side":"buy","created_at":1518875182}]
call 0 returned. 2018-02-25 00:45:42

Process finished with exit code 0

@wheward

ok, thx, no entanto, agora estou um pouco confuso:

Parece que estou recebendo esse problema com a versão 1.10.1189 e python 3.6

Como houve muitos problemas mencionados neste post, você pode esclarecer qual problema específico você quer dizer? É o problema de "sessão de cliente não fechada" ?

se você quer dizer esse problema específico, ele foi abordado aqui: https://github.com/ccxt/ccxt/pull/2031
E o código apropriado com um aviso de logger estará disponível na versão 1.10.1192 em 5-10 minutos.

@kroitor
isso mesmo, é o problema da sessão do cliente não fechada.
incrível 👍 obrigado pela resposta rápida e atualização!

@wheward ok, então você tem que chamar await exchange.close() na instância de troca, antes que o programa saia, como diz a mensagem de aviso. Deixe-nos saber se você ainda tem dificuldades com isso. THX!

@kroitor tudo bem, funciona perfeitamente agora, obrigado novamente!

Legal! Deixe-me saber se você tiver quaisquer outros problemas (espero que não))))

Olá @kroitor
Parece que o bitstamp não funciona, ocorre TypeError
versão 1.26.53

connector = bitstamp({'apiKey': "XXXX", 'secret': "YYYY"})
connector.uid = 'ZZZZ'
fut = asyncio.ensure_future(connector.fetch_balance())
asyncio.get_event_loop().run_until_complete(fut)

eu recebo:

Traceback (most recent call last):
  File "/ms_general/private_connector/test_bitstamp.py", line 12, in <module>
    asyncio.get_event_loop().run_until_complete(fut)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
    return future.result()
  File "/ms_general/private_connector/test_bitstamp.py", line 7, in test
    print(await exchange.fetch_balance())
  File "/ms_general/venv3.7/lib/python3.7/site-packages/ccxt/async_support/bitstamp.py", line 516, in fetch_balance
    balance = await self.privatePostBalance(params)
  File "/ms_general/venv3.7/lib/python3.7/site-packages/ccxt/async_support/base/exchange.py", line 95, in fetch2
    return await self.fetch(request['url'], request['method'], request['headers'], request['body'])
  File "/ms_general/venv3.7/lib/python3.7/site-packages/ccxt/async_support/base/exchange.py", line 120, in fetch
    proxy=self.aiohttp_proxy) as response:
  File "/ms_general/venv3.7/lib/python3.7/site-packages/aiohttp/client.py", line 1012, in __aenter__
    self._resp = await self._coro
  File "/ms_general/venv3.7/lib/python3.7/site-packages/aiohttp/client.py", line 502, in _request
    resp = await req.send(conn)
  File "/ms_general/venv3.7/lib/python3.7/site-packages/aiohttp/client_reqrep.py", line 629, in send
    await writer.write_headers(status_line, self.headers)
  File "/ms_general/venv3.7/lib/python3.7/site-packages/aiohttp/http_writer.py", line 111, in write_headers
    buf = _serialize_headers(status_line, headers)
  File "/ms_general/venv3.7/lib/python3.7/site-packages/aiohttp/http_writer.py", line 160, in _py_serialize_headers
    [k + ': ' + v + '\r\n' for k, v in headers.items()])
  File "/ms_general/venv3.7/lib/python3.7/site-packages/aiohttp/http_writer.py", line 160, in <listcomp>
    [k + ': ' + v + '\r\n' for k, v in headers.items()])
**TypeError: can only concatenate str (not "bytes") to str**

bitstamp requires to release all resources with an explicit call to the .close() coroutine. If you are using the exchange instance with async coroutines, add exchange.close() to your code into a place when you're done with the exchange and don't need the exchange instance anymore (at the end of your async coroutine).
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x10d3cb1d0>

ps: Muito obrigado pessoal pelo CCXT. Facilita o meu trabalho e o de muitos engenheiros

Olá @artas728 !

Este problema foi resolvido aqui: https://github.com/ccxt/ccxt/issues/6846

Por favor, atualize para a versão mais recente do CCXT e informe-nos se isso resolve o problema para você ou não. Ansioso por saber sobre você! THX!

@kroitor , eu verifiquei, funciona corretamente
obrigada!

@artas728 obrigado pelo feedback, obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Sarona93 picture Sarona93  ·  3Comentários

hippylover picture hippylover  ·  3Comentários

wannesdemaeght picture wannesdemaeght  ·  3Comentários

ljianyih picture ljianyih  ·  3Comentários

luigikitten picture luigikitten  ·  3Comentários