我正在编写一些 Python 代码来使用 Binance API 创建订单:
from binance.client import Client
client = Client(API_KEY, SECRET_KEY)
client.create_order(symbol='BTCUSDT',
recvWindow=59999, #The value can't be greater than 60K
side='BUY',
type='MARKET',
quantity = 0.004)
Run Code Online (Sandbox Code Playgroud)
不幸的是我收到以下错误消息:
"BinanceAPIException: APIError(code=-1021): Timestamp for this request was 1000ms ahead of the server's time."
Run Code Online (Sandbox Code Playgroud)
我已经检查了币安服务器时间和本地时间之间的差异(以毫秒为单位):
import time
import requests
import json
url = "https://api.binance.com/api/v1/time"
t = time.time()*1000
r = requests.get(url)
result = json.loads(r.content)
print(int(t)-result["serverTime"])
OUTPUT: 6997
Run Code Online (Sandbox Code Playgroud)
看来60000的recvWindow还是不够用(但也可能不会超过60K)。我仍然遇到同样的错误。有人知道我该如何解决这个问题吗?
提前谢谢了!
我已将 Binance API 集成到我的项目中,以显示所有支持的交易品种及其相应图标的列表。但是,我无法获取符号name/description。
例如,我可以获取 BTC-EUR,但无法通过公共端点获取“比特币”或类似内容。至少,到目前为止我还没有找到终点。
目前,我正在使用 的专用端点(位于身份验证后面)/sapi/v1/margin/allAssets。这会返回每个符号的 ,但正如你可以想象的那样,我想阻止在获取信息name/description时使用私有 API 令牌public
{
"assetFullName": "Bitcoin", <----- This is what I'm looking on a public endpoint
"assetName": "BTC",
"isBorrowable": true,
"isMortgageable": true,
"userMinBorrow": "0.00000000",
"userMinRepay": "0.00000000"
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是是否有一个公共端点可用于获取相同的信息?现在,我正在使用端点/api/v3/exchangeInfo来检索交易所上的可用符号,但此响应中没有包含name/description该符号...
"symbols": [
{
"symbol": "ETHBTC",
"status": "TRADING",
"baseAsset": "ETH",
"baseAssetPrecision": 8,
"quoteAsset": "BTC",
"quotePrecision": 8,
"quoteAssetPrecision": 8,
"orderTypes": [
"LIMIT",
"LIMIT_MAKER",
"MARKET",
"STOP_LOSS",
"STOP_LOSS_LIMIT",
"TAKE_PROFIT",
"TAKE_PROFIT_LIMIT"
],
"icebergAllowed": true,
"ocoAllowed": true,
"isSpotTradingAllowed": true, …Run Code Online (Sandbox Code Playgroud) 我尝试在 Heroku 上上传我的 python 代码(Binance trade-bot),但出现错误 o\xd1\x81\xd1\x81ured。有人可以帮我吗?
\nfrom binance.client import Client\nfrom datetime import datetime\n\nclient = Client(api,key)\nsymbol = 'IOSTUSDT'\n\nfor i in client.futures_historical_klines(symbol, Client.KLINE_INTERVAL_1MINUTE, '2022-03-16'):\n print(i)\nRun Code Online (Sandbox Code Playgroud)\n错误是
\n2022-03-16T13:37:45.890497+00:00 app[worker.1]: Traceback (most recent call last):\n2022-03-16T13:37:45.890552+00:00 app[worker.1]: File "/app/code.py", line 14, in <module>\n2022-03-16T13:37:45.890743+00:00 app[worker.1]: for i in client.futures_historical_klines(symbol, Client.KLINE_INTERVAL_1MINUTE, '2022-03-16'):\n2022-03-16T13:37:45.890758+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/binance/client.py", line 5709, in futures_historical_klines\n2022-03-16T13:37:45.892661+00:00 app[worker.1]: return self._historical_klines(symbol, interval, start_str, end_str=end_str, limit=limit, klines_type=HistoricalKlinesType.FUTURES)\n\n---here too much text--\n\n2022-03-16T13:37:45.894613+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/dateparser/languages/locale.py", line 131, in translate\n2022-03-16T13:37:45.894755+00:00 app[worker.1]: relative_translations = self._get_relative_translations(settings=settings)\n2022-03-16T13:37:45.894769+00:00 app[worker.1]: File …Run Code Online (Sandbox Code Playgroud) 我想获得与币安网站订单簿中显示的相同信息(已开订单):
我试过:
/api/v3/allOrders-- 这显然显示了我的所有订单
api/v3/openOrders-- 这显然显示了我的未结订单
和
/api/v3/trades-- 这显然显示已关闭的订单
如何查看每个人的未结订单?
每当有订单事件(订单执行、取消等)时,我需要监听用户数据流,我希望能够监听这些事件并创建通知。
所以我得到了我的“listenKey”,我不确定它是否以正确的方式完成,但我执行了这段代码,它给了我类似listenKey的东西。
获取listenKey的代码:
def get_listen_key_by_REST(binance_api_key):
url = 'https://api.binance.com/api/v1/userDataStream'
response = requests.post(url, headers={'X-MBX-APIKEY': binance_api_key})
json = response.json()
return json['listenKey']
print(get_listen_key_by_REST(API_KEY))
Run Code Online (Sandbox Code Playgroud)
以及监听用户数据流的代码 - 这不起作用,我没有得到 json 响应。
socket = f"wss://fstream-auth.binance.com/ws/btcusdt@markPrice?listenKey=<listenKeyhere>"
def on_message(ws, message):
json_message = json.loads(message)
print(json_message)
def on_close(ws):
print(f"Connection Closed")
# restart()
def on_error(ws, error):
print(f"Error")
print(error)
ws = websocket.WebSocketApp(socket, on_message=on_message, on_close=on_close, on_error=on_error)
Run Code Online (Sandbox Code Playgroud)
我已阅读文档但无济于事。如果有人能指出我正确的方向,我将不胜感激。
返回/api/v3/exchangeInfo以下速率限制
币安文档说:
与 /api/* 相关的端点:
- 根据IP和UID(账号)限制两种模式,各自独立。
- 端点基于 IP 共享每分钟 1200 个限制,不包括新订单端点 POST /api/v3/order,该端点具有每 10 秒 50 个和基于 UID 每天 160000 个的具体限制。
- 响应包含标头 X-MBX-USED-WEIGHT-(intervalNum)(intervalLetter),定义当前 IP 使用的权重。
- 成功的订单响应包含标头 X-MBX-ORDER-COUNT-(intervalNum)(intervalLetter),定义 UID 使用的订单限制。
因此,以 开头的标头与X-MBX-USED-WEIGHT-相关rateLimits[0],以 开头的标头与和X-MBX-ORDER-COUNT-相关。rateLimits[1]rateLimits[2]
关于什么rateLimits[3]?我该如何实施?
我想通过 binance websocket 获取 BTC 的实时交易买入/卖出数据。
我在以下 websocket 模块中使用此方法:
网址:https ://python-binance.readthedocs.io/en/latest/binance.html#module-binance.streams
method:aggtrade_futures_socket(symbol: str, futures_type: binance.enums.FuturesType = <FuturesType.USD_M: 1>)
Run Code Online (Sandbox Code Playgroud)
该方法返回以下值:
data:
{
"e": "aggTrade", // Event type
"E": 123456789, // Event time
"s": "BTCUSDT", // Symbol
"a": 5933014, // Aggregate trade ID
"p": "0.001", // Price
"q": "100", // Quantity
"f": 100, // First trade ID
"l": 105, // Last trade ID
"T": 123456785, // Trade time
"m": true, // Is the buyer the market maker?
}
Run Code Online (Sandbox Code Playgroud)
但是,这个数据似乎并不能决定是卖还是买。如何获取买卖交易的数据?
我们希望通过使用 Binance API 创建一个加密货币交易网站来发送和接收加密资产。但问题是,我们无法为每个用户的每个代币生成唯一的地址,并且所有用户都将他们的资产发送到同一个存款地址。
我们如何为每个用户每个代币生成新的存款地址?
我正在尝试运行在 jupyter 笔记本上找到的教程中的以下代码:
from time import sleep
from binance import ThreadedWebsocketManager
btc_price = {'error':False}
def btc_trade_history(msg):
if (msg['e'] != 'error'):
print(msg['c'])
btc_price['last'] = msg['c']
btc_price['bid'] = msg['b']
btc_price['last'] = msg['a']
btc_price['error'] = False
else:
btc_price['error'] = True
bsm = ThreadedWebsocketManager()
bsm.start()
bsm.start_symbol_ticker_socket(callback=btc_trade_history, symbol='BTCUSDT')
Run Code Online (Sandbox Code Playgroud)
这是教程本身的链接:https ://algotrading101.com/learn/binance-python-api-guide/
我想,自从编写了教程以来,binance API 中发生了一些变化,所以我收到以下错误:
取消 read_loop 未来从未检索到任务异常:<任务完成名称='Task-14'coro=<ThreadedApiManager.start_listener()完成,在C:\Users\myusername\Anaconda3\lib\site-packages\binance\threaded_stream中定义。 py:42> 异常=RuntimeError("任务 <任务挂起名称='Task-20' coro=<Queue.get() 在 C:\Users\myusername\Anaconda3\lib\asyncio\queues.py:163 运行> cb =[_release_waiter(()]>)() at C:\Users\myusername\Anaconda3\lib\asyncio\tasks.py:429]> 让 Future 附加到不同的循环")>
请解释一下出了什么问题以及如何解决?
我有一个交易机器人,它在“ADAUSDT”中运行,具有动态的买卖数量,作为我的整个 USDT 余额的初始数量,并以相同的余额 + 利润或损失进行交易(它基本上以整个 USDT 余额进行交易并保持交易)一遍又一遍地)。这是一些代码:
from binance.client import Client
import Keys #personal api keys
client = Client(Keys.b_keys, Keys.b_secret)
infoa = client.get_account()
bal= infoa['balances']
i_o = float(bal[11]["free"])
v_min = v_min #some value of ADA, for example: 1.2
order = client.create_order(
symbol = "ADAUSDT" ,
side=SIDE_BUY ,
type=ORDER_TYPE_LIMIT ,
timeInForce = TIME_IN_FORCE_GTC ,
quantity = float(round((i_o) , 8)) ,
price = v_min ,
)
Run Code Online (Sandbox Code Playgroud)
我知道 quoteAsset 和 baseAsset 所需的精度都是 8,因此round()在订单本身的数量值中使用该函数,但即使在那之后,API 仍然会向我抛出错误“精度超过了最大值”为该资产定义”。请帮助我:c
编辑:i_o 是我的“USDT”余额,理论上应该随每次交易而变化,因此使用此变量而不是每个订单数量的普通数字。
注意:我对 Python 很菜鸟,哈哈,我一周前才学了一些基础知识,所以如果你能详细说明一下那就太好了:D