0%

tomoon | binance 用法

关于 binance api 对接的一些细节。


现货


WSS 推送

trade 推送

trade 推送分为

  • @trade
    • 逐笔交易
  • @aggTrade
    • 归集交易

无论是逐笔还是归集,里面都有两个参数

  • E
    • 事件时间
  • T
    • 成交时间

E 的意思是这笔数据的推送时间。T 是交易的成交时间。

所以 E 的时间一定是在 T 之后的。而且对于归集交易而言,由于要归集相同的数据,想当然认为,TE 之间相差的更大,经过实际测试,这两个值之间不会超过 6ms

查询所有订单和查询当前挂单

GET /api/v3/allOrders (HMAC SHA256),也是包括当前的挂单的。

区别是GET /api/v3/openOrders,只获取交易对的所有当前挂单

cummulativeQuoteQty / executedQty 是最准确的成交价格

至于 cummulativeQuoteQty 问了客服也没有说明白


合约


全仓和逐仓

全仓所有仓位共享保证金

逐仓与全仓仓位不共享

逐仓交易的余额不会影响全仓

  • 全仓模式的意思是账户里所有可用余额都可以充当担保资产,以避免被强制平仓。 这个模式的好处是:只要杠杆适中,爆仓可能性很低,所以经常被用于套期保值。

  • 逐仓模式的意思是分配给某仓位的担保资产被限制在一定数额。 如果仓位的担保资产不足以支撑浮亏,此仓位将被强制平仓

  • 逐仓杠杆和全仓杠杆的区别

账户

  • 总余额 = 全仓余额 + 逐仓余额
  • 全仓余额

吃单

合约开单分为 takermaker

其中 taker 是主动吃单,maker 是挂单。

以开多为例,taker 吃的是卖单的第一档位,在深度足够的情况下,平仓的价格是根据 买单的第一档位。

maker 挂的是买单的第一档位,平仓的价格是根据买单的第一档位。

盈亏

binance 合约返回了一个叫做未实现盈亏,这个未实现盈亏对照的是标记价格。

除了强平,无论是开仓还是平仓,最终的盈亏都取决于最终成交的价格。

强平的价格参考的是标记价格。

计算

在合约中,必须完全理解,盈亏是怎么算出来的,不然,在高频下,如果理解错了,将带来不可估量的损失。

下面开仓全部都是 2 倍。其实,几倍根本无所谓,几倍主要是资金量的关系,和最终盈亏没啥关系,具体原因可以参考下面的 「倍数的理解」

开多赚钱案例

开仓

上面的 BCH 以数量 0.1 价格 277.07 进行开仓。

手续费为

(0.1 * 277.07) * 0.0002 = 0.0055414U
平仓

平仓的时候,BCH 的数量还是 0.1 但是,价格是 277.1

盈亏: (277.1 - 277.07) / 277.07 * 0.1 * 277.07 = 0.03
手续费: 主动平仓,主动成交 (0.1 * 277.1) * 0.0004 = 0.011084U

另外,从上面的例子来看,手续费是单独从用户剩余的余额中收的。

注意,这个案例中,挂单是买一开多,平仓的价格也是买一。

开多亏钱的案例

开仓

上面的 BCH 以数量 0.1 价格 282.79 进行开仓,主动吃单。

平仓

平仓的时候,BCH 的数量还是 0.1 但是,价格是 282.75

盈亏: (282.75 - 282.79) / 282.75 * 0.1 * 282.75 = -0.004

开空亏钱的案例

开仓

上面的 BCH 以数量 0.1 价格 277.62 进行开仓。

手续费为

(0.1 * 277.62) * 0.0002 = 0.0055524
平仓

平仓的时候,BCH 的数量还是 0.1 但是,价格是 277.66

盈亏: (277.62 - 277.66) / 277.66 * 0.1 * 277.66 = 0.004
手续费: 主动平仓,主动成交 (0.1 * 277.66) * 0.0004 = 0.0111064
平仓

倍数的理解

binance 的倍数指的是保证金能够乘以多少倍。

这里假设没有手续费,全仓模式。

我们的账户中有 10U,然后我们开 2 倍杠杠。在 5 美金价格做多 10U

在上面的操作后。

我们账户中还有 5U,虽然,我们使用了 10U 做多,但是,我们开了 2 倍杠杠,实际上只用了 5U,所以,我们的保证金是 5U

假设,我们平仓的时候,价格在 8U

那么实际盈利为

(8 - 5)/5 * 10 = 6U

