Ccxt: Binance Private API Problem

Erstellt am 6. Juni 2018  ·  40Kommentare  ·  Quelle: ccxt/ccxt

Hallo.
Ich habe versucht, eine Bestellung bei Binance aufzugeben, habe aber folgenden Fehler erhalten. Mein API-Schlüssel ist korrekt und alle Berechtigungen bereits erledigt.
Mein Code sieht aus wie

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

Und Fehler sehen aus wie:
equests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://api.binance.com/api/v3/openOrders?timestamp=1528282115226&recvWindow=5000&symbol=ETHBTC&signature=mysignature
und
ccxt.base.errors.ExchangeError: binance: unknown error code: {"code":-2014,"msg":"API-key format invalid."} -2014

question

Hilfreichster Kommentar

@kroitor Danke, ich habe das Problem gefunden, es geht um etwas, das mit der Zeitinkongruenz zusammenhängt. Ich habe diesen Code ausprobiert, jetzt funktioniert er.
ccxt.binance ({'options': {'adjustForTimeDifference': True}})

Alle 40 Kommentare

Mein API-Schlüssel ist korrekt

Binance sagt, dass Ihr apiKey-Format ungültig ist: {"code":-2014,"msg":"API-key format invalid."}

Also sollten Sie es wirklich zuerst überprüfen ...

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())

Funktioniert das mit Ihren Schlüsseln? Stellen Sie sicher, dass Sie den apiKey und das Geheimnis nicht verlegt haben. Stellen Sie außerdem sicher, dass beide Zeichen 64 Zeichen lang sind.

Es tut mir Leid. Das war mein Versagen.

@hexeraction thx für die Rückmeldung sowieso)

Ich bin auf das gleiche Problem gestoßen. Was ist die Lösung?

@ tye002

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

Stellen Sie sicher, dass Sie den apiKey und das Geheimnis nicht verlegt haben. Stellen Sie außerdem sicher, dass beide Zeichen 64 Zeichen lang sind.

@ tye002 Überprüfen apiKey (Großbuchstaben K , andere Buchstaben in Kleinbuchstaben) und secret (alle Buchstaben) sind Kleinbuchstaben).

@kroitor Danke, ich habe das Problem gefunden, es geht um etwas, das mit der Zeitinkongruenz zusammenhängt. Ich habe diesen Code ausprobiert, jetzt funktioniert er.
ccxt.binance ({'options': {'adjustForTimeDifference': True}})

@ tye002 Danke für die Rückmeldung!

Sie sagten jedoch, Sie hätten das gleiche Problem und die in dieser Ausgabe behandelte Fehlermeldung: {"code":-2014,"msg":"API-key format invalid."} entspricht keinen Fehlern mit Zeitunterschied. Es muss sich um einen anderen Fehler handeln, z. B. einen Signaturfehler, einen Nonce-Fehler oder eine zeitstempelbezogene Fehlermeldung. Wie auch immer, wir sind froh, dass Sie es herausgefunden haben.

@kroitor Richtig, es gab zwei Fehler, der andere

Ich erhalte den gleichen Fehler: {"code": - 2014, "msg": "API-Schlüsselformat ungültig."}.

Das Problem ist, dass ich den Fehler nicht immer bekomme, am Anfang funktioniert er, aber nach einiger Zeit gibt er diesen Fehler zurück.

