🚀 AI 一键生成 ptrade 策略代码

PTrade 平台如何进行买卖下单和撤单操作?(order, cancel_order)

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

问题描述

我想学习如何通过代码进行股票买卖,比如买入100股或者卖出到指定持仓,以及如何取消一个挂单?

解决方案

您好!在 PTrade 量化交易平台中,进行股票买卖和撤单主要依赖于 order 系列函数和 cancel_order 函数。

以下是针对您需求的详细说明和代码示例。

核心函数说明

  1. 按数量买卖 (order)

    • 功能:买入或卖出指定数量的股票。
    • 用法order(security, amount, limit_price=None)
    • 参数
      • amount:正数代表买入(如 100),负数代表卖出(如 -100)。
      • limit_price:可选。如果不填,则按市价(回测中通常是收盘价或开盘价,实盘为最新价)下单;如果填了,则是限价单。
  2. 调整至目标持仓 (order_target)

    • 功能:自动计算买卖数量,使持仓调整到指定的目标数量。
    • 用法order_target(security, amount, limit_price=None)
    • 场景:比如您当前持有 500 股,想减仓到 200 股,直接调用 order_target(security, 200),系统会自动卖出 300 股。如果想清仓,则设为 0。
  3. 取消订单 (cancel_order)

    • 功能:取消尚未成交的挂单。
    • 用法cancel_order(order_id)
    • 前提:需要获取下单时返回的 order_id,或者通过 get_open_orders() 获取未完成的订单对象。

完整策略代码示例

您可以将以下代码复制到 PTrade 的策略编辑区进行回测或模拟运行。

def initialize(context):
    # 初始化设置
    g.security = '600570.SS' # 设置我们要操作的股票:恒生电子
    set_universe(g.security) # 设置股票池
    
    # 设置一个标志位,用于演示流程控制
    g.step = 0

def handle_data(context, data):
    # 获取当前股票代码
    security = g.security
    
    # ---------------------------------------------------
    # 场景 1:买入指定数量 (例如买入 100 股)
    # ---------------------------------------------------
    if g.step == 0:
        log.info("步骤1:尝试买入 100 股")
        # 下单买入 100 股,不设限价(市价单)
        order(security, 100)
        
        g.step = 1 # 进入下一步
        
    # ---------------------------------------------------
    # 场景 2:演示挂单与撤单
    # ---------------------------------------------------
    elif g.step == 1:
        log.info("步骤2:演示挂单与撤单")
        
        # 获取当前价格
        current_price = data[security]['close']
        # 故意以一个极低的价格买入,形成“未成交”的挂单
        limit_price = current_price * 0.9 
        
        # order 函数会返回一个 order_id
        order_id = order(security, 100, limit_price=limit_price)
        log.info("已下限价单,订单ID: %s,价格: %s" % (order_id, limit_price))
        
        # 立即撤销刚才下的这笔订单
        if order_id is not None:
            cancel_order(order_id)
            log.info("已请求撤销订单: %s" % order_id)
            
        g.step = 2 # 进入下一步

    # ---------------------------------------------------
    # 场景 3:调整持仓到指定数量 (例如清仓/卖出到0)
    # ---------------------------------------------------
    elif g.step == 2:
        # 获取当前持仓信息
        position = get_position(security)
        log.info("当前持仓数量: %s" % position.amount)
        
        if position.amount > 0:
            log.info("步骤3:触发清仓操作,目标持仓为 0")
            # 无论当前有多少股,直接调整目标持仓为 0,系统会自动计算卖出数量
            order_target(security, 0)
        
        g.step = 3 # 演示结束

    # 打印当前持仓情况
    pos = get_position(security)
    log.info("当前持仓状态 -> 股票: %s, 数量: %s, 成本: %s" % (pos.sid, pos.amount, pos.cost_basis))

代码关键点解析

  1. order(security, 100):

    • 这是最基础的下单指令。
    • 注意:A股买入必须是 100 的整数倍(1手)。
  2. order_target(security, 0):

    • 非常实用的函数。如果您想卖出所有持仓,不需要先查询当前有多少股再填入 order 的负数,直接用 order_target 设为 0 即可。
    • 同理,如果您想加仓到固定仓位(例如总共想持有 1000 股,不管现在有 0 股还是 500 股),也可以直接写 order_target(security, 1000)
  3. cancel_order(order_id):

    • 在实盘或模拟交易中,下单后如果价格未达到限价,订单会处于“已报”或“待报”状态。此时可以使用此函数撤单。
    • 在回测中,如果使用市价单通常会立即成交,无法撤单;只有使用限价单且价格未触发时才能撤单。
  4. get_position(security):

    • 用于查询当前的持仓详情,包含 amount (总持仓)、enable_amount (可用持仓) 等属性。

希望这个示例能帮助您理解 PTrade 的基础交易操作!如有其他问题,欢迎继续提问。