3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化交易平台中,对上海期货交易所(XSGE)、上海国际能源交易中心(XINE)以及中国金融期货交易所(CCFX)的期货合约进行交易时,区分**平今仓(平当天开的仓位)和平昨仓(平历史持有的仓位)**非常重要。由于上期所等交易所对平今仓和平昨仓收取的手续费率不同(例如部分品种平今仓免手续费或高额手续费),正确设置交易参数是策略成本控制的关键。
LimitOrderStyle(limit_price)LimitOrderStyle(3600.0) 表示以 3600.0 的价格提交限价委托。close_today 参数close_today=True:只平今仓。若当前持有的今仓数量不足,订单将被直接废单(拒绝)。close_today=False(默认):优先平昨仓,昨仓不足的部分再平今仓。注意:
close_today字段仅对上海国际能源中心(XINE)、上海期货交易所(XSGE)、中金所(CCFX)生效。如果在其他不支持区分平今/平昨的交易所标的上设置,系统将会报错。
以螺纹钢期货合约(如 RB1909.XSGE)为例,以下代码展示了如何在 initialize 中初始化期货账户,并在平仓时结合 LimitOrderStyle 与 close_today=True 提交限价平今单:
import jqdata
def initialize(context):
# 1. 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 2. 必须开启动态复权模式
set_option('use_real_price', True)
# 3. 设置策略子账户为期货账户
init_cash = context.portfolio.starting_cash
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
# 4. 设置交易运行时间及参考标的
run_daily(market_open, time='every_bar', reference_security='RB9999.XSGE')
def market_open(context):
security = 'RB1909.XSGE'
pindex = 0
# 假设需要对多单进行限价平今仓挂单
# 目标:平掉 1 手多单,指定限价为 3700.0,且只平今仓
limit_price = 3700.0
# 检查当前多仓今仓数量(today_amount)是否足够
long_positions = context.subportfolios[pindex].long_positions
if security in long_positions:
position = long_positions[security]
if position.today_amount >= 1:
# 下单平今仓多单
order(
security=security,
amount=-1, # 卖出平仓,数量为负数
style=LimitOrderStyle(limit_price), # 设置限价单风格
side='long', # 操作多单仓位
pindex=pindex, # 子账户仓位索引
close_today=True # 开启平今字段
)
log.info("提交限价平今仓订单:%s, 价格: %f" % (security, limit_price))
除了 order 按手数下单 API 外,JoinQuant 提供的其他下单 API 均支持 style 和 close_today 参数:
| API 函数 | 作用描述 | 限价平今仓调用示例 | 说明 |
|---|---|---|---|
order() |
按指定手数下单 | order('RB1909.XSGE', -1, LimitOrderStyle(3700), side='long', close_today=True) |
amount < 0 表示平仓 |
order_target() |
目标手数下单 | order_target('RB1909.XSGE', 0, LimitOrderStyle(3700), side='long', close_today=True) |
将多头持仓平至 0 手 |
order_value() |
按保证金金额下单 | order_value('RB1909.XSGE', -50000, LimitOrderStyle(3700), side='long', close_today=True) |
平掉指定保证金价值的仓位 |
order_target_value() |
目标保证金下单 | order_target_value('RB1909.XSGE', 0, LimitOrderStyle(3700), side='long', close_today=True) |
将多头保证金调整至 0 |
close_today=True 前,务必确认当前持仓对象的 today_amount(今日开仓数)大等于待平仓数量,否则订单将被交易所或回测撮合引擎判定为废单(Rejected)。order_target 或 order_target_value 会自动撤销该标的先前未完成的订单。OrderCost 中设置的 close_commission(平昨)与 close_today_commission(平今)费率。