问题描述
解决方案
在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("当日暂无任何委托记录。")
关键说明
-
适用环境:
get_all_orders()仅在交易模块(实盘或仿真交易)可用。在回测模式下,由于不存在“外部下单”的概念,该函数通常无法调用或无法返回预期数据。 -
返回数据格式:
与get_orders()返回Order对象列表不同,get_all_orders()返回的是一个 字典列表 (list[dict])。- 常用字段:
entrust_no: 委托编号symbol: 股票代码amount: 委托数量price: 委托价格status: 委托状态(如 '2' 代表已报,'8' 代表已成,具体参考API文档数据字典)filled_amount: 成交数量
- 常用字段:
-
撤单操作:
如果您想撤销通过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 接口。