xChar
·2 months ago

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

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

1. 查询余额

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

这里使用的是函数fetch_balance,传递了一个字典作为参数,typefuture表示查询的是期货(合约)账户的余额,如果要查询现货账户那就设置为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})

也可以平掉一半设置amount0.5*last_amount,平仓时可以设置只减仓为True,防止数量太少(<5)无法交易成功。

Loading comments...