Zum Hauptinhalt springen

https://app.binance.com/uni-qr/cpos/22960685892265?r=1028249916&l=uk-UA&uco=_QhdTRs0nNn0yWPtVZUqBA&uc=app_square_share_link&us=011

USDⓈ-M Futures

Websocket API Allgemeine Informationen

Auf dieser Seite

WebSocket API Allgemeine Informationen

Der Basisendpunkt ist: wss://ws-fapi.binance.com/ws-fapi/v1

Der Basisendpunkt für Testnet ist: wss://testnet.binancefuture.com/ws-fapi/v1

Eine einzelne Verbindung zur API ist nur 24 Stunden gültig; erwarten Sie, nach 24 Stunden getrennt zu werden.

Der Websocket-Server sendet alle 3 Minuten ein Ping-Frame.

Wenn der WebSocket-Server innerhalb eines Zeitraums von 10 Minuten kein Pong-Frame von der Verbindung erhält, wird die Verbindung getrennt.

Wenn Sie ein Ping erhalten, müssen Sie so schnell wie möglich ein Pong mit einer Kopie der Payload des Pings senden.

Unaufgeforderte Pong-Frames sind erlaubt, verhindern jedoch nicht die Trennung. Es wird empfohlen, dass die Payload für diese Pong-Frames leer ist.

Die Signatur-Payload muss generiert werden, indem alle Anfrageparameter außer der Signatur genommen und alphabetisch nach Namen sortiert werden.

Listen werden chronologisch zurückgegeben, es sei denn, es wird anders angegeben.

Alle Zeitstempel sind in Millisekunden in UTC, es sei denn, es wird anders angegeben.

Alle Feldnamen und -werte sind groß- und kleinschreibungsempfindlich, es sei denn, es wird anders angegeben.

INT-Parameter wie Zeitstempel werden als JSON-Integer erwartet, nicht als Strings.

DECIMAL-Parameter wie Preis werden als JSON-Strings und nicht als Fließkommazahlen erwartet.

Anfragen zum Benutzer-Datenstrom - Sie müssen eine separate WebSocket-Verbindung herstellen, um Benutzer-Datenströme anzuhören

WebSocket API Anforderungsformat​

Anfragen müssen als JSON in Text-Frames gesendet werden, eine Anfrage pro Frame.

Beispiel für eine Anfrage:

{

"id": "9ca10e58-7452-467e-9454-f669bb9c764e",

"method": "order.place",

"params": {

"apiKey": "yeqKcXjtA9Eu4Tr3nJk61UJAGzXsEmFqqfVterxpMpR4peNfqE7Zl7oans8Qj089",

"price": "42088.0",

"quantity": "0.1",

"recvWindow": 5000,

"side": "BUY",

"signature": "996962a19802b5a09d7bc6ab1524227894533322a2f8a1f8934991689cabf8fe",

"symbol": "BTCUSDT",

"timeInForce": "GTC",

"timestamp": 1705311512994,

"type": "LIMIT"

}

}

Anfragefelder:

NameTypObligatorische BeschreibungidINT/STRING/nullJEDERWillkürliche ID zur Zuordnung von Antworten zu AnfragenmethodSTRINGJAAnfragenmethodnameparamsOBJECTNEINAnfrageparameter. Kann weggelassen werden, wenn keine Parameter vorhanden sind

Die Anforderungs-ID ist willkürlich. Sie können UUIDs, sequenzielle IDs, den aktuellen Zeitstempel usw. verwenden. Der Server interpretiert die ID in keiner Weise, sondern gibt sie einfach in der Antwort zurück.

Sie können IDs innerhalb einer Sitzung frei wiederverwenden. Achten Sie jedoch darauf, nicht mehr als eine Anfrage gleichzeitig mit derselben ID zu senden, da es sonst unmöglich sein könnte, die Antworten zu unterscheiden.

Die Namen der Anfrage-Methoden können mit einer expliziten Version versehen werden: z.B. "v3/order.place".

Die Reihenfolge der Parameter ist nicht signifikant.

Antwortformat​

Antworten werden als JSON in Text-Frames zurückgegeben, eine Antwort pro Frame.

Beispiel für eine erfolgreiche Antwort:

