问题描述
解决方案
在PTrade中交易期货,主要使用以下四个核心函数来实现开仓和平仓操作。与股票交易不同,期货交易需要明确区分“开仓”和“平仓”,以及“多头”和“空头”方向。
核心函数说明
- 买入开仓 (做多):
buy_open(contract, amount, limit_price=None)- 建立多头头寸(看涨)。
- 卖出平仓 (平多):
sell_close(contract, amount, limit_price=None, close_today=False)- 平掉多头头寸。
- 卖出开仓 (做空):
sell_open(contract, amount, limit_price=None)- 建立空头头寸(看跌)。
- 买入平仓 (平空):
buy_close(contract, amount, limit_price=None, close_today=False)- 平掉空头头寸。
注意:所有函数中的 amount(数量)必须为正整数。
完整策略代码示例
以下是一个完整的策略示例,展示了如何设置期货费率、保证金,并根据简单的均线逻辑进行多空交易及平仓操作。
def initialize(context):
# 1. 设置期货合约代码 (此处以中金所沪深300股指期货为例)
# 注意:实盘或回测时请确保合约代码在当前时间段内有效
g.security = 'IF2312.CCFX'
# 2. 设置股票池
set_universe(g.security)
# 3. 设置期货保证金比例 (可选,仅回测有效)
# 设置IF品种的保证金比例为10%
set_margin_rate('IF', 0.10)
# 4. 设置期货手续费 (可选,仅回测有效)
# 设置IF品种的手续费为万分之0.23
set_future_commission('IF', 0.000023)
def handle_data(context, data):
# 获取当前合约代码
security = g.security
# 获取过去5根分钟K线的收盘价 (假设回测频率为分钟)
# 为了计算指标,建议在get_history中获取足够的数据
history = get_history(6, '1m', 'close', security)
if len(history) < 6:
return
close_prices = history['close'].values
current_price = close_prices[-1]
# 计算简单均线 (MA5)
ma5 = close_prices[-5:].mean()
# 获取当前持仓信息
position = get_position(security)
# 获取多头和空头持仓数量
long_amount = position.long_amount # 多头持仓
short_amount = position.short_amount # 空头持仓
# ---------------------------------------------------
# 交易逻辑示例
# ---------------------------------------------------
# 策略逻辑:价格高于均线做多,价格低于均线做空
# 【情况1:价格高于均线】
if current_price > ma5:
# 如果持有空单,先平空 (买入平仓)
if short_amount > 0:
log.info("价格高于均线,平空单")
# close_today=False 表示优先平昨仓,不足再平今仓
# 如果是上期所(XSGE)品种且需要优先平今,需设为True
buy_close(security, short_amount, close_today=False)
# 如果没有多单,则开多 (买入开仓)
if long_amount == 0:
log.info("价格高于均线,开多单")
buy_open(security, 1)
# 【情况2:价格低于均线】
elif current_price < ma5:
# 如果持有多单,先平多 (卖出平仓)
if long_amount > 0:
log.info("价格低于均线,平多单")
sell_close(security, long_amount, close_today=False)
# 如果没有空单,则开空 (卖出开仓)
if short_amount == 0:
log.info("价格低于均线,开空单")
sell_open(security, 1)
关键点说明
-
平今仓与平昨仓 (
close_today):- 参数
close_today在sell_close和buy_close中使用。 close_today=False(默认): 优先平昨仓(历史持仓),如果昨仓不够,再平今仓(当日新开的仓位)。适用于大多数交易所。close_today=True: 仅平今仓。这主要针对上海期货交易所 (XSGE) 的品种(如螺纹钢 RB、铜 CU 等),因为上期所对平今仓和平昨仓的手续费规定可能不同,且必须明确指定。其他交易所通常不需要设置为 True。
- 参数
-
持仓方向:
- 在股票中,
get_position(security).amount代表持仓量。 - 在期货中,必须区分多空:
position.long_amount: 多头持仓数量。position.short_amount: 空头持仓数量。
- 在股票中,
-
限价单 (
limit_price):- 上述示例中未传递
limit_price,系统会默认使用当前行情快照的最新价或对手价(取决于回测/实盘设置)进行报单。 - 如果需要指定价格,可以传入:
buy_open(g.security, 1, limit_price=3500.0)。 - 注意: 期货价格变动有最小跳动单位(如沪深300是0.2点,螺纹钢是1元),传入的价格最好符合跳动规则,否则可能被柜台拒绝或自动调整。
- 上述示例中未传递
-
合约代码:
- 期货合约有到期日,代码会随时间变化(如
IF2312代表2023年12月交割)。 - 在编写长期策略时,通常需要逻辑来自动切换主力合约(PTrade API 提供了获取主力合约的功能,或者手动维护合约列表)。
- 期货合约有到期日,代码会随时间变化(如
-
Python 版本兼容性:
- PTrade 环境通常支持 Python 3,但为了兼容性,代码中避免了 f-string 等较新的语法,使用了
%格式化字符串进行日志输出。
- PTrade 环境通常支持 Python 3,但为了兼容性,代码中避免了 f-string 等较新的语法,使用了