🚀 AI 一键生成 ptrade 策略代码

PTrade 策略中如何查询已下单委托的状态和成交记录?

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

问题描述

下单之后,我如何查询这个订单是成交了、还在挂单中,还是已经撤销了?以及如何查看当天的所有成交记录?

解决方案

在PTrade中,查询订单状态和成交记录主要依赖于 get_orderget_open_ordersget_trades 这几个API函数。

以下是具体的实现方法和代码示例:

1. 查询特定订单的状态

当你调用 order 系列函数(如 order, order_target, order_value 等)下单时,函数会返回一个 order_id(字符串)。你可以使用这个ID通过 get_order(order_id) 获取订单对象,并查看其 status 属性。

订单状态 (status) 对照表:

  • '0': 未报
  • '1': 待报
  • '2': 已报 (挂单中)
  • '4': 部成待撤
  • '5': 部撤 (部分成交,剩余部分已撤销)
  • '6': 已撤 (全部撤销)
  • '7': 部成 (部分成交,剩余部分还在挂单)
  • '8': 已成 (全部成交)
  • '9': 废单

2. 查询当前挂单(未完成订单)

如果你想查看当前还有哪些订单是“挂单中”或“部分成交”但未完全结束的,可以使用 get_open_orders()

3. 查询当天的成交记录

要查看当天所有的成交明细(包括一笔委托分多笔成交的情况),可以使用 get_trades()


综合代码示例

以下策略代码展示了如何下单,随后查询该订单状态,以及如何获取当天的未完成订单和成交记录。

def initialize(context):
    # 设置股票池
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 1. 下单并获取 order_id
    # 示例:以限价方式买入,方便演示挂单状态(如果价格设置得低)或成交状态
    # 注意:回测中如果价格满足会立即成交
    current_price = data[g.security]['close']
    # 这里为了演示,以当前价下单
    order_id = order(g.security, 100, limit_price=current_price)
    
    if order_id is None:
        log.info("下单失败")
        return

    log.info("下单成功,订单ID: %s" % order_id)

    # 2. 查询特定订单状态
    # 注意:在回测模式下,order函数调用后订单通常会立即处理。
    # 在实盘中,可能需要稍作等待或在下一个handle_data周期查询。
    ord_obj = get_order(order_id)
    
    if ord_obj is not None:
        # 打印订单状态
        status_desc = get_status_description(ord_obj.status)
        log.info("订单 %s 当前状态: %s (%s)" % (order_id, ord_obj.status, status_desc))
        
        # 如果订单已成交或部成,查看成交数量
        log.info("已成交数量: %s" % ord_obj.filled)

    # 3. 查询当前所有未完成的订单 (挂单)
    open_orders = get_open_orders()
    log.info("当前未完成订单数量: %s" % len(open_orders))
    for open_ord in open_orders:
        log.info("挂单ID: %s, 标的: %s, 未成交数量: %s" % (open_ord.id, open_ord.symbol, open_ord.amount - open_ord.filled))

    # 4. 查询当日所有成交记录
    # 返回的是一个字典,key是订单ID,value是成交明细列表
    trades = get_trades()
    if len(trades) > 0:
        log.info("今日成交记录如下:")
        for oid, trade_list in trades.items():
            for trade in trade_list:
                # trade结构: [成交编号, 委托编号, 标的代码, 买卖类型, 成交数量, 成交价格, 成交金额, 成交时间]
                log.info("订单ID: %s, 成交价格: %s, 成交数量: %s" % (oid, trade[5], trade[4]))

# 辅助函数:将状态码转换为中文描述
def get_status_description(status_code):
    status_dict = {
        '0': "未报",
        '1': "待报",
        '2': "已报(挂单中)",
        '3': "已报待撤",
        '4': "部成待撤",
        '5': "部撤",
        '6': "已撤",
        '7': "部成(挂单中)",
        '8': "已成",
        '9': "废单"
    }
    return status_dict.get(status_code, "未知状态")

关键点总结

  1. get_order(order_id): 用于追踪单笔委托的生命周期,通过 .status 判断是否成交或撤单。
  2. get_open_orders(): 用于风控或策略逻辑,判断当前是否还有未完成的敞口。
  3. get_trades(): 用于盘后结算或资金管理,获取确切的成交数据(价格、数量、金额)。注意,一笔 order 可能会对应 get_trades 返回列表中的多条成交记录(分笔成交)。