问题描述
解决方案
在 JoinQuant 聚宽平台中,如果您想要查看今天成交的订单的具体成交时间、成交价格以及成交数量,最直接的方法是使用 get_trades() 函数。
该函数返回当天所有的成交记录(Trade对象)。需要注意的是,一个订单(Order)可能会分多次成交,get_trades() 会返回每一次具体的成交详情。
代码实现
您可以在策略的 handle_data 或 after_trading_end 函数中调用此代码来打印当天的成交详情。
# -*- coding: utf-8 -*-
def after_trading_end(context):
# 获取当天的所有成交记录
trades = get_trades()
log.info("------------------- 今日成交记录 -------------------")
# get_trades返回的是一个dict,key是trade_id,value是Trade对象
for trade in trades.values():
# 打印具体信息
log.info("订单ID: %s" % trade.order_id)
log.info("标的: %s" % trade.security)
log.info("成交时间: %s" % trade.time)
log.info("成交价格: %s" % trade.price)
log.info("成交数量: %s" % trade.amount)
log.info("--------------------------------------------------")
关键对象说明
get_trades() 返回的字典中包含 Trade 对象,该对象的主要属性如下:
trade.time: 具体的成交时间(datetime.datetime对象)。trade.price: 该笔成交的执行价格。trade.amount: 该笔成交的数量(正数)。trade.security: 对应的标的代码。trade.trade_id: 唯一的成交记录ID。trade.order_id: 对应的订单ID(可以通过此ID关联到原始订单)。
补充说明:get_orders() 与 get_trades() 的区别
get_orders(): 获取当天的订单信息。如果一个订单只成交了一部分,或者分多次成交,Order 对象中的price属性通常显示的是平均成交价,filled显示的是累计成交数量。get_trades(): 获取当天的成交流水。如果您的一个大单被拆分成 5 笔小单成交,这里会显示 5 条记录,每条记录都有精确的时间和当时的价格。
如果您需要精确到“具体的成交时间和价格”,请务必使用 get_trades()。
Q&A
Q: get_trades() 能获取历史日期的成交记录吗?
A: 不能。get_trades() 仅返回回测或模拟交易当天的成交记录。如果需要分析历史成交,需要在回测过程中每天通过 after_trading_end 将数据记录到全局变量或写入文件中,或者在回测结束后查看回测详情页的“交易详情”列表。
Q: 为什么我下了单,但是 get_trades() 返回是空的?
A: 这通常意味着订单尚未成交。可能原因包括:订单未满足价格条件(限价单)、股票停牌、跌停无法卖出或涨停无法买入、或者资金/持仓不足导致废单。您可以配合 get_orders() 查看订单状态(status)是否为 open(未成交)或 rejected(已拒绝)。
Q: trade.amount 是正数还是负数?
A: 在 Trade 对象中,amount 通常为正数,表示成交的数量。要判断是买入还是卖出,需要通过关联的 order_id 获取 Order 对象,查看其 side('long'/'short')和 action('open'/'close')属性,或者查看 Order 对象的 is_buy 属性。