如何使用Interactive Brokers API平仓?Python代码修正求助
问题描述
我正在尝试使用Interactive Brokers API编写代码,此前已通过该API开仓,现希望在盈利时平掉现有持仓(并非反向开立新仓)。
开仓代码如下:
def make_order(self): # create a contract for the ES futures contract = Future(symbol='ES', exchange='CME', currency='USD', lastTradeDateOrContractMonth='202303') # place a market order to buy or sell contract of ES order = MarketOrder(action=self.position, totalQuantity=1) trade = self.ib.placeOrder(contract, order) print(trade.orderStatus.status) return order
调用代码如下:
contract = InteractiveAPI(ib, duration, interval, position, stop_price_fake) order_trade = contract.make_order() ib.closeTrade(order_trade) # **This line doesn't work**
其中ib.closeTrade(order_trade)无法正常工作,恳请告知如何修正该行代码。
解决方案
ib.closeTrade()并不是平掉现有持仓的正确方法——它的作用是取消未成交的订单,而非平仓已持有的仓位。要平仓,你需要创建与开仓方向相反的市价订单,并匹配对应的合约信息,具体操作如下:
方法一:基于开仓信息直接平仓
如果你的InteractiveAPI类记录了开仓的合约和方向,可以添加专门的平仓方法:
def close_position(self): # 复用开仓时的合约参数 contract = Future(symbol='ES', exchange='CME', currency='USD', lastTradeDateOrContractMonth='202303') # 生成反向操作:开仓是BUY就用SELL,开仓是SELL就用BUY close_action = "SELL" if self.position == "BUY" else "BUY" # 创建市价平仓订单 close_order = MarketOrder(action=close_action, totalQuantity=1) # 提交平仓订单 trade = self.ib.placeOrder(contract, close_order) print(trade.orderStatus.status) return close_order
调用时直接执行:
contract = InteractiveAPI(ib, duration, interval, position, stop_price_fake) # 开仓 contract.make_order() # 盈利时调用平仓 contract.close_position()
方法二:通过持仓信息动态平仓
如果你需要根据实际持仓情况平仓,可以先获取当前持仓列表,再针对性操作:
# 获取账户所有持仓 positions = ib.positions() for pos in positions: contract = pos.contract # 筛选目标ES合约 if contract.symbol == 'ES' and contract.exchange == 'CME' and contract.lastTradeDateOrContractMonth == '202303': pos_size = pos.position # 正数为多头,负数为空头 close_action = "SELL" if pos_size > 0 else "BUY" close_qty = abs(pos_size) # 平仓数量取持仓绝对值 # 创建并提交平仓订单 close_order = MarketOrder(action=close_action, totalQuantity=close_qty) ib.placeOrder(contract, close_order)
关键注意事项
- 务必保证合约的所有参数(尤其是
lastTradeDateOrContractMonth)与开仓时完全一致,否则无法匹配持仓 - 若要实现盈利自动平仓,需额外添加逻辑:获取合约当前价格与持仓成本,计算盈利达标后再执行平仓操作
内容的提问来源于stack exchange,提问作者Django
相关产品推荐
相关产品推荐

