问题描述
解决方案
在PTrade中,如果您想平掉今日新开的期货仓位(即“平今仓”),需要使用平仓函数 sell_close(卖出平多)或 buy_close(买入平空),并将参数 close_today 设置为 True。
核心操作说明
- 平多头(原持有买单,现在卖出平仓):
使用sell_close(contract, amount, close_today=True) - 平空头(原持有卖单,现在买入平仓):
使用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中实现“平今仓”操作,请遵循以下规则:
- 确认您的开仓方向:
- 如果是多单(买入开仓),用
sell_close。 - 如果是空单(卖出开仓),用
buy_close。
- 如果是多单(买入开仓),用
- 务必在函数中传入
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。