Kann jemand mit einer Lösung helfen?

Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 665, in urlopen
httplib_response = self._make_request (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 421, in _make_request
six.raise_from (e, None)
Datei "", Zeile 3, in raise_from
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 416, in _make_request
httplib_response = conn.getresponse ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 1322, in getresponse
response.begin ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 303, am Anfang
Version, Status, Grund = self._read_status ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 264, in _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", Zeile 669, in readinto
return self._sock.recv_into (b)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1241, in recv_into
return self.read (nbytes, buffer)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1099, in read
return self._sslobj.read (len, buffer)
ConnectionResetError: [Errno 54] Verbindung durch Peer zurückgesetzt

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", Zeile 439, in send
resp = conn.urlopen (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 719, in urlopen
retries = retries.increment (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/util/retry.py", Zeile 400, inkrementell
erhöhen Sie six.reraise (Typ (Fehler), Fehler, _stacktrace)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/packages/six.py", Zeile 734, in reraise
erhöhe value.with_traceback (tb)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 665, in urlopen
httplib_response = self._make_request (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 421, in _make_request
six.raise_from (e, None)
Datei "", Zeile 3, in raise_from
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 416, in _make_request
httplib_response = conn.getresponse ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 1322, in getresponse
response.begin ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 303, am Anfang
Version, Status, Grund = self._read_status ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 264, in _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", Zeile 669, in readinto
return self._sock.recv_into (b)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1241, in recv_into
return self.read (nbytes, buffer)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1099, in read
return self._sslobj.read (len, buffer)
urllib3.exceptions.ProtocolError: ('Verbindung abgebrochen.', ConnectionResetError (54, 'Verbindung durch Peer zurückgesetzt'))

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 538, in Abruf
response = self.session.request (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", Zeile 530, auf Anfrage
resp = self.send (prep, * send_kwargs)Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", Zeile 643, in sendr = adapter.send (Anfrage, * kwargs)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", Zeile 498, in send
ConnectionError auslösen (err, request = request)
request.exceptions.ConnectionError: ('Verbindung abgebrochen.', ConnectionResetError (54, 'Verbindung durch Peer zurückgesetzt'))

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/Trading_TV_Binance.py", Zeile 594, in
btcAmountUsed = get_max_position_available ()
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/Trading_TV_Binance.py", Zeile 123, in get_max_position_available
to_use = float (exchange.fetch_balance (). get ('USDT'). get ('free'))
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", Zeile 556, in fetch_balance
response = getattr (self, method) (Abfrage)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 446, im Inneren
return entry (_self, ** inner_kwargs)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", Zeile 1813, auf Anfrage
response = self.fetch2 (Pfad, API, Methode, Parameter, Header, Body)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 465, in fetch2
return self.fetch (Anfrage ['url'], Anfrage ['Methode'], Anfrage ['Header'], Anfrage ['body'])
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 581, in Abruf
Erhöhen Sie NetworkError (Methode + '' + URL + '' + error_string)

@ rs-g Wie initialisierst du den Austausch? Haben Sie den Ratenbegrenzer aktiviert? Können Sie den kleinsten Code einfügen, um das Problem zu reproduzieren (ohne Ihre Schlüssel)?

@ Kroitor

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')

Wie gesagt, ich bekomme den Fehler nicht immer und kann ihn nicht reproduzieren. Ich bekomme den Fehler zu zufälligen Zeiten

@ rs-g

Dieser Fehler kann auf einen Netzwerkfehler auf der Clientseite hinweisen:

ConnectionResetError: [Errno 54] Verbindung durch Peer zurückgesetzt

Dies kann durch PyCharm verursacht werden, wenn Sie den Code über die IDE starten. Ist das der Fall? Wenn ja, können Sie mehrere Wiederholungsversuche durchführen, um es absichtlich auszulösen? Sie können auch mehrere Versuche ausführen, dasselbe Skript außerhalb von PyCharm (mit reinem Python) auszuführen, um festzustellen, ob dieser Fehler irgendwann auftritt.

Abgesehen davon kann es auch mit der Häufigkeit des Startens dieses Skripts zusammenhängen. Denn wenn der Fehler nach mehreren erfolgreichen Folgeversuchen ausgelöst wird, kann dies bedeuten, dass Sie das Ratenlimit nicht einhalten. Es hängt also auch davon ab, ob das Skript kontinuierlich mit derselben Exchange-Instanz arbeitet oder ob das Skript die Exchange-Instanz immer neu erstellt (wodurch die Ratenbegrenzung effektiv aufgehoben wird). Kurz gesagt, wie im Handbuch dokumentiert, versucht CCXT zunächst, die Liste der Märkte und Währungen bei Ihrem ersten Aufruf von der Börse auf eine einheitliche Methode wie fetch_balance zu laden. Wenn Sie dann dasselbe Skript neu starten - die alten Parameter für das Ratenlimit werden verworfen und die neue Exchange-Instanz erstellt, die die Märkte erneut lädt ... Wenn dies zu häufig vorkommt, blockiert Binance möglicherweise vorübergehend den Zugriff auf seine Endpunkte, um sich selbst zu schützen ein DDoS. Um dies zu vermeiden, können Sie dieselbe Exchange-Instanz wiederverwenden, ohne sie bei jedem Lauf zu löschen und neu zu erstellen.

Um Ihre Frage zu beantworten, benötigen wir viel mehr Details (viel mehr Informationen, alles, was Sie teilen können). Es kann auch hilfreich sein, sich an den technischen Support von Binance zu wenden, da diese besser wissen, ob sie Sie gelegentlich aus irgendeinem Grund blockiert haben.

@ Kroitor

Ja, ich habe PyCharm verwendet, aber ich habe es mit reinem Python versucht und habe den gleichen Fehler erhalten

Ich habe es geschafft, den obigen Fehler mit diesem Code zu reproduzieren:

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


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

Und jetzt bekomme ich noch einen Fehler:

ccxt.base.errors.ExchangeError: GET https://fapi.binance.com/fapi/v1/exchangeInfo HTTPSConnectionPool (host = 'fapi.binance.com', port = 443): Maximale Wiederholungsversuche mit URL überschritten: / fapi / v1 / exchangeInfo (verursacht durch NewConnectionError (': Fehler beim Herstellen einer neuen Verbindung: [Errno 8] Knotenname oder Servname angegeben oder nicht bekannt '))

und ich kann nicht auf binance.com zugreifen

@ rs-g es sieht nach einem Problem auf der Seite von binance aus, ich kann diese URL auch nicht auf meinem Computer öffnen ... Muss ein vorübergehender Fehler sein oder so. Ich kann bestätigen, dass es momentan nicht verfügbar ist.

@ Kroitor danke für die Unterstützung.

Was ist mit meinem obigen Code? Wenn ich etwas länger warte, ohne beim Austausch etwas zu unternehmen. und dann versuche auszutauschen.fetchBalance Ich bekomme diesen Fehler von meinem ersten Beitrag.

Irgendwelche Gedanken?

@ rs-g es schlägt aufgrund dieses anderen internen Fehlers fehl, es ist eine Kaskade von Fehlern, die in erster Linie durch die Nichtverfügbarkeit der Märkte ausgelöst wird. Also, fetch_balance ruft load_markets (wenn Märkte und Währungen noch nicht geladen sind), und wenn load_markets fehlschlägt - fetch_balance wird ebenfalls fehlschlagen. Die Markt- / Währungsinformationen werden benötigt, um Währungscodes, Symbole und Umtauschantwortformate ordnungsgemäß zu vereinheitlichen. Wenn die Exchange-API also nicht voll funktionsfähig ist, kann der Fehler auf Verbindungsprobleme hinweisen.

@ Kroitor Ich werde umformulieren,

Ich habe diesen Code ausprobiert, als binance funktionierte:

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


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

Ich habe folgendes Ergebnis erhalten:

Beim ersten Eintritt in die while-Schleife gab test () die richtige Balance zurück
Warten Sie dann 16 * 60 Sekunden
Wenn es dann zu test () geht, habe ich diesen Fehler https://github.com/ccxt/ccxt/issues/3057#issuecomment -613920422 erhalten

@ rs-g hast du im Moment den gleichen Fehler? Denn wenn der Austausch nicht vollständig verfügbar ist, kann eine Anforderung erfolgreich sein und die andere kann zufällig fehlschlagen.
Mit anderen Worten - ist es auf Ihrer Seite in genau dieser Reihenfolge reproduzierbar? ↓

  1. Erfolg von fetch_balance
  2. Warten Sie 16 * 60 Sek
  3. Fehler von fetch_balance

@ kroitor im Moment kann ich es überhaupt nicht testen, da binance nicht zugänglich ist. Ich werde es versuchen, wenn es wieder online geht.

Aber der letzte Arbeitstest (bevor die Binance sank) war folgender:

  1. Erfolg von fetch_balance
  2. Warten Sie 16 * 60 Sek
  3. Fehler von fetch_balance

@ rs-g ok, lass es mich wissen, wenn du es nach einer Weile reproduzieren kannst, ich werde es untersuchen. Leider kann ich es jetzt aufgrund der nicht verfügbaren API nicht debuggen. Ich vermute ein Problem mit der TMP-Konnektivität auf Binances Seite. Wenn es nach einer Weile nicht verschwindet, melden Sie sich bitte zurück. Danke!

@ rs-g sieht aus, als wäre es wieder aktiv. Ich bin mir jedoch nicht sicher, ob es stabilisiert ist: https://fapi.binance.com/fapi/v1/exchangeInfo. Wie auch immer, lassen Sie es mich wissen, wenn Sie immer noch Schwierigkeiten damit haben.

@ Kroitor

Hier ist der vollständige Code:


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)

Hier ist die Ausgabe:

/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/bin/python /Users/rs.gabriel/PycharmProjects/TvScrapper/Test/binance_API_test.py
0
Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 665, in urlopen
httplib_response = self._make_request (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 421, in _make_request
six.raise_from (e, None)
Datei "", Zeile 3, in raise_from
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 416, in _make_request
httplib_response = conn.getresponse ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 1322, in getresponse
response.begin ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 303, am Anfang
Version, Status, Grund = self._read_status ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 264, in _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", Zeile 669, in readinto
return self._sock.recv_into (b)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1241, in recv_into
return self.read (nbytes, buffer)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1099, in read
return self._sslobj.read (len, buffer)
ConnectionResetError: [Errno 54] Verbindung durch Peer zurückgesetzt

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", Zeile 439, in send
resp = conn.urlopen (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 719, in urlopen
retries = retries.increment (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/util/retry.py", Zeile 400, inkrementell
erhöhen Sie six.reraise (Typ (Fehler), Fehler, _stacktrace)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/packages/six.py", Zeile 734, in reraise
erhöhe value.with_traceback (tb)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 665, in urlopen
httplib_response = self._make_request (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 421, in _make_request
six.raise_from (e, None)
Datei "", Zeile 3, in raise_from
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", Zeile 416, in _make_request
httplib_response = conn.getresponse ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 1322, in getresponse
response.begin ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 303, am Anfang
Version, Status, Grund = self._read_status ()
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/http/client.py", Zeile 264, in _read_status
line = str (self.fp.readline (_MAXLINE + 1), "iso-8859-1")
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/socket.py", Zeile 669, in readinto
return self._sock.recv_into (b)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1241, in recv_into
return self.read (nbytes, buffer)
Datei "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ssl.py", Zeile 1099, in read
return self._sslobj.read (len, buffer)
urllib3.exceptions.ProtocolError: ('Verbindung abgebrochen.', ConnectionResetError (54, 'Verbindung durch Peer zurückgesetzt'))

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 538, in Abruf
response = self.session.request (
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", Zeile 530, auf Anfrage
resp = self.send (prep, * send_kwargs)Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/sessions.py", Zeile 643, in sendr = adapter.send (Anfrage, * kwargs)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/requests/adapters.py", Zeile 498, in send
ConnectionError auslösen (err, request = request)
request.exceptions.ConnectionError: ('Verbindung abgebrochen.', ConnectionResetError (54, 'Verbindung durch Peer zurückgesetzt'))

Während der Behandlung der obigen Ausnahme ist eine weitere Ausnahme aufgetreten:

Traceback (letzter Anruf zuletzt):
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/binance_API_test.py", Zeile 73, in
print (get_max_position_available ())
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/Test/binance_API_test.py", Zeile 69, in get_max_position_available
return exchange.fetchBalance (). get ('USDT'). get ('free')
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", Zeile 556, in fetch_balance
response = getattr (self, method) (Abfrage)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 446, im Inneren
return entry (_self, ** inner_kwargs)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/binance.py", Zeile 1813, auf Anfrage
response = self.fetch2 (Pfad, API, Methode, Parameter, Header, Body)
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 465, in fetch2
return self.fetch (Anfrage ['url'], Anfrage ['Methode'], Anfrage ['Header'], Anfrage ['body'])
Datei "/Users/rs.gabriel/PycharmProjects/TvScrapper/venv/lib/python3.8/site-packages/ccxt/base/exchange.py", Zeile 581, in Abruf
Erhöhen Sie NetworkError (Methode + '' + URL + '' + error_string)
ccxt.base.errors.NetworkError: GET https://fapi.binance.com/fapi/v1/account?timestamp=1586968784861&recvWindow=5000&signature=806ed79e0ade211c0f0592804db0512e93e8df8 )

Prozess mit Exit-Code 1 beendet

Mache ich etwas falsch?

PS: Wenn ich den Schlaf auf 60 ändere, funktioniert es

@ rs-g Was ist deine Version von CCXT? (Es funktioniert bei mir mit den richtigen Schlüsseln + der neuesten Version von lib + python3.7)

@kroitor Wenn ich in PyCharm zum Projektinterpreter gehe, ist die ccxt-Version 1.26.9 und die Python-Version 3.8

Sie hatten die gleiche Schlafzeit wie ich und Sie hatten 2 Ergebnisse in einer rohen in der while-Schleife?

@ rs-g Ich meine die aktuelle Laufzeitversion:

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)

Sie hatten die gleiche Schlafzeit wie ich und Sie hatten 2 Ergebnisse in einer rohen in der while-Schleife?

Ich hatte den gleichen Schlaf wie Sie und jetzt schläft er 16 Minuten (speziell Ihre Verzögerung), bevor er die zweite Iteration der Schleife durchführt, also muss ich etwas warten, bevor ich bestätigen kann. Die erste Antwort wurde bei der ersten Iteration ordnungsgemäß zurückgegeben.

@ rs-g ja, es hat mir die zweite Antwort richtig zurückgegeben:

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

Möglicherweise möchten Sie Ihre IP-Adress-Whitelists überprüfen. Ist die IP-Whitelist für das betreffende API-Schlüsselpaar aktiviert? (Die IPs können mit der binance-Website konfiguriert werden.)

Ich habe den CCXT aktualisiert.

es druckt: CCXT-Version: 1.26.43

Ich werde noch einen Test mit dieser Version machen, vielen Dank für Ihr Ergebnis

Ich habe die IP-Whitelist, weil die erste Iteration von while das richtige Ergebnis druckt

@ rs-g in diesem Fall vermute ich PyCharm - versuchen Sie, dasselbe Skript in reinem Python in der Konsole außerhalb von PyCharm auszuführen, um festzustellen, ob es einen Unterschied macht. Sie haben es bereits mit reinem Python versucht, aber das war ein anderer Konnektivitätsfehler, da der Austausch nicht verfügbar war. Ich meine, von hier aus noch einmal in reiner Python versuchen.

@ rs-g lass es mich wissen, wenn dies hilft:

pip3 install certifi -U
pip3 install requests -U

?

@ rs-g Andere Leute melden die gleichen Probleme auch hier: https://github.com/ccxt/ccxt/issues/6807 Und anscheinend ist es nicht pythonspezifisch, es passiert auch in JavaScript. Dies deutet darauf hin, dass ein Problem auf Binances Seite immer noch besteht, wenn es in allen Sprachen gleichzeitig funktioniert.

@ rs-g lol, es stürzte für mich bei der dritten Iteration in reinem Python ab:

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)

Ich schlage vor, diese Diskussion hierher zu verschieben: https://github.com/ccxt/ccxt/issues/6807 ← Fahren wir mit der Lösung dieses Problems fort. Es handelt sich wieder um dasselbe Konnektivitätsproblem.

@ Kroitor ihr habt andere Fehler, die nicht mit meinen identisch sind. Ihre ist wegen der Binance vergangener Ausfallzeiten, denke ich

pip3 install certifi -U
pip3 Installationsanforderungen -U

Ich habe das schon gemacht.

Ich habe das gleiche Problem, als ich das Skript mit reinem Python gestartet habe.

  1. Erfolg von fetch_balance
  2. Warten Sie 16 * 60 Sek
  3. Fehler von fetch_balance

Ich komme nicht über diese 16 Minuten Schlaf hinaus, es jagt immer nach dem Schlaf.

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

Die Nichtverfügbarkeit kann sich auf viele verschiedene Arten manifestieren, einschließlich zufälliger Fehlermeldungen bei einer Panne. Dies ist wirklich ein Problem auf Binances Seite. Wir müssen nur warten, bis sie es gelöst haben.

@kroitor es ist einfach zu seltsam, dass ich diesen Fehler jedes Mal nach dem Schlafengehen bekomme (16 Minuten) und ich bekomme keinen Fehler, wenn der Schlaf 60 Sekunden beträgt, es funktioniert einwandfrei: |

Muss ich eine andere Instanz erstellen, wenn ich die alte 16 Minuten lang nicht verwende?

@ rs-g

Es ist einfach zu seltsam, dass ich diesen Fehler jedes Mal nach dem Schlafengehen (16 Minuten) bekomme und keinen Fehler bekomme, wenn der Schlaf 60 Sekunden beträgt. Es funktioniert einwandfrei: |

Ja, das ist seltsam, aber ich kann das nicht anders als mit zufälliger Wahrscheinlichkeit erklären (wie 2 von 5 Handshake-Anfragen funktionieren, andere 3 Anfragen schlagen beispielsweise fehl).

Die erste Iteration funktioniert beim ersten Mal für mich, aber nicht immer.

Muss ich eine andere Instanz erstellen, wenn ich die alte 16 Minuten lang nicht verwende?

Nein. Sie sollten die vorhandene Instanz wie Sie wiederverwenden. Mit anderen Worten, Ihr Code sollte unabhängig vom Ruhezeitlimit funktionieren, denn selbst wenn Sie ihn vollständig entfernen, ist der integrierte Ratenbegrenzer aktiviert.

Das Problem hängt mit dem zugrunde liegenden HTTPS-Transport zusammen und wird höchstwahrscheinlich durch die internen Schwellenwerte und Zeitgeber in der HTTPS-Implementierung verursacht, die von einer schlechten Antwort oder gar keiner richtigen Antwort des Austauschs herrühren.

@ rs-g

Es ist einfach zu seltsam, dass ich diesen Fehler jedes Mal nach dem Schlafengehen (16 Minuten) bekomme und keinen Fehler bekomme, wenn der Schlaf 60 Sekunden beträgt. Es funktioniert einwandfrei: |

Eigentlich kann es ziemlich einfach erklärt werden: Wenn Ihr Handshake erfolgreich ist, wird die hergestellte Verbindung am Leben gehalten (die Option Keep-Alive wird vom zugrunde liegenden OSI-Stack standardmäßig für einige Minuten aktiviert). Wenn Sie dann weiterhin Anforderungen senden, verlängert jede neue Anforderung auch die Lebensdauer der Verbindung und hält die Verbindung am Leben. Wenn Sie jedoch 16 Minuten warten, kann der Exchange oder der TCP / HTTPS-Client oder -Server ihn löschen. Bei Ihrem zweiten Anruf kann der Handshake, der erneut ausgeführt werden muss, fehlschlagen. Aus diesem Grund funktionieren mehrere fortlaufende häufige Anforderungen (wenn der Handshake erfolgreich war), aber einige seltene gelegentliche Anforderungen können fehlschlagen (dies ist zufällig, da die Binanz für SSL-Handshakes nicht vollständig verfügbar ist).

Um die Theorie zu überprüfen, können Sie Folgendes ausführen:

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)

↑ Wenn es zuerst funktioniert, dann fehlschlägt, dann wieder in einer Schleife funktioniert - das beweist die obige Theorie.

@ rs-g ja, genau das haben wir uns gedacht, oder? Aber es scheint, dass sie es größtenteils bereits behoben haben, also möchten Sie nur ein bisschen warten, bis sich die Updates über den Globus verbreiten und Ihren ISP erreichen. https://twitter.com/cz_binance/status/1250432336774086660

@ Kroitor

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen