🚀 AI 一键生成 ptrade 策略代码

PTrade 平台如何进行期货交易?(buy_open, sell_open, sell_close, buy_close)

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

问题描述

我想用代码交易期货,请问怎么实现买入开仓、卖出开仓以及对应的平仓操作?

解决方案

在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)
    • 平掉空头头寸。

注意:所有函数中的 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)

关键点说明

  1. 平今仓与平昨仓 (close_today):

    • 参数 close_todaysell_closebuy_close 中使用。
    • close_today=False (默认): 优先平昨仓(历史持仓),如果昨仓不够,再平今仓(当日新开的仓位)。适用于大多数交易所。
    • close_today=True: 平今仓。这主要针对上海期货交易所 (XSGE) 的品种(如螺纹钢 RB、铜 CU 等),因为上期所对平今仓和平昨仓的手续费规定可能不同,且必须明确指定。其他交易所通常不需要设置为 True。
  2. 持仓方向:

    • 在股票中,get_position(security).amount 代表持仓量。
    • 在期货中,必须区分多空:
      • position.long_amount: 多头持仓数量。
      • position.short_amount: 空头持仓数量。
  3. 限价单 (limit_price):

    • 上述示例中未传递 limit_price,系统会默认使用当前行情快照的最新价或对手价(取决于回测/实盘设置)进行报单。
    • 如果需要指定价格,可以传入:buy_open(g.security, 1, limit_price=3500.0)
    • 注意: 期货价格变动有最小跳动单位(如沪深300是0.2点,螺纹钢是1元),传入的价格最好符合跳动规则,否则可能被柜台拒绝或自动调整。
  4. 合约代码:

    • 期货合约有到期日,代码会随时间变化(如 IF2312 代表2023年12月交割)。
    • 在编写长期策略时,通常需要逻辑来自动切换主力合约(PTrade API 提供了获取主力合约的功能,或者手动维护合约列表)。
  5. Python 版本兼容性:

    • PTrade 环境通常支持 Python 3,但为了兼容性,代码中避免了 f-string 等较新的语法,使用了 % 格式化字符串进行日志输出。