🚀 AI 一键生成 ptrade 策略代码

PTrade 期货策略:如何正确使用 close_today 参数实现平今仓?

ptrade | 发布时间: 2025/12/3
以下内容由 EasyQuant 生成。

问题描述

我今天开的期货仓位想在今天就平掉,应该怎么操作?

解决方案

在PTrade中,如果您想平掉今日新开的期货仓位(即“平今仓”),需要使用平仓函数 sell_close(卖出平多)或 buy_close(买入平空),并将参数 close_today 设置为 True

核心操作说明

  1. 平多头(原持有买单,现在卖出平仓):
    使用 sell_close(contract, amount, close_today=True)
  2. 平空头(原持有卖单,现在买入平仓):
    使用 buy_close(contract, amount, close_today=True)

关键参数 close_today

  • close_today=True仅平今仓。系统会强制平掉今日新开的仓位。如果今日仓位不足,可能会报错或根据交易所规则处理。
    • 注意:此参数主要对上海期货交易所 (XSGE)上海国际能源交易中心 (INE) 有效,因为这些交易所严格区分“平今”和“平昨”,且手续费标准可能不同。
    • 对于其他交易所(如中金所、大商所、郑商所),通常遵循“先开先平”原则,PTrade文档指出若在非上期所品种使用 True 可能会警告并强制转为 False,但在逻辑上如果您只有今日仓位,默认方式也能平掉。
  • close_today=False (默认)优先平昨仓。系统会优先平掉昨日(或更早)持有的历史仓位,如果昨仓不足,再平今日仓位。

策略代码示例

以下是一个完整的策略示例,展示了如何在开仓后,显式地指定平掉今日的仓位。

def initialize(context):
    # 设置关注的期货合约,这里以上海期货交易所的沪铜为例
    # 注意:上期所品种严格区分平今和平昨
    g.future = 'CU2306.XSGE' 
    set_universe([g.future])
    
    # 设置标志位,用于控制开平仓逻辑
    g.has_opened = False

def handle_data(context, data):
    # 获取当前时间
    current_hour = context.blotter.current_dt.hour
    current_minute = context.blotter.current_dt.minute
    
    # ---------------------------------------------------
    # 1. 上午 10:00 开仓(买入开仓 / 多开)
    # ---------------------------------------------------
    if current_hour == 10 and current_minute == 0 and not g.has_opened:
        #以此为例:买入开仓 2 手
        order_id = buy_open(g.future, 2)
        if order_id:
            log.info("上午10点:买入开仓(多开)2手 %s" % g.future)
            g.has_opened = True
            
    # ---------------------------------------------------
    # 2. 下午 14:30 平掉今日仓位(卖出平今 / 多平)
    # ---------------------------------------------------
    if current_hour == 14 and current_minute == 30 and g.has_opened:
        # 获取当前持仓对象
        position = get_position(g.future)
        
        # 检查多头持仓量
        if position.long_amount > 0:
            # 【关键操作】使用 close_today=True 强制平今仓
            # sell_close 用于平多头
            sell_close(g.future, 2, close_today=True)
            
            log.info("下午14点30分:强制平今仓(多平)2手 %s" % g.future)
            g.has_opened = False

    # ---------------------------------------------------
    # 补充:如果是做空(卖出开仓),平仓时使用 buy_close
    # ---------------------------------------------------
    # 假设之前是 sell_open(g.future, 2),则平今仓代码如下:
    # buy_close(g.future, 2, close_today=True)

总结

要在PTrade中实现“平今仓”操作,请遵循以下规则:

  1. 确认您的开仓方向:
    • 如果是多单(买入开仓),用 sell_close
    • 如果是空单(卖出开仓),用 buy_close
  2. 务必在函数中传入 close_today=True

Q&A 常见问题解答

Q1: 如果我在非上海期货交易所(如大商所)的品种上使用 close_today=True 会怎样?
A: 根据PTrade文档,对于不支持严格区分平今/平昨指令的交易所,系统可能会发出警告,并将参数强制转换为 False(即优先平昨)。但如果您账户里只有今天开的仓位,没有历史老仓,那么无论设为 True 还是 False,效果都是平掉今天的仓位。

Q2: 为什么要区分平今和平昨?
A: 主要是因为手续费不同。特别是在上海期货交易所,某些品种的“平今仓”手续费可能比“平昨仓”贵很多(为了抑制日内过度投机),或者在某些特殊时期反而免费。在策略中明确指定 close_today 可以帮助您更精确地控制交易成本和逻辑。

Q3: 如果我既有昨仓又有今仓,想全部平掉怎么办?
A: 您可以分两步下单,或者直接使用 close_today=False(默认值)并输入总数量。系统会先平掉昨仓,剩下的数量自动平掉今仓。但如果您只想平今仓而保留昨仓,则必须使用 close_today=True