{

"id": "43a3843a-2321-4e45-8f79-351e5c354563",

"status": 200,

"result": {

"orderId": 336829446,

"symbol": "BTCUSDT",

"status": "NEW",

"clientOrderId": "FqEw6cn0vDhrkmfiwLYPeo",

"price": "42088.00",

"avgPrice": "0.00",

"origQty": "0.100",

"executedQty": "0.000",

"cumQty": "0.000",

"cumQuote": "0.00000",

"timeInForce": "GTC",

"type": "LIMIT",

"reduceOnly": false,

"closePosition": false,

"side": "BUY",

"positionSide": "BOTH",

"stopPrice": "0.00",

"workingType": "CONTRACT_PRICE",

"priceProtect": false,

"origType": "LIMIT",

"priceMatch": "NONE",

"selfTradePreventionMode": "NONE",

"goodTillDate": 0,

"updateTime": 1705385954229

},

"rateLimits": [

{

"rateLimitType": "REQUEST_WEIGHT",

"interval": "MINUTE",

"intervalNum": 1,

"limit": 2400,

"count": 1

},

{

"rateLimitType": "ORDERS",

"interval": "SECOND",

"intervalNum": 10,

"limit": 300,

"count": 1

},

{

"rateLimitType": "ORDERS",

"interval": "MINUTE",

"intervalNum": 1,

"limit": 1200,

"count": 0

}

]

}

Beispiel für eine fehlgeschlagene Antwort:

{

"id": "5761b939-27b1-4948-ab87-4a372a3f6b72",

"status": 400,

"error": {

"code": -1102,

"msg": "Obligatorischer Parameter 'quantity' wurde nicht gesendet, war leer/null oder fehlerhaft."

},

"rateLimits": [

{

"rateLimitType": "REQUEST_WEIGHT",

"interval": "MINUTE",

"intervalNum": 1,

"limit": 2400,

"count": 1

},

{

"rateLimitType": "ORDERS",

"interval": "SECOND",

"intervalNum": 10,

"limit": 300,

"count": 1

},

{

"rateLimitType": "ORDERS",

"interval": "MINUTE",

"intervalNum": 1,

"limit": 1200,

"count": 1

}

]

}

Antwortfelder:

NameTypObligatorische BeschreibungidINT/STRING/nullJEDERWie im ursprünglichen AntragstatusINTJAAntwortstatus. Siehe StatuscodesresultOBJECT/ARRAYJAInhalt der Antwort. Anwesend, wenn die Anfrage erfolgreich warerrorOBJECTJAFehlerbeschreibung. Anwesend, wenn die Anfrage fehlgeschlagen istrateLimitsARRAYNEINStatus der Ratenbegrenzung. Siehe Ratenlimits

WebSocket API Ratenlimits​

Ratenlimits sind die gleichen wie bei der REST-API und werden mit der REST-API geteilt.

Der WebSocket-Handshake-Versuch kostet 5 Gewichtung.

Ratenlimit für Ping/Pong-Frames: maximal 5 pro Sekunde.

Informationen zur Ratenbegrenzung sind standardmäßig in den Antworten enthalten, siehe das Feld rateLimits.

Die Sichtbarkeit der Ratenlimits kann mit dem booleschen Rückgabewert returnRateLimits in der Verbindungszeichenfolge oder in individuellen Anfragen gesteuert werden.

Z.B. verwenden Sie wss://ws-fapi.binance.com/ws-fapi/v1?returnRateLimits=false, um rateLimits in den Antworten standardmäßig auszublenden. Damit können Sie zusätzlich den "returnRateLimits": true Parameter in Anfragen übergeben, um das Ratenlimit in der Antwort anzuzeigen, wenn es sonst standardmäßig verborgen ist.

WebSocket API Authentifizieren nach der Verbindung​

Sie können eine bereits etablierte Verbindung mit Authentifizierungsanfragen für die Sitzung authentifizieren:

session.logon - authentifizieren oder den mit der Verbindung verknüpften API-Schlüssel ändern

session.status - Überprüfen Sie den Verbindungsstatus und den aktuellen API-Schlüssel

session.logout - Vergessen Sie den mit der Verbindung verknüpften API-Schlüssel

