🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 平台期货交易指南:buy_open、sell_close 与平今仓(close_today)实战处理

ptrade | 发布时间: 2026/8/1
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 期货交易教程:buy_open、sell_close 与平今仓(close_today)逻辑

Question: ptrade 进行期货交易时,如何处理上期所等交易所的平今仓与平昨仓逻辑?

解决方案

ptrade 期货交易教程:buy_open、sell_close 与平今仓(close_today)逻辑

在 ptrade 量化平台中进行期货交易时,由于国内不同期货交易所对“平今仓”(平掉今日新开仓位)和“平昨仓”(平掉历史持仓)的手续费及规则设定不同(尤其是上海期货交易所 XSGE),策略编写时需要准确处理平仓逻辑。


一、 期货四大基础交易接口

ptrade 提供了专用的期货下单接口,用于明确区分多空方向和开平仓操作:

  1. buy_open(contract, amount, limit_price=None):买入开仓(多头开仓)
  2. sell_close(contract, amount, limit_price=None, close_today=False):卖出平仓(多头平仓)
  3. sell_open(contract, amount, limit_price=None):卖出开仓(空头开仓)
  4. buy_close(contract, amount, limit_price=None, close_today=False):买入平仓(空头平仓)

二、 平今仓(close_today)逻辑详解

1. close_today 参数作用

  • close_today=False(默认值):优先平昨仓,若昨仓不足再平今仓。
  • close_today=True:仅平今仓。若委托数量大于当前今仓数量,系统会自动调整委托数量为当前今仓数量。

2. 交易所差异与注意事项

  • 上海期货交易所(XSGE / 原油 INE 等):严格区分平今仓与平昨仓,且部分品种平今仓免收或高收手续费。在此类交易所平今仓时,必须指定 close_today=True
  • 其他交易所(CCFX、DCE、CZCE 等):默认不区分平今平昨,或者不支持显式平今。如果在非上期所合约中设置 close_today=True,ptrade 引擎会发出警告并强行转换为 close_today=False 运行。

三、 结合持仓对象(Position)精准平仓

通过 get_position(contract) 获取持仓对象时,可以读取以下期货专用字段:

  • today_long_amount:多头今仓数量
  • today_short_amount:空头今仓数量
  • long_amount:多头总持仓量
  • short_amount:空头总持仓量
  • long_enable_amount:多头可用数量
  • short_enable_amount:空头可用数量

四、 实战策略代码示例

以下示例展示了如何在 ptrade 中对沪铜(CU,上期所合约)进行平今仓与平昨仓的精准控制:

    g.security = 'CU2112.XSGE'
    set_universe(g.security)
    # 设置保证金比例与手续费(回测环境)
    set_margin_rate('CU', 0.08)
    set_future_commission('CU', 0.00004)

def handle_data(context, data):
    symbol = g.security
    pos = get_position(symbol)
    
    # 1. 假设触发买入开仓信号:开多仓 2 手
    if pos.amount == 0:
        buy_open(symbol, 2)
        log.info("买入开仓 2 手")
        return

    # 2. 假设触发平仓信号:优先平今仓,若无今仓则平昨仓
    # 平多仓逻辑处理
    if pos.long_amount > 0:
        if pos.today_long_amount > 0:
            # 存在今仓,执行平今仓
            sell_close(symbol, pos.today_long_amount, close_today=True)
            log.info("平今仓多头 %s 手" % pos.today_long_amount)
        else:
            # 不存在今仓,执行优先平昨
            sell_close(symbol, pos.long_amount, close_today=False)
            log.info("平昨仓多头 %s 手" % pos.long_amount)

五、 总结与最佳实践

  1. 下单价格处理:不同期货品种跳价精度不同,建议传入符合交易所最小变动价位的 limit_price,若留空默认使用快照最新价。
  2. 跨日持仓平仓:隔日交易时,上一交易日的开仓均转为昨仓,此时对上期所合约平仓应确保 close_today=False
  3. 挂单未成交保护:每天收盘时系统会自动撤销未成交订单,建议在策略平仓前先通过 get_open_orders() 检查并撤销挂单,避免冻结可用持仓。