之前介紹了如何使用幣安 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)無法交易成功。