问题描述
使用 get_trade_detail_data(C.accountid, 'CREDIT', 'deal')查询交易,没有查询到手机 APP 操作下单卖出的交易单,在 QMT 中程序触发的则可以查询出来?
解决方案
在 QMT 量化平台中,使用 get_trade_detail_data 函数查询交易明细时,默认情况下可能无法获取到通过手机 APP、PC 独立交易软件等“外部终端”下的订单。这主要是由 QMT 的底层数据同步机制决定的。
为什么查不到手机 APP 的订单?
- 本地缓存机制:
get_trade_detail_data函数是从 QMT 客户端本地的内存/数据库中读取交易数据的,而不是每次调用都直接向券商柜台发起实时查询。QMT 程序自己触发的订单会直接记录在本地,因此可以立即查到。 - 外部交易未同步:手机 APP 下单是直接发送给券商柜台的。如果 QMT 客户端没有开启“同步外部交易”的功能,或者没有接收到柜台的订单状态推送,本地数据库就不会有这笔交易的记录。
- 主推订阅缺失:如果没有在策略初始化时正确订阅该账号的交易主推,QMT 也无法实时获取柜台的外部成交回报。
解决办法
要让 QMT 能够查询到手机 APP 的下单记录,请按照以下步骤进行排查和设置:
1. 在 QMT 终端开启“同步外部交易”
这是最常见的原因。您需要检查 QMT 客户端的系统设置:
- 打开 QMT 终端,进入 系统设置 -> 交易设置。
- 找到 外部交易同步 或类似的选项(不同券商版本的 QMT 界面可能略有差异),勾选允许同步外部终端的委托和成交数据。
- 开启后,QMT 会定期或通过主推接收柜台的其他终端交易数据。
2. 在策略中正确订阅账号主推
确保在策略的 init 函数中调用了 set_account,这样 QMT 才会订阅该账号的实时交易回报(包括外部交易的回报)。
def init(ContextInfo):
# 绑定并订阅资金账号的交易主推
ContextInfo.set_account(ContextInfo.accountid)
3. 检查函数调用参数
您使用的调用方式是 get_trade_detail_data(C.accountid, 'CREDIT', 'deal'),这是正确的(未传入 strategyName)。
注意:如果传入了第四个参数 strategyName,函数会严格过滤出该策略名称下的订单。手机 APP 下单没有策略名称,如果带了该参数则绝对查不到。您目前没有带此参数,做法是正确的。
4. 手动刷新客户端数据
如果在盘中手机 APP 下了单,且 QMT 客户端由于网络原因没有收到推送,您可以尝试在 QMT 交易界面的“委托”或“成交”列表中点击刷新按钮,强制从柜台拉取最新数据。拉取到本地后,代码中再次调用 get_trade_detail_data 即可查到。
总结
QMT 的 get_trade_detail_data 依赖于本地客户端的数据完整性。只要确保 QMT 客户端开启了外部交易同步,并在代码中通过 set_account 订阅了账号,手机 APP 的交易记录同样可以通过该函数查询到。