币安Binance API使用（四、仓位状态获取及平仓）

之前介绍了如何使用币安 API 进行交易，这一章将介绍获取当前仓位的状态以进一步进行平仓操作。如果你还没有注册币安交易所，欢迎使用我的邀请链接获得手续费减免：https://accounts.binance.com/register?ref=DPVSZVI3

在交易成功之后，我们会希望获取当前仓位的信息并解析，接下来就简单的介绍一下这些接口在ccxt里面怎么调用，如果还不知道ccxt是什么可以往回去看第二篇。

1. 查询余额

Copy
balance = exchange.fetch_balance({'type': 'future'})['total']['USDT']

这里使用的是函数fetch_balance，传递了一个字典作为参数，type为future表示查询的是期货（合约）账户的余额，如果要查询现货账户那就设置为spot，看过前面一章的同学应该就知道这个。然后再加上下标['total']以及['USDT']表示查询 USDT 余额，其它币种就把下标改成对应的。

2. 查询仓位

开了个仓然后查询仓位看了一下返回数据：

Copy
position = exchange.fetch_positions([COIN])

参数为需要查询的仓位币种的列表，比如[BTC/USDT, ETH/USDT]，打印出返回结果可以看到返回的是一个字典列表：

Copy
[
{
'info':
{
'symbol': 'JUPUSDT',
'positionAmt': '6',
'entryPrice': '0.9947',
'breakEvenPrice': '0.99519735',
'markPrice': '0.99363270',
'unRealizedProfit': '-0.00640380',
'liquidationPrice': '0',
'leverage': '1',
'maxNotionalValue': '8000000.0',
'marginType': 'isolated',
'isolatedMargin': '5.96820000',
'isAutoAddMargin': 'false',
'positionSide': 'BOTH',
'notional': '5.96179620',
'isolatedWallet': '5.97460380',
'updateTime': '1713106952248',
'isolated': True, 'adlQuantile': '2'
},
'id': None,
'symbol': 'JUP/USDT:USDT',
'contracts': 6.0,
'contractSize': 1.0,
'unrealizedPnl': -0.0064038,
'leverage': 1.0,
'liquidationPrice': None,
'collateral': 5.9682,
'notional': 5.9617962,
'markPrice': 0.9936327,
'entryPrice': 0.9947,
'timestamp': 1713106952248,
'initialMargin': 5.9617962,
'initialMarginPercentage': 1.0,
'maintenanceMargin': 0.089426943,
'maintenanceMarginPercentage': 0.015,
'marginRatio': 0.015,
'datetime': '2024-04-14T15: 02: 32.248Z',
'marginMode': 'isolated',
'marginType': 'isolated',
'side': 'long',
'hedged': False,
'percentage': -0.1,
'stopLossPrice': None,
'takeProfitPrice': None
}
]

里面的 key 比较多，需要用到的几个比较重要的有：

contracts：合约数量

contractSize：每个合约大小（应该与杠杆倍数有关）

unrealizedPnl：浮动盈亏

leverage：杠杆大小

collateral：保证金

notional：仓位大小（保证金加上浮动盈亏）

markPrice：市价

entryPrice：进场价

side：方向（多 long、空 short）

使用position[0]["key"]来获取这些值，key 就是需要获取的数据键名，需要带双引号，如"side"。

3. 平仓

在币安 API 的文档中并没有显式的给出平仓的接口，但是平仓实际上就相当于开一个与当前仓位相反的仓位，比如做多（买入）一定数量的 COIN，平仓就是卖出相应数量的这个 COIN，因此只需要反方向开一个数量与开仓相同的仓位就可以平仓了（也可以与开仓数量不同，比如平掉一半）。

比如我先市价开一个多仓：

Copy
exchange.set_leverage(5, "BTC/USDT") # 设置杠杆倍数
exchange.create_market_order("BTC/USDT", "buy", 6, params={'reduceOnly': False})

之后想要平仓的话，需要先知道上次开仓买入的数量，这就需要用到上面的仓位查询接口了：

Copy
position = exchange.fetch_positions(["BTC/USDT"])
last_amount = position[0]['contracts'] * position[0]['contractSize']

使用合约数量乘以每个合约的大小就可以得到上次开仓的数量，然后反方向开仓即可平仓

Copy
exchange.create_market_order("BTC/USDT", "sell", last_amount, params={'reduceOnly': True})

也可以平掉一半设置amount为0.5*last_amount，平仓时可以设置只减仓为True，防止数量太少（<5）无法交易成功。