Ccxt: Problème d'API privé Binance

Créé le 6 juin 2018  ·  40Commentaires  ·  Source: ccxt/ccxt

Bonjour.
J'ai essayé de passer une commande sur Binance mais j'ai obtenu l'erreur suivante. Ma clé API est correcte et toutes les autorisations sont déjà effectuées.
Mon code ressemble à

connection = ccxt.binance({'apiKey': api, 'secret': secret}) print(connection.fetch_open_orders(symbol="ETH/BTC"))

Et les erreurs ressemblent à:
equests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://api.binance.com/api/v3/openOrders?timestamp=1528282115226&recvWindow=5000&symbol=ETHBTC&signature=mysignature
et
ccxt.base.errors.ExchangeError: binance: unknown error code: {"code":-2014,"msg":"API-key format invalid."} -2014

question

Commentaire le plus utile

@kroitor Merci, j'ai trouvé le problème, il s'agit de quelque chose lié au décalage horaire. J'ai essayé ce code, maintenant ça marche.
ccxt.binance ({'options': {'AdjustForTimeDifference': True}})

Tous les 40 commentaires

Ma clé API est correcte

Binance dit que votre format apiKey n'est pas valide: {"code":-2014,"msg":"API-key format invalid."}

Donc, vous devriez vraiment le vérifier d'abord ...

exchange = ccxt.binance ({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    'enableRateLimit': True,  # ←---- in your best interest: https://github.com/ccxt/ccxt/wiki/Manual#rate-limit
})
print(exchange.fetch_balance())

Cela fonctionne-t-il avec vos clés? Assurez-vous que vous n'avez pas égaré l'apiKey et le secret, assurez-vous également que les deux contiennent 64 caractères.

Je suis désolé. C'était mon échec.

@hexeraction merci pour le rapport de toute façon)

J'ai rencontré le même problème, quelle est la solution?

@ tye002

https://github.com/ccxt/ccxt/issues/3057#issuecomment -395089022

Assurez-vous que vous n'avez pas égaré l'apiKey et le secret, assurez-vous également que les deux contiennent 64 caractères.

@ tye002 également, vérifiez que les noms des paramètres que vous utilisez pour les informations d'identification sont exactement apiKey (majuscules K , autres lettres minuscules) et secret (toutes les lettres minuscule).

@kroitor Merci, j'ai trouvé le problème, il s'agit de quelque chose lié au décalage horaire. J'ai essayé ce code, maintenant ça marche.
ccxt.binance ({'options': {'AdjustForTimeDifference': True}})

@ tye002 merci pour votre rapport!

Cependant, vous avez dit que vous aviez le même problème et le message d'erreur abordé dans ce numéro: {"code":-2014,"msg":"API-key format invalid."} ne correspond pas aux erreurs de décalage horaire. Il doit s'agir d'une erreur différente , comme une erreur de signature, une erreur nonce ou un message d'erreur lié à l'horodatage. Quoi qu'il en soit, nous sommes heureux que vous ayez compris.

@kroitor Correct, il y a eu deux erreurs, l'autre concerne l'horodatage. Je pensais que celui-ci: {"code": - 2014, "msg": "Format de clé API invalide."} Est le problème racine. Merci

J'obtiens la même erreur: {"code": - 2014, "msg": "Format de clé API invalide."}.

Le problème est que je n'obtiens pas toujours l'erreur, au début cela fonctionne mais après un certain temps, cela renvoie cette erreur.