假设平仓价格在 4U 的时候,实际亏损为

(4 - 5) / 5 * 10 = - 2U

如果标价价格到了 2.5U 的时候

(2.5 - 5)/5 * 10 = 5U

实际上已经达到保证金数量了,那么,这一仓位就爆仓了。

上面举的例子,多少有点不对,但是,这里只是说一下爆仓的概念,真正的计算还是要参考上面的「盈亏」。

滑点

滑点和深度有关系,假如说你想做多,但是卖单,第一单的 U 总值为 10U,第二单的 U 总值为 20U,你想买 40U 开多。

这就意味着,你至少需要吃掉前两笔,相当于你原计划 7U 价格的时候做多,最后综合下来,你在 8U 的时候做多了。

这无形中就拉高了你的平仓成本。这里,我们假设买单的价格是 5U,并且,买一单的总值为 100U

原计划,你 7U 开仓,这个时候如果你立刻平仓,你的亏损是

(5 - 7) / 7 * 40 = 11.42

但是,实际上,综合下来,你的亏损是

(5 - 8) / 8 * 40 = 15

假设,买一单的总值比 40 小,那么你的亏损还将扩大。

所以,开仓的时候滑点非常重要。

下单

binanceUSWAP 中,不能根据 USDT 来下单,只能下单 coin 数量。

止损单

binance 的止损单不太符合我的传统思考。

止盈止损订单的触发规则如下:

  • STOP
  • STOP_MARKET

止损单: 买入: 最新合约价格/标记价格高于等于触发价stopPrice

卖出: 最新合约价格/标记价格低于等于触发价stopPrice

对于买单来说,如果您设置的 stopPrice 已经高于合约价格了,就会直接触发了,会直接触发的止损订单是不允许直接下的,需要先下一个未被触发的止损订单,等待市场价格高于您设置的 stopPrice ,进行触发。

也就是,如果你想挂一个 10U 的单子,但是想要 9U 的时候止损,进行买多操作,是做不到的。【假设买一是 10

1
2
3
4
side:'BUY',
type:'STOP',
price:10,
stopPrice:9

上面会直接触发错误。

2021 ORDER_WOULD_IMMEDIATELY_TRIGGER

那么,如何做到想挂一个 10U 的单子,但是想要 9U 的时候止损?

止盈止损订单是订单类型,可以用来开仓,也可以用来平仓。如果用来平仓。您有一笔做多的仓位,需要用卖单来平仓,止损卖单,触发价格设置的比市场价格低,等市场价格低于您设置的触发价格后才会触发,相当于更低的价格平掉您的多仓进行了止损。

首先,下单通过 LIMIT 方式进行挂单。

比如,我通过 10U 进行了挂单,开多,同时要下一个止损的卖单,参数如下:

1
2
3
side:'SELL',
type:'STOP_MARKET',
stopPrice:9

这样就可以了。

批量下单

1
2
3
{"type":"LIMIT","timeInForce":"GTC",
"symbol":"BTCUSDT","side":"BUY","price":"10001","quantity":"0.001"},{"type":"LIMIT","timeInForce":"GTC",
"symbol":"BTCUSDT","side":"BUY","price":"10001","quantity":"0.001"}

批量下单的合约止盈止损单子

1
2
3
4
{'batchOrders': '
{"symbol": "CFXUSDT", "side": "SELL", "type": "STOP_MARKET", "quantity": "200.0", "stopPrice": 0.23, "positionSide": "SHORT"},
{"symbol": "DOGEBUSD", "side": "BUY", "type": "STOP_MARKET", "quantity": "200.0", "stopPrice": 0.0915, "positionSide": "LONG"}'
}

ps: pricequantity 等,都是字符串类型

变成

1
{{url}}/fapi/v1/batchOrders?batchOrders=%5B%7B%22type%22%3A%22LIMIT%22%2C%22timeInForce%22%3A%22GTC%22%2C%0A%22symbol%22%3A%22BTCUSDT%22%2C%22side%22%3A%22BUY%22%2C%22price%22%3A%2210001%22%2C%22quantity%22%3A%220.001%22%7D%2C%7B%22type%22%3A%22LIMIT%22%2C%22timeInForce%22%3A%22GTC%22%2C%0A%22symbol%22%3A%22BTCUSDT%22%2C%22side%22%3A%22BUY%22%2C%22price%22%3A%2210001%22%2C%22quantity%22%3A%220.001%22%7D%5D&timestamp={{timestamp}}&signature={{signature}}

