问题描述
解决方案
在PTrade中,查询订单状态和成交记录主要依赖于 get_order、get_open_orders 和 get_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, "未知状态")
关键点总结
get_order(order_id): 用于追踪单笔委托的生命周期,通过.status判断是否成交或撤单。get_open_orders(): 用于风控或策略逻辑,判断当前是否还有未完成的敞口。get_trades(): 用于盘后结算或资金管理,获取确切的成交数据(价格、数量、金额)。注意,一笔order可能会对应get_trades返回列表中的多条成交记录(分笔成交)。