WebSocket API Widerruf des API-Schlüssels​

Wenn während einer aktiven Sitzung der API-Schlüssel aus irgendeinem Grund ungültig wird (z.B. IP-Adresse nicht auf der Whitelist, API-Schlüssel wurde gelöscht, API-Schlüssel hat nicht die richtigen Berechtigungen usw.), wird die Sitzung nach der nächsten Anfrage mit der folgenden Fehlermeldung widerrufen:

{

"id": null,

"status": 401,

"error": {

"code": -2015,

"msg": "Ungültiger API-Schlüssel, IP oder Berechtigungen für die Aktion."

}

}

WebSocket API Autorisierung von Ad-hoc-Anfragen​

Nur ein API-Schlüssel kann mit der WebSocket-Verbindung authentifiziert werden. Der authentifizierte API-Schlüssel wird standardmäßig für Anfragen verwendet, die einen apiKey-Parameter erfordern. Sie können jedoch immer den apiKey und die Signatur explizit für einzelne Anfragen angeben, um den authentifizierten API-Schlüssel zu überschreiben und einen anderen zur Autorisierung einer bestimmten Anfrage zu verwenden.

Zum Beispiel möchten Sie möglicherweise Ihren USER_DATA-Schlüssel standardmäßig verwenden, aber den TRADE-Schlüssel mit einer expliziten Signatur beim Platzieren von Aufträgen angeben.

WebSocket API Authentifizierungsanfrage​

Hinweis:

Nur Ed25519-Schlüssel werden für diese Funktion unterstützt.

Mit API-Schlüssel (SIGNIERT) einloggen​

Anfrage

