如何用CCXT关闭OKX交叉保证金订单?金额参数异常求助
现货保证金(交叉模式)平仓异常排查
我在使用CCXT操作OKX V5现货保证金(交叉模式)平仓时遇到问题,以下是详细情况:
第一次卖单(正常执行)
执行卖单代码:
params = {'tdMode': 'cross', 'ccy': 'USDT'} order = await self.okx.create_order( symbol='XRP/USDT', type='market', side='sell', amount=99.43, price=0.39024, params=params )
执行结果符合预期,成交XRP数量与指定的amount一致:
{'amount': 99.431119, 'average': 0.39005, 'clientOrderId': 'e847386590ce4dBCce71dedc37e12254', 'cost': 38.78310796595, 'datetime': '2022-12-02T17:29:58.048Z', 'fee': {'cost': 0.03878310796595, 'currency': 'USDT'}, 'fees': [{'cost': 0.03878310796595, 'currency': 'USDT'}], 'filled': 99.431119, 'id': '518962064594153472', }
第二次买单(平仓)出现异常
仅修改交易方向为buy,其他参数几乎不变:
params = {'tdMode': 'cross', 'ccy': 'USDT'} order = await self.okx.create_order( symbol='XRP/USDT', type='market', side='buy', amount=99.43, price=0.39017, params=params )
结果却出现异常:指定的amount是99.43,但实际成交XRP数量为254.853543,相当于系统把amount识别成了USDT计价金额,而非XRP数量:
{'amount': 99.43111, 'average': 0.39015, 'clientOrderId': 'e847386590ce4dBC328bc6dfc937795f', 'cost': 99.43110980145, 'datetime': '2022-12-02T17:36:47.913Z', 'fee': {'cost': 0.254853543, 'currency': 'XRP'}, 'fees': [{'cost': 0.254853543, 'currency': 'XRP'}], 'filled': 254.853543, 'id': '518963783692562432', }
问题原因与解决办法
OKX现货保证金交易中,买卖方向的amount参数默认含义不同:
- 卖出(
sell)时,amount指基础货币(XRP)的数量 - 买入(
buy)时,默认amount指计价货币(USDT)的金额
要让买单的amount代表基础货币数量,需要在params中添加'type': 'cash',修正后的代码如下:
params = {'tdMode': 'cross', 'ccy': 'USDT', 'type': 'cash'} order = await self.okx.create_order( symbol='XRP/USDT', type='market', side='buy', amount=99.43, price=0.39017, params=params )
这样下单后,系统会按照你指定的XRP数量执行买单,和之前卖单的数量匹配,完成平仓操作。
另外,建议通过await self.okx.fetch_balance(params)获取当前持仓的精确XRP数量,避免手动输入的误差,进一步保证平仓数量准确。
内容的提问来源于stack exchange,提问作者Piero Costa
相关产品推荐
相关产品推荐