Quelqu'un peut-il aider avec une solution?

Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 665, dans urlopen
httplib_response = self._make_request (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 421, dans _make_request
six.raise_from (e, Aucun)
Fichier "", ligne 3, dans rise_from
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 416, dans _make_request
httplib_response = conn.getresponse ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 1322, dans getresponse
response.begin ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 303, en début
version, statut, raison = self._read_status ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 264, dans _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", ligne 669, en lecture
retourne self._sock.recv_into (b)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1241, dans recv_into
retourne self.read (nbytes, tampon)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1099, en lecture
retourne self._sslobj.read (len, buffer)
ConnectionResetError: [Errno 54] Connexion réinitialisée par le pair

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", ligne 439, dans send
resp = conn.urlopen (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 719, dans urlopen
retries = retries.increment (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/util/retry.py", ligne 400, par incrément
lever six.reraise (type (erreur), erreur, _stacktrace)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/packages/six.py", ligne 734, en relance
augmenter la valeur. avec_traceback (tb)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 665, dans urlopen
httplib_response = self._make_request (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 421, dans _make_request
six.raise_from (e, Aucun)
Fichier "", ligne 3, dans rise_from
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 416, dans _make_request
httplib_response = conn.getresponse ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 1322, dans getresponse
response.begin ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 303, en début
version, statut, raison = self._read_status ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 264, dans _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", ligne 669, en lecture
retourne self._sock.recv_into (b)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1241, dans recv_into
retourne self.read (nbytes, tampon)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1099, en lecture
retourne self._sslobj.read (len, buffer)
urllib3.exceptions.ProtocolError: ('Connection abandonnée.', ConnectionResetError (54, 'Connection reset by peer'))

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 538, en cours de récupération
réponse = self.session.request (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", ligne 530, dans la requête
resp = self.send (prep, * send_kwargs)Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", ligne 643, dans sendr = adapter.send (requête, * kwargs)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", ligne 498, dans send
lever ConnectionError (err, request = request)
request.exceptions.ConnectionError: ('Connection abandonnée.', ConnectionResetError (54, 'Connection reset by peer'))

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/Trading_TV_Binance.py", ligne 594, dans
btcAmountUsed = get_max_position_available ()
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/Trading_TV_Binance.py", ligne 123, dans get_max_position_available
to_use = float (exchange.fetch_balance (). get ('USDT'). get ('free'))
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", ligne 556, dans fetch_balance
response = getattr (self, méthode) (requête)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 446, à l'intérieur
entrée de retour (_self, ** inner_kwargs)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", ligne 1813, dans la requête
response = self.fetch2 (chemin, api, méthode, paramètres, en-têtes, corps)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 465, dans fetch2
return self.fetch (demande ['url'], demande ['méthode'], demande ['headers'], demande ['corps'])
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 581, en cours de récupération
lever NetworkError (méthode + '' + url + '' + error_string)

@ rs-g comment initialisez-vous l'échange? Le limiteur de débit est-il activé? Pouvez-vous coller le plus petit code minimal pour reproduire le problème (sans vos clés)?

@kroitor merci beaucoup pour la réponse rapide

exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
    'apiKey': 'key here',
    'secret': 'secret key here',
    'timeout': 30000,
    'enableRateLimit': True,
    # for futures
    'options': {
        'defaultType': 'future',
    },
})

exchange.fetch_balance().get('USDT').get('free')

Comme je l'ai dit, je n'obtiens pas toujours l'erreur et je ne peux pas la reproduire, j'obtiens l'erreur à des moments aléatoires

@ rs-g

Cette erreur peut indiquer un problème de mise en réseau côté client:

ConnectionResetError: [Errno 54] Connexion réinitialisée par le pair

Cela peut être causé par PyCharm si vous lancez le code depuis l'EDI. Est-ce le cas? Si oui, pouvez-vous faire plusieurs tentatives pour essayer de le déclencher exprès? En outre, vous pouvez faire plusieurs essais en exécutant ce même script en dehors de PyCharm (avec Python pur) pour voir s'il génère cette erreur à un moment donné.

En dehors de cela, cela peut également être lié à la fréquence de lancement de ce script. Parce que si l'erreur est lancée après plusieurs tentatives consécutives réussies, cela pourrait signifier que vous ne respectez pas la limite de débit. Ainsi, cela dépend également du fait que le script fonctionne en continu avec la même instance d'échange ou si le script recrée toujours l'instance d'échange (supprimant effectivement la limitation de débit). En bref, comme documenté dans le manuel, CCXT essaiera d'abord de charger la liste des marchés et des devises de la bourse lors de votre premier appel à une méthode unifiée comme fetch_balance . Si vous relancez ensuite le même script - les anciens paramètres de limite de taux sont supprimés et la nouvelle instance d'échange est créée qui charge à nouveau les marchés ... Si cela se produit trop souvent - Binance peut temporairement bloquer l'accès à ses points de terminaison pour se protéger contre un DDoS. Pour éviter cela, vous pouvez réutiliser la même instance d'échange, sans la supprimer et la recréer à chaque exécution.

Donc, pour répondre à votre question, nous avons besoin de beaucoup plus de détails (beaucoup plus d'informations, tout ce que vous pouvez partager). En outre, contacter l'assistance technique de Binance peut également aider, car il sait mieux s'il vous bloque occasionnellement pour une raison quelconque.

@kroitor

Oui, j'utilisais PyCharm mais j'ai essayé avec du Python pur et j'ai eu la même erreur

J'ai réussi à reproduire l'erreur ci-dessus avec ce code:

def test():
    return exchange.fetchBalance().get('USDT').get('free')


while True:
    print(test())
    time.sleep(16*60)

Et maintenant, j'obtiens une autre erreur:

ccxt.base.errors.ExchangeError: GET https://fapi.binance.com/fapi/v1/exchangeInfo HTTPSConnectionPool (host = 'fapi.binance.com', port = 443): Nombre maximal de tentatives dépassé avec l'url: / fapi / v1 / exchangeInfo (Causé par NewConnectionError (': Échec de l'établissement d'une nouvelle connexion: [Errno 8] nom de noeud ni nom de service fourni, ou inconnu '))

et je ne peux pas accéder à binance.com

@ rs-g cela ressemble à un problème du côté de binance, je ne peux pas non plus ouvrir cette URL sur ma machine ... Cela doit être un problème temporaire ou quelque chose comme ça. Je peux confirmer, ce n'est pas disponible pour le moment.

@kroitor merci pour le soutien.

Qu'en est-il de mon code ci-dessus, il me semble que j'attends un peu plus de temps sans faire aucune action sur l'échange. puis essayez d'échanger.fetchBalance J'obtiens cette erreur de mon premier message.

Des pensées?

@ rs-g ça échoue à cause de cette autre erreur interne, c'est une cascade d'erreurs qui est initiée par l'indisponibilité des marchés en premier lieu. Ainsi, fetch_balance appelle load_markets (si les marchés et les devises ne sont pas encore chargés), et si load_markets échoue - fetch_balance échouera également. Les informations sur le marché / la devise sont nécessaires pour unifier correctement les codes de devise, les symboles et les formats de réponse de change. Donc, fondamentalement, si l'API d'échange ne fonctionne pas complètement, l'erreur peut indiquer des problèmes de connexion.

@kroitor je vais reformuler,

J'ai essayé ce code lorsque binance fonctionnait:

def test():
    return exchange.fetchBalance().get('USDT').get('free')


while True:
    print(test())
    time.sleep(16*60)

J'ai obtenu le résultat suivant:

première fois qu'il est entré dans la boucle while, test () a renvoyé la balance correcte
puis attendez 16 * 60 secondes
puis quand il va tester () j'ai eu cette erreur https://github.com/ccxt/ccxt/issues/3057#issuecomment -613920422

@ rs-g avez-vous la même erreur en ce moment? Parce que si l'échange n'est pas entièrement disponible, une demande peut réussir et l'autre peut échouer, au hasard.
En d'autres termes - est-il reproductible dans cette séquence exacte de votre côté? ↓

  1. succès de fetch_balance
  2. attendez 16 * 60 sec
  3. échec de fetch_balance

@kroitor en ce moment je ne peux pas du tout le tester car binance n'est pas accessible. J'essaierai quand il sera de nouveau en ligne.

mais le dernier test de travail (avant la chute de binance) était le suivant:

  1. succès de fetch_balance
  2. attendez 16 * 60 sec
  3. échec de fetch_balance

@ rs-g ok, faites-moi savoir si vous pouvez le reproduire après un certain temps, je vais l'examiner. Malheureusement, je ne peux pas le déboguer maintenant en raison de l'API indisponible. Je soupçonne un problème de connectivité tmp du côté de Binance. Si cela ne disparaît pas après un certain temps, veuillez faire un rapport. THX!

@ rs-g a l'air d'être à nouveau en place, cependant, je ne suis pas sûr qu'il soit stabilisé: https://fapi.binance.com/fapi/v1/exchangeInfo. Quoi qu'il en soit, faites-moi savoir si vous rencontrez toujours des difficultés.

@kroitor

voici le code complet:


import ccxt
import time

exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
    'apiKey': 'api',
    'secret': 'secret',
    'timeout': 30000,
    'enableRateLimit': True,
    # for futures
    'options': {
        'defaultType': 'future',
    },
})


def get_max_position_available():
    return exchange.fetchBalance().get('USDT').get('free')


while True:
    print(get_max_position_available())
    time.sleep(16*60)

voici la sortie:

/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/bin/python /Users/rs.gabriel/PycharmProjects/TvScrapper/Test/binance_API_test.py
0
Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 665, dans urlopen
httplib_response = self._make_request (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 421, dans _make_request
six.raise_from (e, Aucun)
Fichier "", ligne 3, dans rise_from
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 416, dans _make_request
httplib_response = conn.getresponse ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 1322, dans getresponse
response.begin ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 303, en début
version, statut, raison = self._read_status ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 264, dans _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", ligne 669, en lecture
retourne self._sock.recv_into (b)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1241, dans recv_into
retourne self.read (nbytes, tampon)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1099, en lecture
retourne self._sslobj.read (len, buffer)
ConnectionResetError: [Errno 54] Connexion réinitialisée par le pair

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", ligne 439, dans send
resp = conn.urlopen (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 719, dans urlopen
retries = retries.increment (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/util/retry.py", ligne 400, par incrément
lever six.reraise (type (erreur), erreur, _stacktrace)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/packages/six.py", ligne 734, en relance
augmenter la valeur. avec_traceback (tb)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 665, dans urlopen
httplib_response = self._make_request (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 421, dans _make_request
six.raise_from (e, Aucun)
Fichier "", ligne 3, dans rise_from
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", ligne 416, dans _make_request
httplib_response = conn.getresponse ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 1322, dans getresponse
response.begin ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 303, en début
version, statut, raison = self._read_status ()
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", ligne 264, dans _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", ligne 669, en lecture
retourne self._sock.recv_into (b)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1241, dans recv_into
retourne self.read (nbytes, tampon)
Fichier "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", ligne 1099, en lecture
retourne self._sslobj.read (len, buffer)
urllib3.exceptions.ProtocolError: ('Connection abandonnée.', ConnectionResetError (54, 'Connection reset by peer'))

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 538, en cours de récupération
réponse = self.session.request (
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", ligne 530, dans la requête
resp = self.send (prep, * send_kwargs)Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", ligne 643, dans sendr = adapter.send (requête, * kwargs)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", ligne 498, dans send
lever ConnectionError (err, request = request)
request.exceptions.ConnectionError: ('Connection abandonnée.', ConnectionResetError (54, 'Connection reset by peer'))

Lors de la gestion de l'exception ci-dessus, une autre exception s'est produite:

Traceback (dernier appel le plus récent):
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/binance_API_test.py", ligne 73, dans
impression (get_max_position_available ())
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/binance_API_test.py", ligne 69, dans get_max_position_available
return exchange.fetchBalance (). get ('USDT'). get ('gratuit')
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", ligne 556, dans fetch_balance
response = getattr (self, méthode) (requête)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 446, à l'intérieur
entrée de retour (_self, ** inner_kwargs)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", ligne 1813, dans la requête
response = self.fetch2 (chemin, api, méthode, paramètres, en-têtes, corps)
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 465, dans fetch2
return self.fetch (demande ['url'], demande ['méthode'], demande ['headers'], demande ['corps'])
Fichier "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", ligne 581, en cours de récupération
lever NetworkError (méthode + '' + url + '' + error_string)
ccxt.base.errors.NetworkError: GET https://fapi.binance.com/fapi/v1/account?timestamp=1586968784861&recvWindow=5000&signature=806ed79e0ade211c0f0592804db0512e93e9/account?timestamp=1586968784861&recvWindow=5000&signature=806ed79e0ade211c0f0592804db0512e93e9/account?timestamp=1586968784861&recvWindow=5000&signature=806ed79e0ade211c0f0592804db0512e93e9/account ? )

Processus terminé avec le code de sortie 1

Est-ce que je fais quelque chose de mal?

PS: si je change le sommeil à 60, ça marche

@ rs-g quelle est votre version de CCXT? (cela fonctionne pour moi avec les clés appropriées + la version la plus récente de la lib + python3.7)

@kroitor lorsque je vais à l'interpréteur de projet dans PyCharm, la version ccxt est 1.26.9 et la version Python est 3.8

Vous avez eu le même temps de sommeil que moi et vous avez eu 2 résultats dans une boucle raw in the while?

@ rs-g je veux dire la version d'exécution réelle:

import ccxt
import time

exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
    'apiKey': 'api',
    'secret': 'secret',
    'timeout': 30000,
    'enableRateLimit': True,
    # for futures
    'options': {
        'defaultType': 'future',
    },
})

def get_max_position_available():
    return exchange.fetchBalance().get('USDT').get('free')

print('CCXT version:', ccxt.__version__)  # ←--------------------- add this

while True:
    print(get_max_position_available())
    time.sleep(16*60)

Vous avez eu le même temps de sommeil que moi et vous avez eu 2 résultats dans une boucle raw in the while?

J'ai eu le même sommeil que vous, et maintenant il dort pendant 16 minutes (votre retard en particulier) avant de faire la deuxième itération de la boucle, donc je dois attendre un peu avant de pouvoir confirmer. Il a renvoyé la première réponse correctement lors de la première itération.

@ rs-g oui, il m'a renvoyé la deuxième réponse correctement:

mbp:python igorkroitor$ python3 test-binance-future-fetch-balance.py
0.0
0.0

Vous pouvez vérifier vos listes blanches d'adresses IP - la liste blanche d'adresses IP est-elle activée pour la paire de clés API en question? (les adresses IP sont configurables avec le site Web binance)

J'ai mis à jour le CCXT.

il imprime: version CCXT: 1.26.43

Je vais faire un autre test avec cette version, merci beaucoup pour votre résultat

J'ai l'IP sur la liste blanche parce que la première itération de while imprime le résultat correct

@ rs-g dans ce cas, je soupçonne PyCharm - essayez d'exécuter le même script en python pur dans la console, en dehors de PyCharm pour voir si cela fait une différence. Vous avez déjà essayé avec du python pur, mais c'était une erreur de connectivité différente en raison de l'indisponibilité de l'échange. Je veux dire réessayer en pur python à partir d'ici.

@ rs-g laissez-moi savoir si cela aide:

pip3 install certifi -U
pip3 install requests -U

?

@ rs-g d'autres personnes signalent également les mêmes problèmes ici: https://github.com/ccxt/ccxt/issues/6807 Et apparemment, ce n'est pas spécifique à python, cela se produit également en JavaScript. Donc, cela indique qu'un problème du côté de Binance persiste, s'il se brise dans toutes les langues à la fois.

@ rs-g lol, il s'est écrasé pour moi à la troisième itération en python pur:

mbp:python igorkroitor$ python3 test-binance-future-fetch-balance.py
0.0
0.0
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 839, in _validate_conn
    conn.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connection.py", line 344, in connect
    ssl_context=context)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/util/ssl_.py", line 344, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 412, in wrap_socket
    session=session
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 853, in _create
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: TLSV1_ALERT_INTERNAL_ERROR] tlsv1 alert internal error (_ssl.c:1056)

Je suggère de déplacer cette discussion ici: https://github.com/ccxt/ccxt/issues/6807 ← passons à la résolution de ce problème, c'est à nouveau le même problème de connectivité.

@kroitor, vous avez d'autres erreurs pas les mêmes que les miennes. Le vôtre est à cause du temps d'arrêt passé, je suppose

pip3 install certifi -U
demandes d'installation pip3 -U

Je l'ai déjà fait.

J'ai le même problème lorsque j'ai commencé le script avec du Python pur.

  1. succès de fetch_balance
  2. attendez 16 * 60 sec
  3. échec de fetch_balance

Je ne peux pas passer ces 16 minutes de sommeil, ça court toujours après le sommeil.

@ rs-g https://twitter.com/cz_binance/status/1250411130289152001

L'indisponibilité peut se manifester de différentes manières, y compris des messages d'erreur aléatoires en cas de panne. C'est vraiment un problème du côté de Binance. Nous devons simplement attendre qu'ils le résolvent.

@kroitor c'est trop étrange que j'obtienne cette erreur à chaque fois après le sommeil (16 minutes) et je n'obtiens aucune erreur si le sommeil est de 60 secondes, cela fonctionne parfaitement bien: |

Dois-je créer une autre instance si je n'utilise pas l'ancienne pendant 16 minutes?

@ rs-g

c'est trop étrange que j'obtienne cette erreur à chaque fois après le sommeil (16 minutes) et je n'obtiens aucune erreur si le sommeil est de 60 secondes, cela fonctionne parfaitement bien: |

Oui, c'est étrange, cependant, je ne peux pas expliquer cela autrement qu'avec un hasard aléatoire (comme 2 demandes de prise de contact sur 5 fonctionnent, les 3 autres demandes échouent, par exemple).

La première itération fonctionne pour moi la première fois, mais pas toujours.

Dois-je créer une autre instance si je n'utilise pas l'ancienne pendant 16 minutes?

Non. Vous devez réutiliser l'instance existante, comme vous le faites. En d'autres termes, votre code devrait fonctionner quel que soit le délai de mise en veille, car même si vous le supprimez complètement, vous avez activé le limiteur de débit intégré.

Le problème est lié au transport HTTPS sous-jacent, et il est très probablement causé par les seuils et les minuteries internes à l'intérieur de l'implémentation HTTPS, provenant d'une mauvaise réponse ou pas de réponse appropriée de l'échange en premier lieu.

@ rs-g

c'est trop étrange que j'obtienne cette erreur à chaque fois après le sommeil (16 minutes) et je n'obtiens aucune erreur si le sommeil est de 60 secondes, cela fonctionne parfaitement bien: |

En fait, cela peut s'expliquer assez facilement: si votre poignée de main réussit, la connexion établie est maintenue (l'option keep-alive est activée par défaut pendant quelques minutes par la pile OSI sous-jacente). Si vous continuez à envoyer des demandes, chaque nouvelle demande prolonge également la durée de vie de la connexion et maintient la connexion active. Cependant, si vous attendez 16 minutes, l'échange ou le client ou serveur TCP / HTTPS peut le supprimer. Ainsi, lors de votre deuxième appel, la poignée de main qui doit être refaite peut échouer. C'est pourquoi plusieurs demandes fréquentes et continues fonctionnent (si la négociation a réussi), mais certaines demandes occasionnelles rares peuvent échouer (cela est aléatoire car la binance n'est pas entièrement disponible pour les prises de contact SSL).

Pour vérifier la théorie, vous pouvez exécuter ceci:

import ccxt
import time

exchange_id = 'binance'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
    'apiKey': 'api',
    'secret': 'secret',
    'timeout': 30000,
    'enableRateLimit': True,
    # for futures
    'options': {
        'defaultType': 'future',
    },
})

def get_max_position_available():
    return exchange.fetchBalance().get('USDT').get('free')

while True:
    try:    # ←--------------------- add this
        print(get_max_position_available())
    except Exception as e:  # ←--------------------- add this
        print(e)  # print the error and retry on next iteration using the same exchange instance
    print('sleeping...')
    time.sleep(16*60)

↑ Si cela fonctionne d'abord, puis échoue, puis fonctionne à nouveau en boucle - cela prouve la théorie ci-dessus.

@kroitor a du sens, j'essaye ça.

Résultat:

0,0
en train de dormir...

GET https://fapi.binance.com/fapi/v1/account?timestamp=1586979168627&recvWindow=5000&signature=46135899f3e95ca8257eb41c3f1ab9f8bde972b5b03addf8557a7bb9 ',' Connexion interrompue (ECR) (ECR) ()
en train de dormir...

0,0
en train de dormir...

@ rs-g ouais, c'est exactement ce que nous pensions, non? Mais il semble qu'ils l'aient déjà résolu pour la plupart, vous voulez donc juste attendre un peu que les mises à jour se propagent dans le monde entier et atteignent votre FAI. https://twitter.com/cz_binance/status/1250432336774086660

@kroitor yep, merci beaucoup pour votre aide

Cette page vous a été utile?
0 / 5 - 0 notes