之前介绍了如何使用币安API进行交易,这一章将介绍获取当前仓位的状态以进一步进行平仓操作。如果你还没有注册币安交易所,欢迎使用我的邀请链接获得手续费减免:https://accounts.binance.com/register?ref=DPVSZVI3
在交易成功之后,我们会希望获取当前仓位的信息并解析,接下来就简单的介绍一下这些接口在ccxt
里面怎么调用,如果还不知道ccxt
是什么可以往回去看第二篇。
balance = exchange.fetch_balance({'type': 'future'})['total']['USDT']
这里使用的是函数fetch_balance
,传递了一个字典作为参数,type
为future
表示查询的是期货(合约)账户的余额,如果要查询现货账户那就设置为spot
,看过前面一章的同学应该就知道这个。然后再加上下标['total']
以及['USDT']
表示查询USDT余额,其它币种就把下标改成对应的。
开了个仓然后查询仓位看了一下返回数据:
position = exchange.fetch_positions([COIN])
参数为需要查询的仓位币种的列表,比如[BTC/USDT, ETH/USDT]
,打印出返回结果可以看到返回的是一个字典列表:
[
{
'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"
。
在币安API的文档中并没有显式的给出平仓的接口,但是平仓实际上就相当于开一个与当前仓位相反的仓位,比如做多(买入)一定数量的COIN,平仓就是卖出相应数量的这个COIN,因此只需要反方向开一个数量与开仓相同的仓位就可以平仓了(也可以与开仓数量不同,比如平掉一半)。
比如我先市价开一个多仓:
exchange.set_leverage(5, "BTC/USDT") # 设置杠杆倍数
exchange.create_market_order("BTC/USDT", "buy", 6, params={'reduceOnly': False})
之后想要平仓的话,需要先知道上次开仓买入的数量,这就需要用到上面的仓位查询接口了:
position = exchange.fetch_positions(["BTC/USDT"])
last_amount = position[0]['contracts'] * position[0]['contractSize']
使用合约数量乘以每个合约的大小就可以得到上次开仓的数量,然后反方向开仓即可平仓
exchange.create_market_order("BTC/USDT", "sell", last_amount, params={'reduceOnly': True})
也可以平掉一半设置amount
为0.5*last_amount
,平仓时可以设置只减仓为True
,防止数量太少(<5)无法交易成功。