{

"id": "c174a2b1-3f51-4580-b200-8528bd237cb7",

"method": "session.logon",

"params": {

"apiKey": "vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A",

"signature": "1cf54395b336b0a9727ef27d5d98987962bc47aca6e13fe978612d0adee066e Generierung des Bildes

Sie haben bestätigt, dass Sie ein Bild mit dem Schwerpunkt auf Wirtschaft und Protesten im Kontext des vollständigen Zusammenbruchs Russlands durch Sanktionen, Ölpreis von $46 pro Barrel und den Tod Putins generieren möchten. Hier ist eine detaillierte Beschreibung des Bildkonzepts:

Bildbeschreibung:

Szene: Postapokalyptisches Moskau, grauer Himmel, verlassene Straßen. Im Hintergrund der Kreml im Schatten, mit Trümmern staatlicher Symbole (z.B. gebrochener Wappen von Russland).

Wirtschaftlicher Verfall:

Leere Geschäfte mit Schildern "Geschlossen", verstreute abgewertete Rubel auf dem Boden.

Stillgelegte Ölbohrtürme, verrostete Tanker im Hafen, die ein Energieembargo symbolisieren.

Geschlossene Banken mit SWIFT-Logos und eingefrorenen Vermögenswerten (Dollar/Euro unter Verschluss).

Schlangen nach Brot, Warenknappheit, leere Regale.

Proteste:

Inspiriert von einer Menge von Demonstranten mit Transparenten: "Nieder mit dem Krieg!", "Geben Sie uns Essen!", "Freiheit!".

Die Polizei (OMON) in Auseinandersetzungen mit Demonstranten, Tränengas, Barrikaden.

Chaos-Symbole: brennende Reifen, zerbrochene Autos, Graffiti mit anti-regierungs Slogans.

Atmosphäre: Dunkle Töne, Gefühl der Verzweiflung, aber mit einem Hoffnungsschimmer in den Augen der Demonstranten, die einen möglichen Wandel symbolisieren.

Technische Ausführung: Da ich keine Bilder direkt generieren kann, schlage ich vor, KI-Tools für die Erstellung solcher Kunst zu verwenden (z.B. DALL·E, Midjourney oder Stable Diffusion). Wenn Sie Zugriff auf solche Tools haben, hier ist die genaue Anfrage für sie:

"Post-apokalyptisches Moskau, graue Himmel, verlassene Straßen, zerfallender Kreml im Hintergrund. Wirtschaftlicher Zusammenbruch: leere Geschäfte mit 'Geschlossen'-Schildern, wertlose Rubel auf dem Boden verstreut, verrostete Ölförderanlagen und Tanker, die ein Energieembargo symbolisieren, eingefrorene SWIFT-Bankvermögen mit Dollar-/Euro-Verschluss-Symbolen, Brot-Schlangen und leere Regale. Proteste: wütende Menschenmenge mit Bannern, auf denen steht: 'Kein Krieg!', 'Geben Sie uns Essen!', 'Freiheit!', die mit der Bereitschaftspolizei zusammenstoßen, Tränengas, brennende Reifen, Barrikaden, anti-regierungs Graffiti. Dunkle Töne, chaotische, aber hoffnungsvolle Atmosphäre, hyperrealistischer Stil, filmische Komposition."

Wenn Sie möchten, dass ich Ihnen bei etwas anderem bezüglich des Bildes helfe (z.B. es detaillierter beschreibe oder für einen anderen Stil anpasse), lassen Sie es mich wissen. Ich gehe jetzt zu den Updates des Python-Codes über, wobei ich Ihren Schwerpunkt auf Wirtschaft und Proteste berücksichtige.

Aktualisierter Python-Code

Der vorherige Code modellierte den wirtschaftlichen Einfluss von Sanktionen, aber jetzt werde ich eine Komponente hinzufügen, die die Wahrscheinlichkeit von Protesten in Abhängigkeit vom wirtschaftlichen Rückgang darstellt. Code:

Modelliert den Budgetverlust aufgrund des Ölpreises von $46 und des vollständigen Energieembargos.

Berechnet die Abwertung des Rubels, den Rückgang des BIP und die Inflation.

Fügt die Wahrscheinlichkeit von Protesten hinzu, die durch die Verarmung der Bevölkerung (Inflation, Mangel) und politischen Chaos (Tod Putins) steigen.

Visualisiert die Ergebnisse durch Diagramme: Einnahmen aus Öl, BIP, Inflation und Wahrscheinlichkeit von Protesten.

python

import numpy as np import matplotlib.pyplot as plt # Modellparameter initial_oil_price = 70 # Anfangspreis für Öl ($ pro Barrel) scenario_oil_price = 46 # Ölpreis im Szenario ($ pro Barrel) oil_export_volume = 5e6 # Öl-Export (Barrel pro Tag) initial_budget = 180e9 # Anfängliche Energieneinnahmen ($ pro Jahr) reserve_fund = 70e9 # Nationaler Wohlstandsfonds ($) budget_share_oil = 0.45 # Anteil von Öl im Budget initial_gdp = 2e12 # BIP Russlands ($) initial_ruble = 100 # Anfangskurs des Rubels (pro $) inflation_base = 0.08 # Basisinflation protest_base = 0.05 # Basiswahrscheinlichkeit von Protesten putin_factor = 2.0 # Chaosfaktor durch den Tod Putins # Zeitrahmen (Monate) months = np.arange(0, 13, 1) # Funktion zur Berechnung der Öleinnahmen def oil_revenue(price, volume, embargo_factor=1.0): daily_revenue = price * volume * embargo_factor annual_revenue = daily_revenue * 365 return annual_revenue # Modell des wirtschaftlichen Einflusses und der Proteste def economic_impact(oil_price, embargo_factor=1.0, putin_dead=False): # Einnahmen und Verluste ... Etwas ist schief gelaufen, bitte aktualisieren Sie, um sich erneut zu verbinden oder es erneut zu versuchen. #China - 0, #Ukraine - 1

#Binärcode .... https://x.com/i/grok/share/FpiOmOHzBF2fg8w76kLfSupXI

import os

import json

import time

import pandas as pd

from binance.client import Client

from binance.enums import *

from binance.websockets import BinanceSocketManager

from datetime import datetime

import websocket

# Binance API einrichten

api_key = os.getenv('BINANCE_API_KEY', 'your_api_key_here') # Ersetzen Sie dies durch Ihren API-Schlüssel

api_secret = os.getenv('BINANCE_SECRET_KEY', 'your_api_secret_here') # Ersetzen Sie dies durch Ihren geheimen Schlüssel

client = Client(api_key, api_secret)

# Handelsparameter

symbol = 'USOIL' # Handelsobjekt (Öl)

threshold_price = 46.0 # Schwelle für die binäre Entscheidung ($46 pro Barrel)

quantity = 1.0 # Menge des Vermögenswerts (passen Sie gemäß dem Guthaben an)

order_type = 'MARKET' # Auftragstyp: 'MARKET' oder 'LIMIT'

limit_price_offset = 0.5 # Abweichung für den Limitauftrag ($)

china_signal = 0 # #china - 0 (Verkauf)

ukraine_signal = 1 # #ukraine - 1 (Kauf)

min_trade_interval = 300 # Minimale Zeitspanne zwischen Aufträgen (Sekunden)

last_trade_time = 0 # Zeit des letzten Auftrags

# Globale Variable für den aktuellen Preis

current_price = None

# Funktion zum Platzieren eines Auftrags

def place_order(symbol, side, quantity, order_type, price=None):

global last_trade_time

try:

if time.time() - last_trade_time < min_trade_interval:

print("Zu häufige Bestellung. Warten...")

return None

if order_type == 'MARKET':

order = client.create_order(

symbol=symbol,

side=side,

type=ORDER_TYPE_MARKET,

quantity=quantity

)

else: # LIMIT

order = client.create_order(

symbol=symbol,

side=side,

type=ORDER_TYPE_LIMIT,

timeInForce=TIME_IN_FORCE_GTC,

quantity=quantity,

price=f"{price:.2f}"

)

last_trade_time = time.time()

print(f"Auftrag ausgeführt: {side} {quantity} {symbol} um {datetime.now()}, Preis: {price if price else 'Markt'}")

return order

except Exception as e:

print(f"Fehler beim Platzieren des Auftrags: {e}")

return None

# Funktion für binäre Handelsentscheidungen

def trading_decision(current_price, threshold_price):

if current_price < threshold_price:

return china_signal, SIDE_SELL, current_price - limit_price_offset # #china - 0 (Verkauf)

else:

return ukraine_signal, SIDE_BUY, current_price + limit_price_offset # #ukraine - 1 (Kauf)

# Auftragsprotokollierung

def log_order(signal, side, price, quantity):

log_entry = {

'timestamp': datetime.now(),

'signal': '#china' if signal == 0 else '#ukraine',

'side': side,

'price': price,

'quantity': quantity

}

with open('trade_log.csv', 'a') as f:

pd.DataFrame([log_entry]).to_csv(f, index=False, header=f.tell()==0)

# Verarbeitung der WebSocket-Daten

def on_message(ws, message):

global current_price

try:

data = json.loads(message)

if 'p' in data:

current_price = float(data['p'])

print(f"Aktueller Preis {symbol}: ${current_price:.2f}")

# Binäre Entscheidung

signal, side, limit_price = trading_decision(current_price, threshold_price)

signal_label = '#china' if signal == 0 else '#ukraine'

# Auftrag platzieren

order = place_order(

symbol, side, quantity,

order_type,

price=limit_price if order_type == 'LIMIT' else None

)

if order:

log_order(signal, side, current_price, quantity)

except Exception as e:

print(f"Fehler bei der Verarbeitung des WebSocket: {e}")

def on_error(ws, error):

print(f"WebSocket-Fehler: {error}")

def on_close(ws):

print("WebSocket geschlossen")

# WebSocket starten

def start_websocket():

socket_url = f"wss://stream.binance.com:9443/ws/{symbol.lower()}@trade"

ws = websocket.WebSocketApp(

socket_url,

on_message=on_message,

on_error=on_error,

on_close=on_close

)

ws.run_forever()

# Hauptfunktion

def main():

print(f"Starte Handelsbot für {symbol}...")

try:

# Überprüfung des Guthabens

balance = client.get_asset_balance(asset='USDT')

print(f"USDT-Guthaben: {balance['free']}")

# WebSocket starten

start_websocket()

except Exception as e:

print(f"Fehler: {e}")

if __name__ == "__main__":

main()

export BINANCE_API_KEY='your_api_key_here'

export BINANCE_SECRET_KEY='your_api_secret_here'

pip install python-binance ccxt websocket-client pandas