关于 binance api
对接的一些细节。
现货
WSS 推送
trade 推送
trade
推送分为
@trade
- 逐笔交易
@aggTrade
- 归集交易
无论是逐笔还是归集,里面都有两个参数
E
- 事件时间
T
- 成交时间
E
的意思是这笔数据的推送时间。T
是交易的成交时间。
所以 E
的时间一定是在 T
之后的。而且对于归集交易而言,由于要归集相同的数据,想当然认为,T
和 E
之间相差的更大,经过实际测试,这两个值之间不会超过 6ms
。
查询所有订单和查询当前挂单
GET /api/v3/allOrders (HMAC SHA256),也是包括当前的挂单的。
区别是GET /api/v3/openOrders,只获取交易对的所有当前挂单
cummulativeQuoteQty / executedQty 是最准确的成交价格
至于 cummulativeQuoteQty 问了客服也没有说明白
合约
全仓和逐仓
全仓所有仓位共享保证金
逐仓与全仓仓位不共享
逐仓交易的余额不会影响全仓
全仓模式的意思是账户里所有可用余额都可以充当担保资产,以避免被强制平仓。 这个模式的好处是:只要杠杆适中,爆仓可能性很低,所以经常被用于套期保值。
逐仓模式的意思是分配给某仓位的担保资产被限制在一定数额。 如果仓位的担保资产不足以支撑浮亏,此仓位将被强制平仓
账户
- 总余额 = 全仓余额 + 逐仓余额
- 全仓余额
吃单
合约开单分为 taker
和 maker
。
其中 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
小,那么你的亏损还将扩大。
所以,开仓的时候滑点非常重要。
下单
binance
的 USWAP
中,不能根据 USDT
来下单,只能下单 coin
数量。
止损单
binance
的止损单不太符合我的传统思考。
止盈止损订单的触发规则如下:
STOP
STOP_MARKET
止损单: 买入: 最新合约价格/标记价格高于等于触发价stopPrice
卖出: 最新合约价格/标记价格低于等于触发价stopPrice
对于买单来说,如果您设置的 stopPrice
已经高于合约价格了,就会直接触发了,会直接触发的止损订单是不允许直接下的,需要先下一个未被触发的止损订单,等待市场价格高于您设置的 stopPrice
,进行触发。
也就是,如果你想挂一个 10U
的单子,但是想要 9U
的时候止损,进行买多操作,是做不到的。【假设买一是 10
】
1 | side:'BUY', |
上面会直接触发错误。
2021 ORDER_WOULD_IMMEDIATELY_TRIGGER
那么,如何做到想挂一个 10U
的单子,但是想要 9U
的时候止损?
止盈止损订单是订单类型,可以用来开仓,也可以用来平仓。如果用来平仓。您有一笔做多的仓位,需要用卖单来平仓,止损卖单,触发价格设置的比市场价格低,等市场价格低于您设置的触发价格后才会触发,相当于更低的价格平掉您的多仓进行了止损。
首先,下单通过 LIMIT
方式进行挂单。
比如,我通过 10U
进行了挂单,开多,同时要下一个止损的卖单,参数如下:
1 | side:'SELL', |
这样就可以了。
批量下单
1 | {"type":"LIMIT","timeInForce":"GTC", |
批量下单的合约止盈止损单子
1 | {'batchOrders': ' |
ps: price
、quantity
等,都是字符串类型
变成
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×tamp={{timestamp}}&signature={{signature}} |
相关代码如下:
1 | import requests |
手续费
一般账户。
主动吃单,万4
手续费。
挂单被吃,万2
手续费。
手续费 = 成交价格 x 成交数量 x 手续费率
开仓、平仓各收取一次手续费
可以使用 BUSD
进行交易,详情请看
另外,BNB
打 9
折。
仓位
这里有一个值得注意的是,通过调取借口返回的一个属性,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×tamp=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