相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import requests
import hmac
import hashlib
import time
import urllib.parse
import json

api_key = ""
secret_key = ""
base_url = "https://testnet.binancefuture.com"
endpoint_path = '/fapi/v1/batchOrders'

order1 = {
"symbol": "BTCUSDT",
"side": "BUY",
"positionSide": "LONG",
"newClientOrderId": "order1",
"type": "LIMIT",
"price": "10010",
"quantity": "0.001",
"timeInForce": "GTC"
}

order2 = {
"symbol": "BTCUSDT",
"side": "BUY",
"positionSide": "LONG",
"newClientOrderId": "order2",
"type": "LIMIT",
"price": "10000",
"quantity": "0.001",
"timeInForce": "GTC"
}

batchOrders = '[' + json.dumps(order1) + ',' + json.dumps(order2) + ']'
params = {
"batchOrders": batchOrders,
"timestamp": round(time.time() * 1000),
"recvWindow": 60000
}
querystring = urllib.parse.urlencode(params)
print(querystring, "\n")

signature = hmac.new(secret_key.encode('utf-8'), msg=querystring.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()
url = base_url + endpoint_path + "?" + querystring + "&signature=" + signature
print(url, "\n")

payload = {}
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'X-MBX-APIKEY': api_key
}

response = requests.request("POST", url, headers=headers, data=payload)

result = response.json()

print(result)

手续费

一般账户。

主动吃单,万4手续费。

挂单被吃,万2手续费。

手续费 = 成交价格 x 成交数量 x 手续费率 

开仓、平仓各收取一次手续费

可以使用 BUSD 进行交易,详情请看

另外,BNB9 折。

仓位

这里有一个值得注意的是,通过调取借口返回的一个属性,unRealizedProfit 持仓未实现盈利,并不是真的盈利,而是指数价格的盈利,真正的盈利,请看上面的盈利计算。

平仓

平仓的 api 依然是

/fapi/v1/order

这里通过 U本位举例子。

币安并不提供专门的平仓 api 接口,而是通过下一个相反的单子进行平仓。

比如,我有一个 BTCUSDT 的多单,如果想平仓,只需要下一个 BTCUSDT 的空单就好了。

参数如下

symbol=BTCUSDT&side=SELL&reduceOnly=true&type=MARKET&quantity=0.1
  • side:和单子相反的方向
  • reduceOnly:等于 true 的时候,表明即便是 quantity 超过单子的平仓量也不会开一个相反的单子。如果,没有这个参数,那么,当 quantity 超过平仓量的时候,会出现新的单子
  • type:平仓类型,这里是市价
  • quantify:要平仓的数量

如果您是单向模式,可以在下单的时候设置

reduceOnly=true

来表示这笔订单是平仓单。

客服回答: 单向模式下,用市价平仓可以用市价单MARKET比如如下参数是BTCUSDT平多(sell是开空或者平多,设定reduceOnly=true就一定是平多)symbol=BTCUSDT&type=MARKET&side=SELL&quantity=1&reduceOnly=true&timestamp=167666666666

另外,api 中有一个参数是 closePosition ,这个参数只能是止盈止损市价单使用,还不支持其他订单类型

如果没有持仓,去平仓的话,会报 2022 错误。

如果您当前是双向模式,可以用两个参数指定仓位的操作方向,

  • side
  • positionSide
    • side=BUY&positionSide=SHORT 是平空
    • side=SELL&positionSide=LONG 是平多

在不爆仓的情况下,平仓是根据什么价格

在深度足够的情况下

平多仓位,平仓根据买一的价格。

平空仓位,平仓根据卖一的价格。

U永续的连续K线和K线的区别

  • K线数据
    • /fapi/v1/klines
  • 连续合约K线数据
    • /fapi/v1/continuousKlines

对于永续合约来说,这两个没区别,主要是针对交割。

双向持仓

双向持仓的意思是账户中可以同时下多空单子。

下单

双向模式的开平仓订单规则如下:

  • side=BUY&positionSide=LONG是开多
  • side=SELL&positionSide=SHORT是开空

平仓

  • side=SELL&positionSide=LONG是平多
  • side=BUY&positionSide=SHORT是平空

双向持仓下,是不需要带 reduceOnly 的,本身就自带 reduceOnly 效果

比如,平多,使用市价平仓,参数如下

  • side=SELL&positionSide=LONG&type=MARKET&quantity=xxx
请我喝杯咖啡吧~