之前介紹了如何使用幣安 API 進行交易,這一章將介紹獲取當前倉位的狀態以進一步進行平倉操作。如果你還沒有註冊幣安交易所,歡迎使用我的邀請鏈接獲得手續費減免:https://accounts.binance.com/register?ref=DPVSZVI3
在交易成功之後,我們會希望獲取當前倉位的信息並解析,接下來就簡單的介紹一下這些接口在ccxt
裡面怎麼調用,如果還不知道ccxt
是什麼可以往回去看第二篇。
1. 查詢餘額#
balance = exchange.fetch_balance({'type': 'future'})['total']['USDT']
這裡使用的是函數fetch_balance
,傳遞了一個字典作為參數,type
為future
表示查詢的是期貨(合約)賬戶的餘額,如果要查詢現貨賬戶那就設置為spot
,看過前面一章的同學應該就知道這個。然後再加上下標['total']
以及['USDT']
表示查詢 USDT 餘額,其它幣種就把下標改成對應的。
2. 查詢倉位#
開了個倉然後查詢倉位看了一下返回數據:
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"
。
3. 平倉#
在幣安 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)無法交易成功。