问题描述
解决方案
在聚宽(JoinQuant)的期货策略中,可以通过在下单函数(如 order、order_target 等)中设置 close_today 参数来指定是否“平今仓”。
1. 参数说明
- 参数名:
close_today - 类型:
bool(布尔值) - 适用交易所: 上海期货交易所 (XSGE)、上海国际能源交易中心 (XINE)、中国金融期货交易所 (CCFX)。
- 注:其他交易所(如大商所、郑商所)通常不区分平今和平昨的指令,遵循“先开先平”原则,设置此参数可能会报错或无效。
2. 参数逻辑
close_today=True: 只平今仓。- 系统会强制平掉今日新开的仓位。
- 如果今日仓位不足(即使有昨日老仓),订单会被废单(Rejected)。
close_today=False(默认值): 优先平昨仓。- 系统会优先平掉昨日(及以前)的老仓位。
- 如果昨仓不足,剩余部分会自动平今仓。
3. 代码示例
以下代码展示了如何在 order 和 order_target 函数中使用该参数。
示例 A:使用 order 函数平今仓
假设当前持有 IF1912.CCFX 的多单,现在需要平掉 1手 今日开仓 的多单:
# amount为负数表示卖出(平仓),side='long'表示操作多头仓位
# close_today=True 表示强制平今仓
order('IF1912.CCFX', -1, side='long', close_today=True)
示例 B:使用 order_target 函数平今仓
假设当前持有 RB2001.XSGE 空单 5 手(其中今仓 2 手,昨仓 3 手),现在希望将空单持仓调整为 3 手(即平掉 2 手):
# 如果希望这平掉的2手必须是“今仓”:
# target=3,意味着要卖平2手。设置 close_today=True 强制平今
order_target('RB2001.XSGE', 3, side='short', close_today=True)
示例 C:优先平昨(默认行为)
如果希望优先平掉老仓位,不够再平今仓,只需设置 False 或不填:
# 优先平昨仓,昨仓不够时平今仓
order('IF1912.CCFX', -1, side='long', close_today=False)
4. 注意事项
- 手续费区别: 在某些品种(如股指期货)中,平今仓的手续费可能远高于平昨仓。正确设置
close_today对控制交易成本非常重要。 - 方向 (
side): 期货交易必须指定side参数('long'或'short'),否则系统默认为'long'。- 平多单:
amount< 0,side='long' - 平空单:
amount< 0,side='short'(注意:此处 amount 为负数代表减少持仓,即买入平空)
- 平多单:
- 交易所限制: 如果对不支持平今指令的交易所(如大商所、郑商所)标的使用
close_today=True,回测或模拟交易可能会报错。
Q&A
Q: 如果我设置了 close_today=True 但是没有今仓,只有昨仓,会发生什么?
A: 订单会失败(废单)。系统会检测到可用今仓不足,不会去动用昨仓。
Q: order_value 和 order_target_value 支持平今仓吗?
A: 支持。所有的下单函数(order, order_target, order_value, order_target_value)都支持 close_today 参数。
Q: 郑商所(XZCE)和大商所(XDCE)如何指定平今?
A: 这两个交易所的交易规则通常是“先开先平”(FIFO),不支持显式指定平今或平昨。在聚宽中对这两个交易所的标的下单时,建议不要设置 close_today 参数(使用默认值),系统和柜台会按照交易所规则自动处理。