🚀 AI 一键生成 ptrade 策略代码

如何在 PTrade 中查询当日全部委托?get_all_orders 与 cancel_order_ex 函数详解

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

问题描述

怎样查询我这个账户今天所有的委托单,包括其他地方下的单?

解决方案

在PTrade中,如果您需要查询账户当日所有的委托单,包括手动下单或其他策略产生的委托,必须使用 get_all_orders 函数。

常规的 get_orders() 函数通常只能获取当前策略产生的订单,而 get_all_orders() 则是专门用于获取账户层级当日全部委托记录的接口。

核心代码实现

以下是一个完整的策略示例,展示如何在盘中获取并打印账户当日的所有委托单信息:

def initialize(context):
    # 初始化设置,这里设置一个示例股票
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 仅在交易模式(实盘或仿真)下调用,回测模式下该函数不可用或无意义
    # get_all_orders() 获取账户当日所有订单(包含非本交易的订单记录)
    all_orders = get_all_orders()
    
    if all_orders:
        log.info("查询到当日共有 %s 笔委托:" % len(all_orders))
        for order_item in all_orders:
            # 打印每一笔订单的关键信息
            # 注意:get_all_orders 返回的是字典列表,不是Order对象
            log.info("委托编号: %s, 股票代码: %s, 委托数量: %s, 委托价格: %s, 状态: %s" % (
                order_item.get('entrust_no'),
                order_item.get('symbol'),
                order_item.get('amount'),
                order_item.get('price'),
                order_item.get('status')
            ))
    else:
        log.info("当日暂无任何委托记录。")

关键说明

  1. 适用环境
    get_all_orders() 仅在交易模块(实盘或仿真交易)可用。在回测模式下,由于不存在“外部下单”的概念,该函数通常无法调用或无法返回预期数据。

  2. 返回数据格式
    get_orders() 返回 Order 对象列表不同,get_all_orders() 返回的是一个 字典列表 (list[dict])

    • 常用字段
      • entrust_no: 委托编号
      • symbol: 股票代码
      • amount: 委托数量
      • price: 委托价格
      • status: 委托状态(如 '2' 代表已报,'8' 代表已成,具体参考API文档数据字典)
      • filled_amount: 成交数量
  3. 撤单操作
    如果您想撤销通过 get_all_orders() 查询到的非本策略产生的订单,不能使用普通的 cancel_order(),而必须使用 cancel_order_ex(order_param),其中 order_param 就是 get_all_orders 返回列表中的那个字典对象。

常见问题 Q&A

Q: get_orders()get_all_orders() 有什么区别?
A: get_orders() 仅返回当前策略代码运行产生的订单对象;而 get_all_orders() 返回该资金账号下当日所有的委托记录,包含手动下单、其他终端下单或其他策略下单的记录。

Q: 为什么我在回测中调用 get_all_orders() 报错或为空?
A: 该接口设计用于实盘交互,仅在交易模块可用。回测环境是一个封闭的沙箱,不存在“外部订单”,因此不支持此功能。

Q: 如何撤销通过 get_all_orders() 查到的外部订单?
A: 需要使用 cancel_order_ex() 函数。例如:

orders = get_all_orders()
for order in orders:
    # 撤销所有未成交的外部订单
    if order['status'] in ['2', '7']: # 2:已报, 7:部成
        cancel_order_ex(order)

Q: get_all_orders 能查询到历史日期的委托吗?
A: 不能。该接口仅用于获取账户当日的全部委托记录。如果需要查询历史交割单,请使用 get_deliver 接口。